OLD | NEW |
1 # 2010 July 16 | 1 # 2010 July 16 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 # only evaluated once. | 840 # only evaluated once. |
841 # | 841 # |
842 db func x x | 842 db func x x |
843 proc x {} { incr ::xcount ; return [expr $::x] } | 843 proc x {} { incr ::xcount ; return [expr $::x] } |
844 foreach {tn x expr res nEval} { | 844 foreach {tn x expr res nEval} { |
845 1 10 "x() >= 5 AND x() <= 15" 1 2 | 845 1 10 "x() >= 5 AND x() <= 15" 1 2 |
846 2 10 "x() BETWEEN 5 AND 15" 1 1 | 846 2 10 "x() BETWEEN 5 AND 15" 1 1 |
847 | 847 |
848 3 5 "x() >= 5 AND x() <= 5" 1 2 | 848 3 5 "x() >= 5 AND x() <= 5" 1 2 |
849 4 5 "x() BETWEEN 5 AND 5" 1 1 | 849 4 5 "x() BETWEEN 5 AND 5" 1 1 |
| 850 |
| 851 5 9 "(x(),8) >= (9,7) AND (x(),8)<=(9,10)" 1 2 |
| 852 6 9 "(x(),8) BETWEEN (9,7) AND (9,10)" 1 1 |
850 } { | 853 } { |
851 do_test e_expr-13.1.$tn { | 854 do_test e_expr-13.1.$tn { |
852 set ::xcount 0 | 855 set ::xcount 0 |
853 set a [execsql "SELECT $expr"] | 856 set a [execsql "SELECT $expr"] |
854 list $::xcount $a | 857 list $::xcount $a |
855 } [list $nEval $res] | 858 } [list $nEval $res] |
856 } | 859 } |
857 | 860 |
858 # EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is | 861 # EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is |
859 # the same as the precedence as operators == and != and LIKE and groups | 862 # the same as the precedence as operators == and != and LIKE and groups |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1427 } {text UVU real 1.23 integer 4} | 1430 } {text UVU real 1.23 integer 4} |
1428 | 1431 |
1429 # EVIDENCE-OF: R-32434-09092 If the value of expr is NULL, then the | 1432 # EVIDENCE-OF: R-32434-09092 If the value of expr is NULL, then the |
1430 # result of the CAST expression is also NULL. | 1433 # result of the CAST expression is also NULL. |
1431 # | 1434 # |
1432 do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {} | 1435 do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {} |
1433 do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {} | 1436 do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {} |
1434 do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {} | 1437 do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {} |
1435 do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {} | 1438 do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {} |
1436 | 1439 |
| 1440 # EVIDENCE-OF: R-29283-15561 Otherwise, the storage class of the result |
| 1441 # is determined by applying the rules for determining column affinity to |
| 1442 # the type-name. |
| 1443 # |
| 1444 # The R-29283-15561 requirement above is demonstrated by all of the |
| 1445 # subsequent e_expr-26 tests. |
| 1446 # |
1437 # EVIDENCE-OF: R-43522-35548 Casting a value to a type-name with no | 1447 # EVIDENCE-OF: R-43522-35548 Casting a value to a type-name with no |
1438 # affinity causes the value to be converted into a BLOB. | 1448 # affinity causes the value to be converted into a BLOB. |
1439 # | 1449 # |
1440 do_expr_test e_expr-27.3.1 { CAST('abc' AS blob) } blob abc | 1450 do_expr_test e_expr-27.3.1 { CAST('abc' AS blob) } blob abc |
1441 do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def | 1451 do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def |
1442 do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10) } blob ghi | 1452 do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10) } blob ghi |
1443 | 1453 |
1444 # EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting | 1454 # EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting |
1445 # the value to TEXT in the encoding of the database connection, then | 1455 # the value to TEXT in the encoding of the database connection, then |
1446 # interpreting the resulting byte sequence as a BLOB instead of as TEXT. | 1456 # interpreting the resulting byte sequence as a BLOB instead of as TEXT. |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1776 sqlite3 db test.db | 1786 sqlite3 db test.db |
1777 do_test e_expr-35.0 { | 1787 do_test e_expr-35.0 { |
1778 execsql { | 1788 execsql { |
1779 CREATE TABLE t2(a, b); | 1789 CREATE TABLE t2(a, b); |
1780 INSERT INTO t2 VALUES('one', 'two'); | 1790 INSERT INTO t2 VALUES('one', 'two'); |
1781 INSERT INTO t2 VALUES('three', NULL); | 1791 INSERT INTO t2 VALUES('three', NULL); |
1782 INSERT INTO t2 VALUES(4, 5.0); | 1792 INSERT INTO t2 VALUES(4, 5.0); |
1783 } | 1793 } |
1784 } {} | 1794 } {} |
1785 | 1795 |
1786 # EVIDENCE-OF: R-00980-39256 A SELECT statement enclosed in parentheses | 1796 # EVIDENCE-OF: R-43573-23448 A SELECT statement enclosed in parentheses |
1787 # may appear as a scalar quantity. | 1797 # is a subquery. |
1788 # | 1798 # |
1789 # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including | 1799 # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including |
1790 # aggregate and compound SELECT queries (queries with keywords like | 1800 # aggregate and compound SELECT queries (queries with keywords like |
1791 # UNION or EXCEPT) are allowed as scalar subqueries. | 1801 # UNION or EXCEPT) are allowed as scalar subqueries. |
1792 # | 1802 # |
1793 do_expr_test e_expr-35.1.1 { (SELECT 35) } integer 35 | 1803 do_expr_test e_expr-35.1.1 { (SELECT 35) } integer 35 |
1794 do_expr_test e_expr-35.1.2 { (SELECT NULL) } null {} | 1804 do_expr_test e_expr-35.1.2 { (SELECT NULL) } null {} |
1795 | 1805 |
1796 do_expr_test e_expr-35.1.3 { (SELECT count(*) FROM t2) } integer 3 | 1806 do_expr_test e_expr-35.1.3 { (SELECT count(*) FROM t2) } integer 3 |
1797 do_expr_test e_expr-35.1.4 { (SELECT 4 FROM t2) } integer 4 | 1807 do_expr_test e_expr-35.1.4 { (SELECT 4 FROM t2) } integer 4 |
1798 | 1808 |
1799 do_expr_test e_expr-35.1.5 { | 1809 do_expr_test e_expr-35.1.5 { |
1800 (SELECT b FROM t2 UNION SELECT a+1 FROM t2) | 1810 (SELECT b FROM t2 UNION SELECT a+1 FROM t2) |
1801 } null {} | 1811 } null {} |
1802 do_expr_test e_expr-35.1.6 { | 1812 do_expr_test e_expr-35.1.6 { |
1803 (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1) | 1813 (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1) |
1804 } integer 4 | 1814 } integer 4 |
1805 | 1815 |
1806 # EVIDENCE-OF: R-46899-53765 A SELECT used as a scalar quantity must | 1816 # EVIDENCE-OF: R-22239-33740 A subquery that returns two or more columns |
1807 # return a result set with a single column. | 1817 # is a row value subquery and can only be used as the operand of a |
| 1818 # comparison operator. |
1808 # | 1819 # |
1809 # The following block tests that errors are returned in a bunch of cases | 1820 # The following block tests that errors are returned in a bunch of cases |
1810 # where a subquery returns more than one column. | 1821 # where a subquery returns more than one column. |
1811 # | 1822 # |
1812 set M {only a single result allowed for a SELECT that is part of an expression} | 1823 set M {/1 {sub-select returns [23] columns - expected 1}/} |
1813 foreach {tn sql} { | 1824 foreach {tn sql} { |
1814 1 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2) } | 1825 1 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2) } |
1815 2 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2 ORDER BY 1) } | 1826 2 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2 ORDER BY 1) } |
1816 3 { SELECT (SELECT 1, 2) } | 1827 3 { SELECT (SELECT 1, 2) } |
1817 4 { SELECT (SELECT NULL, NULL, NULL) } | 1828 4 { SELECT (SELECT NULL, NULL, NULL) } |
1818 5 { SELECT (SELECT * FROM t2) } | 1829 5 { SELECT (SELECT * FROM t2) } |
1819 6 { SELECT (SELECT * FROM (SELECT 1, 2, 3)) } | 1830 6 { SELECT (SELECT * FROM (SELECT 1, 2, 3)) } |
1820 } { | 1831 } { |
1821 do_catchsql_test e_expr-35.2.$tn $sql [list 1 $M] | 1832 do_catchsql_test e_expr-35.2.$tn $sql $M |
1822 } | 1833 } |
1823 | 1834 |
1824 # EVIDENCE-OF: R-35764-28041 The result of the expression is the value | 1835 # EVIDENCE-OF: R-18318-14995 The value of a subquery expression is the |
1825 # of the only column in the first row returned by the SELECT statement. | 1836 # first row of the result from the enclosed SELECT statement. |
1826 # | 1837 # |
1827 # EVIDENCE-OF: R-41898-06686 If the SELECT yields more than one result | 1838 # EVIDENCE-OF: R-15900-52156 In other words, an implied "LIMIT 1" is |
1828 # row, all rows after the first are ignored. | 1839 # added to the subquery, overriding an explicitly coded LIMIT. |
1829 # | 1840 # |
1830 do_execsql_test e_expr-36.3.1 { | 1841 do_execsql_test e_expr-36.3.1 { |
1831 CREATE TABLE t4(x, y); | 1842 CREATE TABLE t4(x, y); |
1832 INSERT INTO t4 VALUES(1, 'one'); | 1843 INSERT INTO t4 VALUES(1, 'one'); |
1833 INSERT INTO t4 VALUES(2, 'two'); | 1844 INSERT INTO t4 VALUES(2, 'two'); |
1834 INSERT INTO t4 VALUES(3, 'three'); | 1845 INSERT INTO t4 VALUES(3, 'three'); |
1835 } {} | 1846 } {} |
1836 | 1847 |
1837 foreach {tn expr restype resval} { | 1848 foreach {tn expr restype resval} { |
1838 2 { ( SELECT x FROM t4 ORDER BY x ) } integer 1 | 1849 2 { ( SELECT x FROM t4 ORDER BY x ) } integer 1 |
1839 3 { ( SELECT x FROM t4 ORDER BY y ) } integer 1 | 1850 3 { ( SELECT x FROM t4 ORDER BY y ) } integer 1 |
1840 4 { ( SELECT x FROM t4 ORDER BY x DESC ) } integer 3 | 1851 4 { ( SELECT x FROM t4 ORDER BY x DESC ) } integer 3 |
1841 5 { ( SELECT x FROM t4 ORDER BY y DESC ) } integer 2 | 1852 5 { ( SELECT x FROM t4 ORDER BY y DESC ) } integer 2 |
1842 6 { ( SELECT y FROM t4 ORDER BY y DESC ) } text two | 1853 6 { ( SELECT y FROM t4 ORDER BY y DESC ) } text two |
1843 | 1854 |
1844 7 { ( SELECT sum(x) FROM t4 ) } integer 6 | 1855 7 { ( SELECT sum(x) FROM t4 ) } integer 6 |
1845 8 { ( SELECT group_concat(y,'') FROM t4 ) } text onetwothree | 1856 8 { ( SELECT group_concat(y,'') FROM t4 ) } text onetwothree |
1846 9 { ( SELECT max(x) FROM t4 WHERE y LIKE '___') } integer 2 | 1857 9 { ( SELECT max(x) FROM t4 WHERE y LIKE '___') } integer 2 |
1847 | 1858 |
1848 } { | 1859 } { |
1849 do_expr_test e_expr-36.3.$tn $expr $restype $resval | 1860 do_expr_test e_expr-36.3.$tn $expr $restype $resval |
1850 } | 1861 } |
1851 | 1862 |
1852 # EVIDENCE-OF: R-25492-41572 If the SELECT yields no rows, then the | 1863 # EVIDENCE-OF: R-52325-25449 The value of a subquery expression is NULL |
1853 # value of the expression is NULL. | 1864 # if the enclosed SELECT statement returns no rows. |
1854 # | 1865 # |
1855 foreach {tn expr} { | 1866 foreach {tn expr} { |
1856 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } | 1867 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } |
1857 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) } | 1868 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) } |
1858 } { | 1869 } { |
1859 do_expr_test e_expr-36.4.$tn $expr null {} | 1870 do_expr_test e_expr-36.4.$tn $expr null {} |
1860 } | 1871 } |
1861 | 1872 |
1862 # EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0, | 1873 # EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0, |
1863 # 'english' and '0' are all considered to be false. | 1874 # 'english' and '0' are all considered to be false. |
(...skipping 28 matching lines...) Expand all Loading... |
1892 } {true} | 1903 } {true} |
1893 do_execsql_test e_expr-37.9 { | 1904 do_execsql_test e_expr-37.9 { |
1894 SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; | 1905 SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; |
1895 } {true} | 1906 } {true} |
1896 do_execsql_test e_expr-37.10 { | 1907 do_execsql_test e_expr-37.10 { |
1897 SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; | 1908 SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; |
1898 } {true} | 1909 } {true} |
1899 | 1910 |
1900 | 1911 |
1901 finish_test | 1912 finish_test |
OLD | NEW |