Index: third_party/sqlite/src/test/e_select.test |
diff --git a/third_party/sqlite/src/test/e_select.test b/third_party/sqlite/src/test/e_select.test |
index 79e334ce304d62e739fd3bb560db04b961428653..89d61b53bc575f02e1ba3245e408d263358e73b6 100644 |
--- a/third_party/sqlite/src/test/e_select.test |
+++ b/third_party/sqlite/src/test/e_select.test |
@@ -16,6 +16,11 @@ |
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
+ifcapable !compound { |
+ finish_test |
+ return |
+} |
+ |
do_execsql_test e_select-1.0 { |
CREATE TABLE t1(a, b); |
INSERT INTO t1 VALUES('a', 'one'); |
@@ -78,7 +83,7 @@ proc do_join_test {tn select res} { |
# The following tests check that all paths on the syntax diagrams on |
# the lang_select.html page may be taken. |
# |
-# EVIDENCE-OF: R-18428-22111 -- syntax diagram join-constraint |
+# -- syntax diagram join-constraint |
# |
do_join_test e_select-0.1.1 { |
SELECT count(*) FROM t1 %JOIN% t2 ON (t1.a=t2.a) |
@@ -96,7 +101,7 @@ do_catchsql_test e_select-0.1.5 { |
SELECT count(*) FROM t1, t2 USING (a) ON (t1.a=t2.a) |
} {1 {near "ON": syntax error}} |
-# EVIDENCE-OF: R-44854-11739 -- syntax diagram select-core |
+# -- syntax diagram select-core |
# |
# 0: SELECT ... |
# 1: SELECT DISTINCT ... |
@@ -221,7 +226,7 @@ do_select_tests e_select-0.2 { |
} |
-# EVIDENCE-OF: R-23316-20169 -- syntax diagram result-column |
+# -- syntax diagram result-column |
# |
do_select_tests e_select-0.3 { |
1 "SELECT * FROM t1" {a one b two c three} |
@@ -231,9 +236,9 @@ do_select_tests e_select-0.3 { |
5 "SELECT 'x'||a||'x' AS alias FROM t1" {xax xbx xcx} |
} |
-# EVIDENCE-OF: R-41233-21397 -- syntax diagram join-source |
+# -- syntax diagram join-source |
# |
-# EVIDENCE-OF: R-45040-11121 -- syntax diagram join-op |
+# -- syntax diagram join-op |
# |
do_select_tests e_select-0.4 { |
1 "SELECT t1.rowid FROM t1" {1 2 3} |
@@ -258,7 +263,7 @@ do_select_tests e_select-0.4 { |
16 "SELECT t1.rowid FROM t1 CROSS JOIN t3" {1 1 2 2 3 3} |
} |
-# EVIDENCE-OF: R-56911-63533 -- syntax diagram compound-operator |
+# -- syntax diagram compound-operator |
# |
do_select_tests e_select-0.5 { |
1 "SELECT rowid FROM t1 UNION ALL SELECT rowid+2 FROM t4" {1 2 3 3 4} |
@@ -267,7 +272,7 @@ do_select_tests e_select-0.5 { |
4 "SELECT rowid FROM t1 EXCEPT SELECT rowid+2 FROM t4" {1 2} |
} |
-# EVIDENCE-OF: R-60388-27458 -- syntax diagram ordering-term |
+# -- syntax diagram ordering-term |
# |
do_select_tests e_select-0.6 { |
1 "SELECT b||a FROM t1 ORDER BY b||a" {onea threec twob} |
@@ -276,7 +281,7 @@ do_select_tests e_select-0.6 { |
4 "SELECT b||a FROM t1 ORDER BY (b||a) DESC" {twob threec onea} |
} |
-# EVIDENCE-OF: R-36494-33519 -- syntax diagram select-stmt |
+# -- syntax diagram select-stmt |
# |
do_select_tests e_select-0.7 { |
1 "SELECT * FROM t1" {a one b two c three} |
@@ -328,9 +333,9 @@ do_select_tests e_select-1.1 { |
6 "SELECT count(*) WHERE 1" {1} |
} |
-# EVIDENCE-OF: R-48114-33255 If there is only a single table in the |
-# join-source following the FROM clause, then the input data used by the |
-# SELECT statement is the contents of the named table. |
+# EVIDENCE-OF: R-45424-07352 If there is only a single table or subquery |
+# in the FROM clause, then the input data used by the SELECT statement |
+# is the contents of the named table. |
# |
# The results of the SELECT queries suggest that they are operating on the |
# contents of the table 'xx'. |
@@ -352,10 +357,10 @@ do_select_tests e_select-1.2 { |
3 "SELECT sum(x), sum(y) FROM xx" {-17.89 -16.87} |
} |
-# EVIDENCE-OF: R-23593-12456 If there is more than one table specified |
-# as part of the join-source following the FROM keyword, then the |
-# contents of each named table are joined into a single dataset for the |
-# simple SELECT statement to operate on. |
+# EVIDENCE-OF: R-28355-09804 If there is more than one table or subquery |
+# in FROM clause then the contents of all tables and/or subqueries are |
+# joined into a single dataset for the simple SELECT statement to |
+# operate on. |
# |
# There are more detailed tests for subsequent requirements that add |
# more detail to this idea. We just add a single test that shows that |
@@ -378,10 +383,10 @@ do_select_tests e_select-1.3 { |
# of cartesian joins in the SELECT documentation is consistent with SQLite. |
# In doing so, we test the following three requirements as a side-effect: |
# |
-# EVIDENCE-OF: R-46122-14930 If the join-op is "CROSS JOIN", "INNER |
-# JOIN", "JOIN" or a comma (",") and there is no ON or USING clause, |
-# then the result of the join is simply the cartesian product of the |
-# left and right-hand datasets. |
+# EVIDENCE-OF: R-49872-03192 If the join-operator is "CROSS JOIN", |
+# "INNER JOIN", "JOIN" or a comma (",") and there is no ON or USING |
+# clause, then the result of the join is simply the cartesian product of |
+# the left and right-hand datasets. |
# |
# The tests are built on this assertion. Really, they test that the output |
# of a CROSS JOIN, JOIN, INNER JOIN or "," join matches the expected result |
@@ -390,8 +395,8 @@ do_select_tests e_select-1.3 { |
# EVIDENCE-OF: R-46256-57243 There is no difference between the "INNER |
# JOIN", "JOIN" and "," join operators. |
# |
-# EVIDENCE-OF: R-07544-24155 The "CROSS JOIN" join operator produces the |
-# same data as the "INNER JOIN", "JOIN" and "," operators |
+# EVIDENCE-OF: R-25071-21202 The "CROSS JOIN" join operator produces the |
+# same result as the "INNER JOIN", "JOIN" and "," operators |
# |
# All tests are run 4 times, with the only difference in each run being |
# which of the 4 equivalent cartesian product join operators are used. |
@@ -445,24 +450,24 @@ do_join_test e_select-1.4.1.4 { |
# left-hand and right-hand datasets. |
# |
do_join_test e_select-1.4.2.1 { |
- SELECT * FROM x2 %JOIN% x3 |
+ SELECT * FROM x2 %JOIN% x3 ORDER BY +c, +f |
} [list -60.06 {} {} -39.24 {} encompass -1 \ |
- -60.06 {} {} presenting 51 reformation dignified \ |
- -60.06 {} {} conducting -87.24 37.56 {} \ |
- -60.06 {} {} coldest -96 dramatists 82.3 \ |
-60.06 {} {} alerting {} -93.79 {} \ |
+ -60.06 {} {} coldest -96 dramatists 82.3 \ |
+ -60.06 {} {} conducting -87.24 37.56 {} \ |
+ -60.06 {} {} presenting 51 reformation dignified \ |
-58 {} 1.21 -39.24 {} encompass -1 \ |
- -58 {} 1.21 presenting 51 reformation dignified \ |
- -58 {} 1.21 conducting -87.24 37.56 {} \ |
- -58 {} 1.21 coldest -96 dramatists 82.3 \ |
-58 {} 1.21 alerting {} -93.79 {} \ |
+ -58 {} 1.21 coldest -96 dramatists 82.3 \ |
+ -58 {} 1.21 conducting -87.24 37.56 {} \ |
+ -58 {} 1.21 presenting 51 reformation dignified \ |
] |
# TODO: Come back and add a few more like the above. |
-# EVIDENCE-OF: R-20659-43267 In other words, if the left-hand dataset |
-# consists of Nlhs rows of Mlhs columns, and the right-hand dataset of |
-# Nrhs rows of Mrhs columns, then the cartesian product is a dataset of |
-# Nlhs.Nrhs rows, each containing Mlhs+Mrhs columns. |
+# EVIDENCE-OF: R-18439-38548 In other words, if the left-hand dataset |
+# consists of Nleft rows of Mleft columns, and the right-hand dataset of |
+# Nright rows of Mright columns, then the cartesian product is a dataset |
+# of Nleft×Nright rows, each containing Mleft+Mright columns. |
# |
# x1, x2 (Nlhs=3, Nrhs=2) (Mlhs=2, Mrhs=3) |
do_join_test e_select-1.4.3.1 { |
@@ -508,11 +513,10 @@ do_select_tests e_select-1.4.5 [list \ |
4 { SELECT * FROM t1 AS y INNER JOIN t1 AS x } $t1_cross_t1 \ |
] |
- |
-# EVIDENCE-OF: R-22775-56496 If there is an ON clause specified, then |
-# the ON expression is evaluated for each row of the cartesian product |
-# as a boolean expression. All rows for which the expression evaluates |
-# to false are excluded from the dataset. |
+# EVIDENCE-OF: R-38465-03616 If there is an ON clause then the ON |
+# expression is evaluated for each row of the cartesian product as a |
+# boolean expression. Only rows for which the expression evaluates to |
+# true are included from the dataset. |
# |
foreach {tn select res} [list \ |
1 { SELECT * FROM t1 %JOIN% t2 ON (1) } $t1_cross_t2 \ |
@@ -535,9 +539,9 @@ foreach {tn select res} [list \ |
do_join_test e_select-1.3.$tn $select $res |
} |
-# EVIDENCE-OF: R-63358-54862 If there is a USING clause specified as |
-# part of the join-constraint, then each of the column names specified |
-# must exist in the datasets to both the left and right of the join-op. |
+# EVIDENCE-OF: R-49933-05137 If there is a USING clause then each of the |
+# column names specified must exist in the datasets to both the left and |
+# right of the join-operator. |
# |
do_select_tests e_select-1.4 -error { |
cannot join using column %s - column not present in both tables |
@@ -547,10 +551,10 @@ do_select_tests e_select-1.4 -error { |
3 { SELECT * FROM t3, (SELECT a AS b, b AS c FROM t1) USING (a) } "a" |
} |
-# EVIDENCE-OF: R-55987-04584 For each pair of namesake columns, the |
+# EVIDENCE-OF: R-22776-52830 For each pair of named columns, the |
# expression "lhs.X = rhs.X" is evaluated for each row of the cartesian |
-# product as a boolean expression. All rows for which one or more of the |
-# expressions evaluates to false are excluded from the result set. |
+# product as a boolean expression. Only rows for which all such |
+# expressions evaluates to true are included from the result set. |
# |
do_select_tests e_select-1.5 { |
1 { SELECT * FROM t1, t3 USING (a) } {a one 1 b two 2} |
@@ -561,8 +565,8 @@ do_select_tests e_select-1.5 { |
# USING clause, the normal rules for handling affinities, collation |
# sequences and NULL values in comparisons apply. |
# |
-# EVIDENCE-OF: R-35466-18578 The column from the dataset on the |
-# left-hand side of the join operator is considered to be on the |
+# EVIDENCE-OF: R-38422-04402 The column from the dataset on the |
+# left-hand side of the join-operator is considered to be on the |
# left-hand side of the comparison operator (=) for the purposes of |
# collation sequence and affinity precedence. |
# |
@@ -617,10 +621,9 @@ foreach {tn select res} { |
} { |
do_join_test e_select-1.7.$tn $select $res |
} |
- |
-# EVIDENCE-OF: R-41434-12448 If the join-op is a "LEFT JOIN" or "LEFT |
-# OUTER JOIN", then after the ON or USING filtering clauses have been |
-# applied, an extra row is added to the output for each row in the |
+# EVIDENCE-OF: R-42531-52874 If the join-operator is a "LEFT JOIN" or |
+# "LEFT OUTER JOIN", then after the ON or USING filtering clauses have |
+# been applied, an extra row is added to the output for each row in the |
# original left-hand input dataset that corresponds to no rows at all in |
# the composite dataset (if any). |
# |
@@ -655,8 +658,8 @@ do_select_tests e_select-1.9 { |
2b "SELECT * FROM t7 LEFT JOIN t8 USING (a)" {x ex 24 abc 24 y why 25 {} {}} |
} |
-# EVIDENCE-OF: R-01809-52134 If the NATURAL keyword is added to any of |
-# the join-ops, then an implicit USING clause is added to the |
+# EVIDENCE-OF: R-04932-55942 If the NATURAL keyword is in the |
+# join-operator then an implicit USING clause is added to the |
# join-constraints. The implicit USING clause contains each of the |
# column names that appear in both the left and right-hand input |
# datasets. |
@@ -729,10 +732,10 @@ do_execsql_test e_select-3.0 { |
INSERT INTO x2 VALUES(7, 'mistrusted', 'standardized'); |
} {} |
-# EVIDENCE-OF: R-06999-14330 If a WHERE clause is specified, the WHERE |
+# EVIDENCE-OF: R-60775-64916 If a WHERE clause is specified, the WHERE |
# expression is evaluated for each row in the input data as a boolean |
-# expression. All rows for which the WHERE clause expression evaluates |
-# to false are excluded from the dataset before continuing. |
+# expression. Only rows for which the WHERE clause expression evaluates |
+# to true are included from the dataset before continuing. |
# |
do_execsql_test e_select-3.1.1 { SELECT k FROM x1 WHERE x } {3} |
do_execsql_test e_select-3.1.2 { SELECT k FROM x1 WHERE y } {3 5 6} |
@@ -800,7 +803,7 @@ do_select_tests e_select-4.1 { |
6 "SELECT count(*), * FROM z1" {6 63 born -26} |
7 "SELECT max(a), * FROM z1" {63 63 born -26} |
- 8 "SELECT *, min(a) FROM z1" {63 born -26 -5} |
+ 8 "SELECT *, min(a) FROM z1" {-5 {} 75 -5} |
9 "SELECT *,* FROM z1,z2 LIMIT 1" { |
51.65 -59.58 belfries {} 21 51.65 -59.58 belfries {} 21 |
@@ -810,8 +813,8 @@ do_select_tests e_select-4.1 { |
} |
} |
-# EVIDENCE-OF: R-61869-22578 It is an error to use a "*" or "alias.*" |
-# expression in any context other than than a result expression list. |
+# EVIDENCE-OF: R-38023-18396 It is an error to use a "*" or "alias.*" |
+# expression in any context other than a result expression list. |
# |
# EVIDENCE-OF: R-44324-41166 It is also an error to use a "*" or |
# "alias.*" expression in a simple SELECT query that does not have a |
@@ -1004,12 +1007,12 @@ do_execsql_test e_select-4.9.0 { |
INSERT INTO b3 VALUES('dEF', 'dEF'); |
} {} |
-# EVIDENCE-OF: R-57754-57109 If the SELECT statement is an aggregate |
+# EVIDENCE-OF: R-07284-35990 If the SELECT statement is an aggregate |
# query with a GROUP BY clause, then each of the expressions specified |
# as part of the GROUP BY clause is evaluated for each row of the |
# dataset. Each row is then assigned to a "group" based on the results; |
# rows for which the results of evaluating the GROUP BY expressions are |
-# the same are assigned to the same group. |
+# the same get assigned to the same group. |
# |
# These tests also show that the following is not untrue: |
# |
@@ -1018,10 +1021,10 @@ do_execsql_test e_select-4.9.0 { |
# |
do_select_tests e_select-4.9 { |
1 "SELECT group_concat(one), two FROM b1 GROUP BY two" { |
- 4,5 f 1 o 7,6 s 3,2 t |
+ /#,# f 1 o #,# s #,# t/ |
} |
2 "SELECT group_concat(one), sum(one) FROM b1 GROUP BY (one>4)" { |
- 1,4,3,2 10 5,7,6 18 |
+ 1,2,3,4 10 5,6,7 18 |
} |
3 "SELECT group_concat(one) FROM b1 GROUP BY (two>'o'), one%2" { |
4 1,5 2,6 3,7 |
@@ -1035,7 +1038,7 @@ do_select_tests e_select-4.9 { |
# values are considered equal. |
# |
do_select_tests e_select-4.10 { |
- 1 "SELECT group_concat(y) FROM b2 GROUP BY x" {0,1 3 2,4} |
+ 1 "SELECT group_concat(y) FROM b2 GROUP BY x" {/#,# 3 #,#/} |
2 "SELECT count(*) FROM b2 GROUP BY CASE WHEN y<4 THEN NULL ELSE 0 END" {4 1} |
} |
@@ -1221,8 +1224,8 @@ do_select_tests e_select-5.1 { |
# EVIDENCE-OF: R-08861-34280 If the simple SELECT is a SELECT ALL, then |
# the entire set of result rows are returned by the SELECT. |
# |
-# EVIDENCE-OF: R-47911-02086 If neither ALL or DISTINCT are present, |
-# then the behaviour is as if ALL were specified. |
+# EVIDENCE-OF: R-01256-01950 If neither ALL or DISTINCT are present, |
+# then the behavior is as if ALL were specified. |
# |
# EVIDENCE-OF: R-14442-41305 If the simple SELECT is a SELECT DISTINCT, |
# then duplicate rows are removed from the set of result rows before it |
@@ -1238,8 +1241,8 @@ do_select_tests e_select-5 { |
3.1 "SELECT x FROM h2" {One Two Three Four one two three four} |
3.2 "SELECT x FROM h1, h2 ON (x=b)" {One one Four four} |
- 4.1 "SELECT DISTINCT x FROM h2" {four one three two} |
- 4.2 "SELECT DISTINCT x FROM h1, h2 ON (x=b)" {four one} |
+ 4.1 "SELECT DISTINCT x FROM h2" {One Two Three Four} |
+ 4.2 "SELECT DISTINCT x FROM h1, h2 ON (x=b)" {One Four} |
} |
# EVIDENCE-OF: R-02054-15343 For the purposes of detecting duplicate |
@@ -1253,11 +1256,11 @@ do_select_tests e_select-5.5 { |
# sequence to compare text values with apply. |
# |
do_select_tests e_select-5.6 { |
- 1 "SELECT DISTINCT b FROM h1" {I IV four i iv one} |
- 2 "SELECT DISTINCT b COLLATE nocase FROM h1" {four i iv one} |
- 3 "SELECT DISTINCT x FROM h2" {four one three two} |
+ 1 "SELECT DISTINCT b FROM h1" {one I i four IV iv} |
+ 2 "SELECT DISTINCT b COLLATE nocase FROM h1" {one I four IV} |
+ 3 "SELECT DISTINCT x FROM h2" {One Two Three Four} |
4 "SELECT DISTINCT x COLLATE binary FROM h2" { |
- Four One Three Two four one three two |
+ One Two Three Four one two three four |
} |
} |
@@ -1368,8 +1371,9 @@ foreach {tn select op1 op2} { |
do_catchsql_test e_select-7.2.$tn $select [list 1 $err] |
} |
-# EVIDENCE-OF: R-22874-32655 ORDER BY and LIMIT clauses may only occur |
-# at the end of the entire compound SELECT. |
+# EVIDENCE-OF: R-45440-25633 ORDER BY and LIMIT clauses may only occur |
+# at the end of the entire compound SELECT, and then only if the final |
+# element of the compound is not a VALUES clause. |
# |
foreach {tn select} { |
1 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 ORDER BY a" |
@@ -1381,6 +1385,7 @@ foreach {tn select} { |
7 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 ORDER BY a" |
8 "SELECT count(*) FROM j1 UNION SELECT max(e) FROM j2 ORDER BY 1" |
+ 8b "VALUES('8b') UNION SELECT max(e) FROM j2 ORDER BY 1" |
9 "SELECT count(*), * FROM j1 UNION SELECT *,* FROM j2 ORDER BY 1,2,3" |
10 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10" |
11 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10 OFFSET 5" |
@@ -1402,6 +1407,14 @@ foreach {tn select} { |
} { |
do_test e_select-7.3.$tn { catch {execsql $select} msg } 0 |
} |
+foreach {tn select} { |
+ 50 "SELECT * FROM j1 ORDER BY 1 UNION ALL SELECT * FROM j2,j3" |
+ 51 "SELECT * FROM j1 LIMIT 1 UNION ALL SELECT * FROM j2,j3" |
+ 52 "SELECT count(*) FROM j1 UNION ALL VALUES(11) ORDER BY 1" |
+ 53 "SELECT count(*) FROM j1 UNION ALL VALUES(11) LIMIT 1" |
+} { |
+ do_test e_select-7.3.$tn { catch {execsql $select} msg } 1 |
+} |
# EVIDENCE-OF: R-08531-36543 A compound SELECT created using UNION ALL |
# operator returns all the rows from the SELECT to the left of the UNION |
@@ -1740,12 +1753,12 @@ do_select_tests e_select-8.4 { |
1 2 7 1 2 8 1 4 93 1 5 -1 |
} |
8 "SELECT z, x FROM d1 ORDER BY 2" { |
- 3 1 8 1 7 1 -20 1 |
- 93 1 -1 1 -1 2 93 2 |
+ /# 1 # 1 # 1 # 1 |
+ # 1 # 1 # 2 # 2/ |
} |
9 "SELECT z, x FROM d1 ORDER BY 1" { |
- -20 1 -1 2 -1 1 3 1 |
- 7 1 8 1 93 2 93 1 |
+ /-20 1 -1 # -1 # 3 1 |
+ 7 1 8 1 93 # 93 #/ |
} |
} |
@@ -1761,16 +1774,16 @@ do_select_tests e_select-8.5 { |
94 94 9 8 4 0 0 -19 |
} |
3 "SELECT z AS x, x AS z FROM d1 ORDER BY z" { |
- 3 1 8 1 7 1 -20 1 93 1 -1 1 -1 2 93 2 |
+ /# 1 # 1 # 1 # 1 # 1 # 1 # 2 # 2/ |
} |
4 "SELECT z AS x, x AS z FROM d1 ORDER BY x" { |
- -20 1 -1 2 -1 1 3 1 7 1 8 1 93 2 93 1 |
+ /-20 1 -1 # -1 # 3 1 7 1 8 1 93 # 93 #/ |
} |
} |
-# EVIDENCE-OF: R-27923-38747 Otherwise, if the ORDER BY expression is |
-# any other expression, it is evaluated and the the returned value used |
-# to order the output rows. |
+# EVIDENCE-OF: R-65068-27207 Otherwise, if the ORDER BY expression is |
+# any other expression, it is evaluated and the returned value used to |
+# order the output rows. |
# |
# EVIDENCE-OF: R-03421-57988 If the SELECT statement is a simple SELECT, |
# then an ORDER BY may contain any arbitrary expressions. |