Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(828)

Side by Side Diff: third_party/sqlite/src/test/e_select.test

Issue 901033002: Import SQLite 3.8.7.4. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Chromium changes to support SQLite 3.8.7.4. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #***********************************************************************
11 # 11 #
12 # This file implements tests to verify that the "testable statements" in 12 # This file implements tests to verify that the "testable statements" in
13 # the lang_select.html document are correct. 13 # the lang_select.html document are correct.
14 # 14 #
15 15
16 set testdir [file dirname $argv0] 16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl 17 source $testdir/tester.tcl
18 18
19 ifcapable !compound {
20 finish_test
21 return
22 }
23
19 do_execsql_test e_select-1.0 { 24 do_execsql_test e_select-1.0 {
20 CREATE TABLE t1(a, b); 25 CREATE TABLE t1(a, b);
21 INSERT INTO t1 VALUES('a', 'one'); 26 INSERT INTO t1 VALUES('a', 'one');
22 INSERT INTO t1 VALUES('b', 'two'); 27 INSERT INTO t1 VALUES('b', 'two');
23 INSERT INTO t1 VALUES('c', 'three'); 28 INSERT INTO t1 VALUES('c', 'three');
24 29
25 CREATE TABLE t2(a, b); 30 CREATE TABLE t2(a, b);
26 INSERT INTO t2 VALUES('a', 'I'); 31 INSERT INTO t2 VALUES('a', 'I');
27 INSERT INTO t2 VALUES('b', 'II'); 32 INSERT INTO t2 VALUES('b', 'II');
28 INSERT INTO t2 VALUES('c', 'III'); 33 INSERT INTO t2 VALUES('c', 'III');
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 foreach {tn2 joinop} [list 1 , 2 "CROSS JOIN" 3 "INNER JOIN"] { 76 foreach {tn2 joinop} [list 1 , 2 "CROSS JOIN" 3 "INNER JOIN"] {
72 set S [string map [list %JOIN% $joinop] $select] 77 set S [string map [list %JOIN% $joinop] $select]
73 uplevel do_execsql_test $tn.$tn2 [list $S] [list $res] 78 uplevel do_execsql_test $tn.$tn2 [list $S] [list $res]
74 } 79 }
75 } 80 }
76 81
77 #------------------------------------------------------------------------- 82 #-------------------------------------------------------------------------
78 # The following tests check that all paths on the syntax diagrams on 83 # The following tests check that all paths on the syntax diagrams on
79 # the lang_select.html page may be taken. 84 # the lang_select.html page may be taken.
80 # 85 #
81 # EVIDENCE-OF: R-18428-22111 -- syntax diagram join-constraint 86 # -- syntax diagram join-constraint
82 # 87 #
83 do_join_test e_select-0.1.1 { 88 do_join_test e_select-0.1.1 {
84 SELECT count(*) FROM t1 %JOIN% t2 ON (t1.a=t2.a) 89 SELECT count(*) FROM t1 %JOIN% t2 ON (t1.a=t2.a)
85 } {3} 90 } {3}
86 do_join_test e_select-0.1.2 { 91 do_join_test e_select-0.1.2 {
87 SELECT count(*) FROM t1 %JOIN% t2 USING (a) 92 SELECT count(*) FROM t1 %JOIN% t2 USING (a)
88 } {3} 93 } {3}
89 do_join_test e_select-0.1.3 { 94 do_join_test e_select-0.1.3 {
90 SELECT count(*) FROM t1 %JOIN% t2 95 SELECT count(*) FROM t1 %JOIN% t2
91 } {9} 96 } {9}
92 do_catchsql_test e_select-0.1.4 { 97 do_catchsql_test e_select-0.1.4 {
93 SELECT count(*) FROM t1, t2 ON (t1.a=t2.a) USING (a) 98 SELECT count(*) FROM t1, t2 ON (t1.a=t2.a) USING (a)
94 } {1 {cannot have both ON and USING clauses in the same join}} 99 } {1 {cannot have both ON and USING clauses in the same join}}
95 do_catchsql_test e_select-0.1.5 { 100 do_catchsql_test e_select-0.1.5 {
96 SELECT count(*) FROM t1, t2 USING (a) ON (t1.a=t2.a) 101 SELECT count(*) FROM t1, t2 USING (a) ON (t1.a=t2.a)
97 } {1 {near "ON": syntax error}} 102 } {1 {near "ON": syntax error}}
98 103
99 # EVIDENCE-OF: R-44854-11739 -- syntax diagram select-core 104 # -- syntax diagram select-core
100 # 105 #
101 # 0: SELECT ... 106 # 0: SELECT ...
102 # 1: SELECT DISTINCT ... 107 # 1: SELECT DISTINCT ...
103 # 2: SELECT ALL ... 108 # 2: SELECT ALL ...
104 # 109 #
105 # 0: No FROM clause 110 # 0: No FROM clause
106 # 1: Has FROM clause 111 # 1: Has FROM clause
107 # 112 #
108 # 0: No WHERE clause 113 # 0: No WHERE clause
109 # 1: Has WHERE clause 114 # 1: Has WHERE clause
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 {1 c 1 b} 219 {1 c 1 b}
215 2112.1 "SELECT ALL count(*), max(a) FROM t1 WHERE a!='b' 220 2112.1 "SELECT ALL count(*), max(a) FROM t1 WHERE a!='b'
216 GROUP BY b HAVING count(*)=1" { 221 GROUP BY b HAVING count(*)=1" {
217 1 a 1 c 222 1 a 1 c
218 } 223 }
219 2112.2 "SELECT ALL count(*), max(a) FROM t1 224 2112.2 "SELECT ALL count(*), max(a) FROM t1
220 WHERE 0 GROUP BY b HAVING count(*)=2" { } 225 WHERE 0 GROUP BY b HAVING count(*)=2" { }
221 } 226 }
222 227
223 228
224 # EVIDENCE-OF: R-23316-20169 -- syntax diagram result-column 229 # -- syntax diagram result-column
225 # 230 #
226 do_select_tests e_select-0.3 { 231 do_select_tests e_select-0.3 {
227 1 "SELECT * FROM t1" {a one b two c three} 232 1 "SELECT * FROM t1" {a one b two c three}
228 2 "SELECT t1.* FROM t1" {a one b two c three} 233 2 "SELECT t1.* FROM t1" {a one b two c three}
229 3 "SELECT 'x'||a||'x' FROM t1" {xax xbx xcx} 234 3 "SELECT 'x'||a||'x' FROM t1" {xax xbx xcx}
230 4 "SELECT 'x'||a||'x' alias FROM t1" {xax xbx xcx} 235 4 "SELECT 'x'||a||'x' alias FROM t1" {xax xbx xcx}
231 5 "SELECT 'x'||a||'x' AS alias FROM t1" {xax xbx xcx} 236 5 "SELECT 'x'||a||'x' AS alias FROM t1" {xax xbx xcx}
232 } 237 }
233 238
234 # EVIDENCE-OF: R-41233-21397 -- syntax diagram join-source 239 # -- syntax diagram join-source
235 # 240 #
236 # EVIDENCE-OF: R-45040-11121 -- syntax diagram join-op 241 # -- syntax diagram join-op
237 # 242 #
238 do_select_tests e_select-0.4 { 243 do_select_tests e_select-0.4 {
239 1 "SELECT t1.rowid FROM t1" {1 2 3} 244 1 "SELECT t1.rowid FROM t1" {1 2 3}
240 2 "SELECT t1.rowid FROM t1,t2" {1 1 1 2 2 2 3 3 3} 245 2 "SELECT t1.rowid FROM t1,t2" {1 1 1 2 2 2 3 3 3}
241 3 "SELECT t1.rowid FROM t1,t2,t3" {1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3} 246 3 "SELECT t1.rowid FROM t1,t2,t3" {1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3}
242 247
243 4 "SELECT t1.rowid FROM t1" {1 2 3} 248 4 "SELECT t1.rowid FROM t1" {1 2 3}
244 5 "SELECT t1.rowid FROM t1 JOIN t2" {1 1 1 2 2 2 3 3 3} 249 5 "SELECT t1.rowid FROM t1 JOIN t2" {1 1 1 2 2 2 3 3 3}
245 6 "SELECT t1.rowid FROM t1 JOIN t2 JOIN t3" 250 6 "SELECT t1.rowid FROM t1 JOIN t2 JOIN t3"
246 {1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3} 251 {1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3}
247 252
248 7 "SELECT t1.rowid FROM t1 NATURAL JOIN t3" {1 2} 253 7 "SELECT t1.rowid FROM t1 NATURAL JOIN t3" {1 2}
249 8 "SELECT t1.rowid FROM t1 NATURAL LEFT OUTER JOIN t3" {1 2 3} 254 8 "SELECT t1.rowid FROM t1 NATURAL LEFT OUTER JOIN t3" {1 2 3}
250 9 "SELECT t1.rowid FROM t1 NATURAL LEFT JOIN t3" {1 2 3} 255 9 "SELECT t1.rowid FROM t1 NATURAL LEFT JOIN t3" {1 2 3}
251 10 "SELECT t1.rowid FROM t1 NATURAL INNER JOIN t3" {1 2} 256 10 "SELECT t1.rowid FROM t1 NATURAL INNER JOIN t3" {1 2}
252 11 "SELECT t1.rowid FROM t1 NATURAL CROSS JOIN t3" {1 2} 257 11 "SELECT t1.rowid FROM t1 NATURAL CROSS JOIN t3" {1 2}
253 258
254 12 "SELECT t1.rowid FROM t1 JOIN t3" {1 1 2 2 3 3} 259 12 "SELECT t1.rowid FROM t1 JOIN t3" {1 1 2 2 3 3}
255 13 "SELECT t1.rowid FROM t1 LEFT OUTER JOIN t3" {1 1 2 2 3 3} 260 13 "SELECT t1.rowid FROM t1 LEFT OUTER JOIN t3" {1 1 2 2 3 3}
256 14 "SELECT t1.rowid FROM t1 LEFT JOIN t3" {1 1 2 2 3 3} 261 14 "SELECT t1.rowid FROM t1 LEFT JOIN t3" {1 1 2 2 3 3}
257 15 "SELECT t1.rowid FROM t1 INNER JOIN t3" {1 1 2 2 3 3} 262 15 "SELECT t1.rowid FROM t1 INNER JOIN t3" {1 1 2 2 3 3}
258 16 "SELECT t1.rowid FROM t1 CROSS JOIN t3" {1 1 2 2 3 3} 263 16 "SELECT t1.rowid FROM t1 CROSS JOIN t3" {1 1 2 2 3 3}
259 } 264 }
260 265
261 # EVIDENCE-OF: R-56911-63533 -- syntax diagram compound-operator 266 # -- syntax diagram compound-operator
262 # 267 #
263 do_select_tests e_select-0.5 { 268 do_select_tests e_select-0.5 {
264 1 "SELECT rowid FROM t1 UNION ALL SELECT rowid+2 FROM t4" {1 2 3 3 4} 269 1 "SELECT rowid FROM t1 UNION ALL SELECT rowid+2 FROM t4" {1 2 3 3 4}
265 2 "SELECT rowid FROM t1 UNION SELECT rowid+2 FROM t4" {1 2 3 4} 270 2 "SELECT rowid FROM t1 UNION SELECT rowid+2 FROM t4" {1 2 3 4}
266 3 "SELECT rowid FROM t1 INTERSECT SELECT rowid+2 FROM t4" {3} 271 3 "SELECT rowid FROM t1 INTERSECT SELECT rowid+2 FROM t4" {3}
267 4 "SELECT rowid FROM t1 EXCEPT SELECT rowid+2 FROM t4" {1 2} 272 4 "SELECT rowid FROM t1 EXCEPT SELECT rowid+2 FROM t4" {1 2}
268 } 273 }
269 274
270 # EVIDENCE-OF: R-60388-27458 -- syntax diagram ordering-term 275 # -- syntax diagram ordering-term
271 # 276 #
272 do_select_tests e_select-0.6 { 277 do_select_tests e_select-0.6 {
273 1 "SELECT b||a FROM t1 ORDER BY b||a" {onea threec twob} 278 1 "SELECT b||a FROM t1 ORDER BY b||a" {onea threec twob}
274 2 "SELECT b||a FROM t1 ORDER BY (b||a) COLLATE nocase" {onea threec twob} 279 2 "SELECT b||a FROM t1 ORDER BY (b||a) COLLATE nocase" {onea threec twob}
275 3 "SELECT b||a FROM t1 ORDER BY (b||a) ASC" {onea threec twob} 280 3 "SELECT b||a FROM t1 ORDER BY (b||a) ASC" {onea threec twob}
276 4 "SELECT b||a FROM t1 ORDER BY (b||a) DESC" {twob threec onea} 281 4 "SELECT b||a FROM t1 ORDER BY (b||a) DESC" {twob threec onea}
277 } 282 }
278 283
279 # EVIDENCE-OF: R-36494-33519 -- syntax diagram select-stmt 284 # -- syntax diagram select-stmt
280 # 285 #
281 do_select_tests e_select-0.7 { 286 do_select_tests e_select-0.7 {
282 1 "SELECT * FROM t1" {a one b two c three} 287 1 "SELECT * FROM t1" {a one b two c three}
283 2 "SELECT * FROM t1 ORDER BY b" {a one c three b two} 288 2 "SELECT * FROM t1 ORDER BY b" {a one c three b two}
284 3 "SELECT * FROM t1 ORDER BY b, a" {a one c three b two} 289 3 "SELECT * FROM t1 ORDER BY b, a" {a one c three b two}
285 290
286 4 "SELECT * FROM t1 LIMIT 10" {a one b two c three} 291 4 "SELECT * FROM t1 LIMIT 10" {a one b two c three}
287 5 "SELECT * FROM t1 LIMIT 10 OFFSET 5" {} 292 5 "SELECT * FROM t1 LIMIT 10 OFFSET 5" {}
288 6 "SELECT * FROM t1 LIMIT 10, 5" {} 293 6 "SELECT * FROM t1 LIMIT 10, 5" {}
289 294
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 # 326 #
322 do_select_tests e_select-1.1 { 327 do_select_tests e_select-1.1 {
323 1 "SELECT 'abc'" {abc} 328 1 "SELECT 'abc'" {abc}
324 2 "SELECT 'abc' WHERE NULL" {} 329 2 "SELECT 'abc' WHERE NULL" {}
325 3 "SELECT NULL" {{}} 330 3 "SELECT NULL" {{}}
326 4 "SELECT count(*)" {1} 331 4 "SELECT count(*)" {1}
327 5 "SELECT count(*) WHERE 0" {0} 332 5 "SELECT count(*) WHERE 0" {0}
328 6 "SELECT count(*) WHERE 1" {1} 333 6 "SELECT count(*) WHERE 1" {1}
329 } 334 }
330 335
331 # EVIDENCE-OF: R-48114-33255 If there is only a single table in the 336 # EVIDENCE-OF: R-45424-07352 If there is only a single table or subquery
332 # join-source following the FROM clause, then the input data used by the 337 # in the FROM clause, then the input data used by the SELECT statement
333 # SELECT statement is the contents of the named table. 338 # is the contents of the named table.
334 # 339 #
335 # The results of the SELECT queries suggest that they are operating on the 340 # The results of the SELECT queries suggest that they are operating on the
336 # contents of the table 'xx'. 341 # contents of the table 'xx'.
337 # 342 #
338 do_execsql_test e_select-1.2.0 { 343 do_execsql_test e_select-1.2.0 {
339 CREATE TABLE xx(x, y); 344 CREATE TABLE xx(x, y);
340 INSERT INTO xx VALUES('IiJlsIPepMuAhU', X'10B00B897A15BAA02E3F98DCE8F2'); 345 INSERT INTO xx VALUES('IiJlsIPepMuAhU', X'10B00B897A15BAA02E3F98DCE8F2');
341 INSERT INTO xx VALUES(NULL, -16.87); 346 INSERT INTO xx VALUES(NULL, -16.87);
342 INSERT INTO xx VALUES(-17.89, 'linguistically'); 347 INSERT INTO xx VALUES(-17.89, 'linguistically');
343 } {} 348 } {}
344 do_select_tests e_select-1.2 { 349 do_select_tests e_select-1.2 {
345 1 "SELECT quote(x), quote(y) FROM xx" { 350 1 "SELECT quote(x), quote(y) FROM xx" {
346 'IiJlsIPepMuAhU' X'10B00B897A15BAA02E3F98DCE8F2' 351 'IiJlsIPepMuAhU' X'10B00B897A15BAA02E3F98DCE8F2'
347 NULL -16.87 352 NULL -16.87
348 -17.89 'linguistically' 353 -17.89 'linguistically'
349 } 354 }
350 355
351 2 "SELECT count(*), count(x), count(y) FROM xx" {3 2 3} 356 2 "SELECT count(*), count(x), count(y) FROM xx" {3 2 3}
352 3 "SELECT sum(x), sum(y) FROM xx" {-17.89 -16.87} 357 3 "SELECT sum(x), sum(y) FROM xx" {-17.89 -16.87}
353 } 358 }
354 359
355 # EVIDENCE-OF: R-23593-12456 If there is more than one table specified 360 # EVIDENCE-OF: R-28355-09804 If there is more than one table or subquery
356 # as part of the join-source following the FROM keyword, then the 361 # in FROM clause then the contents of all tables and/or subqueries are
357 # contents of each named table are joined into a single dataset for the 362 # joined into a single dataset for the simple SELECT statement to
358 # simple SELECT statement to operate on. 363 # operate on.
359 # 364 #
360 # There are more detailed tests for subsequent requirements that add 365 # There are more detailed tests for subsequent requirements that add
361 # more detail to this idea. We just add a single test that shows that 366 # more detail to this idea. We just add a single test that shows that
362 # data is coming from each of the three tables following the FROM clause 367 # data is coming from each of the three tables following the FROM clause
363 # here to show that the statement, vague as it is, is not incorrect. 368 # here to show that the statement, vague as it is, is not incorrect.
364 # 369 #
365 do_select_tests e_select-1.3 { 370 do_select_tests e_select-1.3 {
366 1 "SELECT * FROM t1, t2, t3" { 371 1 "SELECT * FROM t1, t2, t3" {
367 a one a I a 1 a one a I b 2 a one b II a 1 372 a one a I a 1 a one a I b 2 a one b II a 1
368 a one b II b 2 a one c III a 1 a one c III b 2 373 a one b II b 2 a one c III a 1 a one c III b 2
369 b two a I a 1 b two a I b 2 b two b II a 1 374 b two a I a 1 b two a I b 2 b two b II a 1
370 b two b II b 2 b two c III a 1 b two c III b 2 375 b two b II b 2 b two c III a 1 b two c III b 2
371 c three a I a 1 c three a I b 2 c three b II a 1 376 c three a I a 1 c three a I b 2 c three b II a 1
372 c three b II b 2 c three c III a 1 c three c III b 2 377 c three b II b 2 c three c III a 1 c three c III b 2
373 } 378 }
374 } 379 }
375 380
376 # 381 #
377 # The following block of tests - e_select-1.4.* - test that the description 382 # The following block of tests - e_select-1.4.* - test that the description
378 # of cartesian joins in the SELECT documentation is consistent with SQLite. 383 # of cartesian joins in the SELECT documentation is consistent with SQLite.
379 # In doing so, we test the following three requirements as a side-effect: 384 # In doing so, we test the following three requirements as a side-effect:
380 # 385 #
381 # EVIDENCE-OF: R-46122-14930 If the join-op is "CROSS JOIN", "INNER 386 # EVIDENCE-OF: R-49872-03192 If the join-operator is "CROSS JOIN",
382 # JOIN", "JOIN" or a comma (",") and there is no ON or USING clause, 387 # "INNER JOIN", "JOIN" or a comma (",") and there is no ON or USING
383 # then the result of the join is simply the cartesian product of the 388 # clause, then the result of the join is simply the cartesian product of
384 # left and right-hand datasets. 389 # the left and right-hand datasets.
385 # 390 #
386 # The tests are built on this assertion. Really, they test that the output 391 # The tests are built on this assertion. Really, they test that the output
387 # of a CROSS JOIN, JOIN, INNER JOIN or "," join matches the expected result 392 # of a CROSS JOIN, JOIN, INNER JOIN or "," join matches the expected result
388 # of calculating the cartesian product of the left and right-hand datasets. 393 # of calculating the cartesian product of the left and right-hand datasets.
389 # 394 #
390 # EVIDENCE-OF: R-46256-57243 There is no difference between the "INNER 395 # EVIDENCE-OF: R-46256-57243 There is no difference between the "INNER
391 # JOIN", "JOIN" and "," join operators. 396 # JOIN", "JOIN" and "," join operators.
392 # 397 #
393 # EVIDENCE-OF: R-07544-24155 The "CROSS JOIN" join operator produces the 398 # EVIDENCE-OF: R-25071-21202 The "CROSS JOIN" join operator produces the
394 # same data as the "INNER JOIN", "JOIN" and "," operators 399 # same result as the "INNER JOIN", "JOIN" and "," operators
395 # 400 #
396 # All tests are run 4 times, with the only difference in each run being 401 # All tests are run 4 times, with the only difference in each run being
397 # which of the 4 equivalent cartesian product join operators are used. 402 # which of the 4 equivalent cartesian product join operators are used.
398 # Since the output data is the same in all cases, we consider that this 403 # Since the output data is the same in all cases, we consider that this
399 # qualifies as testing the two statements above. 404 # qualifies as testing the two statements above.
400 # 405 #
401 do_execsql_test e_select-1.4.0 { 406 do_execsql_test e_select-1.4.0 {
402 CREATE TABLE x1(a, b); 407 CREATE TABLE x1(a, b);
403 CREATE TABLE x2(c, d, e); 408 CREATE TABLE x2(c, d, e);
404 CREATE TABLE x3(f, g, h, i); 409 CREATE TABLE x3(f, g, h, i);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 443
439 do_join_test e_select-1.4.1.4 { 444 do_join_test e_select-1.4.1.4 {
440 SELECT * FROM x2 %JOIN% x3 LIMIT 1 445 SELECT * FROM x2 %JOIN% x3 LIMIT 1
441 } [concat {-60.06 {} {}} {-39.24 {} encompass -1}] 446 } [concat {-60.06 {} {}} {-39.24 {} encompass -1}]
442 447
443 # EVIDENCE-OF: R-44414-54710 There is a row in the cartesian product 448 # EVIDENCE-OF: R-44414-54710 There is a row in the cartesian product
444 # dataset formed by combining each unique combination of a row from the 449 # dataset formed by combining each unique combination of a row from the
445 # left-hand and right-hand datasets. 450 # left-hand and right-hand datasets.
446 # 451 #
447 do_join_test e_select-1.4.2.1 { 452 do_join_test e_select-1.4.2.1 {
448 SELECT * FROM x2 %JOIN% x3 453 SELECT * FROM x2 %JOIN% x3 ORDER BY +c, +f
449 } [list -60.06 {} {} -39.24 {} encompass -1 \ 454 } [list -60.06 {} {} -39.24 {} encompass -1 \
455 -60.06 {} {} alerting {} -93.79 {} \
456 -60.06 {} {} coldest -96 dramatists 82.3 \
457 -60.06 {} {} conducting -87.24 37.56 {} \
450 -60.06 {} {} presenting 51 reformation dignified \ 458 -60.06 {} {} presenting 51 reformation dignified \
451 -60.06 {} {} conducting -87.24 37.56 {} \
452 -60.06 {} {} coldest -96 dramatists 82.3 \
453 -60.06 {} {} alerting {} -93.79 {} \
454 -58 {} 1.21 -39.24 {} encompass -1 \ 459 -58 {} 1.21 -39.24 {} encompass -1 \
460 -58 {} 1.21 alerting {} -93.79 {} \
461 -58 {} 1.21 coldest -96 dramatists 82.3 \
462 -58 {} 1.21 conducting -87.24 37.56 {} \
455 -58 {} 1.21 presenting 51 reformation dignified \ 463 -58 {} 1.21 presenting 51 reformation dignified \
456 -58 {} 1.21 conducting -87.24 37.56 {} \
457 -58 {} 1.21 coldest -96 dramatists 82.3 \
458 -58 {} 1.21 alerting {} -93.79 {} \
459 ] 464 ]
460 # TODO: Come back and add a few more like the above. 465 # TODO: Come back and add a few more like the above.
461 466
462 # EVIDENCE-OF: R-20659-43267 In other words, if the left-hand dataset 467 # EVIDENCE-OF: R-18439-38548 In other words, if the left-hand dataset
463 # consists of Nlhs rows of Mlhs columns, and the right-hand dataset of 468 # consists of Nleft rows of Mleft columns, and the right-hand dataset of
464 # Nrhs rows of Mrhs columns, then the cartesian product is a dataset of 469 # Nright rows of Mright columns, then the cartesian product is a dataset
465 # Nlhs.Nrhs rows, each containing Mlhs+Mrhs columns. 470 # of Nleft×Nright rows, each containing Mleft+Mright columns.
466 # 471 #
467 # x1, x2 (Nlhs=3, Nrhs=2) (Mlhs=2, Mrhs=3) 472 # x1, x2 (Nlhs=3, Nrhs=2) (Mlhs=2, Mrhs=3)
468 do_join_test e_select-1.4.3.1 { 473 do_join_test e_select-1.4.3.1 {
469 SELECT count(*) FROM x1 %JOIN% x2 474 SELECT count(*) FROM x1 %JOIN% x2
470 } [expr 3*2] 475 } [expr 3*2]
471 do_test e_select-1.4.3.2 { 476 do_test e_select-1.4.3.2 {
472 expr {[llength [execsql {SELECT * FROM x1, x2}]] / 6} 477 expr {[llength [execsql {SELECT * FROM x1, x2}]] / 6}
473 } [expr 2+3] 478 } [expr 2+3]
474 479
475 # x2, x3 (Nlhs=2, Nrhs=5) (Mlhs=3, Mrhs=4) 480 # x2, x3 (Nlhs=2, Nrhs=5) (Mlhs=3, Mrhs=4)
(...skipping 25 matching lines...) Expand all
501 do_execsql_test e_select-1.4.4.1 { SELECT * FROM t1, t2 } $t1_cross_t2 506 do_execsql_test e_select-1.4.4.1 { SELECT * FROM t1, t2 } $t1_cross_t2
502 do_execsql_test e_select-1.4.4.2 { SELECT * FROM t1 AS x, t1 AS y} $t1_cross_t1 507 do_execsql_test e_select-1.4.4.2 { SELECT * FROM t1 AS x, t1 AS y} $t1_cross_t1
503 508
504 do_select_tests e_select-1.4.5 [list \ 509 do_select_tests e_select-1.4.5 [list \
505 1 { SELECT * FROM t1 CROSS JOIN t2 } $t1_cross_t2 \ 510 1 { SELECT * FROM t1 CROSS JOIN t2 } $t1_cross_t2 \
506 2 { SELECT * FROM t1 AS y CROSS JOIN t1 AS x } $t1_cross_t1 \ 511 2 { SELECT * FROM t1 AS y CROSS JOIN t1 AS x } $t1_cross_t1 \
507 3 { SELECT * FROM t1 INNER JOIN t2 } $t1_cross_t2 \ 512 3 { SELECT * FROM t1 INNER JOIN t2 } $t1_cross_t2 \
508 4 { SELECT * FROM t1 AS y INNER JOIN t1 AS x } $t1_cross_t1 \ 513 4 { SELECT * FROM t1 AS y INNER JOIN t1 AS x } $t1_cross_t1 \
509 ] 514 ]
510 515
511 516 # EVIDENCE-OF: R-38465-03616 If there is an ON clause then the ON
512 # EVIDENCE-OF: R-22775-56496 If there is an ON clause specified, then 517 # expression is evaluated for each row of the cartesian product as a
513 # the ON expression is evaluated for each row of the cartesian product 518 # boolean expression. Only rows for which the expression evaluates to
514 # as a boolean expression. All rows for which the expression evaluates 519 # true are included from the dataset.
515 # to false are excluded from the dataset.
516 # 520 #
517 foreach {tn select res} [list \ 521 foreach {tn select res} [list \
518 1 { SELECT * FROM t1 %JOIN% t2 ON (1) } $t1_cross_t2 \ 522 1 { SELECT * FROM t1 %JOIN% t2 ON (1) } $t1_cross_t2 \
519 2 { SELECT * FROM t1 %JOIN% t2 ON (0) } [list] \ 523 2 { SELECT * FROM t1 %JOIN% t2 ON (0) } [list] \
520 3 { SELECT * FROM t1 %JOIN% t2 ON (NULL) } [list] \ 524 3 { SELECT * FROM t1 %JOIN% t2 ON (NULL) } [list] \
521 4 { SELECT * FROM t1 %JOIN% t2 ON ('abc') } [list] \ 525 4 { SELECT * FROM t1 %JOIN% t2 ON ('abc') } [list] \
522 5 { SELECT * FROM t1 %JOIN% t2 ON ('1ab') } $t1_cross_t2 \ 526 5 { SELECT * FROM t1 %JOIN% t2 ON ('1ab') } $t1_cross_t2 \
523 6 { SELECT * FROM t1 %JOIN% t2 ON (0.9) } $t1_cross_t2 \ 527 6 { SELECT * FROM t1 %JOIN% t2 ON (0.9) } $t1_cross_t2 \
524 7 { SELECT * FROM t1 %JOIN% t2 ON ('0.9') } $t1_cross_t2 \ 528 7 { SELECT * FROM t1 %JOIN% t2 ON ('0.9') } $t1_cross_t2 \
525 8 { SELECT * FROM t1 %JOIN% t2 ON (0.0) } [list] \ 529 8 { SELECT * FROM t1 %JOIN% t2 ON (0.0) } [list] \
526 \ 530 \
527 9 { SELECT t1.b, t2.b FROM t1 %JOIN% t2 ON (t1.a = t2.a) } \ 531 9 { SELECT t1.b, t2.b FROM t1 %JOIN% t2 ON (t1.a = t2.a) } \
528 {one I two II three III} \ 532 {one I two II three III} \
529 10 { SELECT t1.b, t2.b FROM t1 %JOIN% t2 ON (t1.a = 'a') } \ 533 10 { SELECT t1.b, t2.b FROM t1 %JOIN% t2 ON (t1.a = 'a') } \
530 {one I one II one III} \ 534 {one I one II one III} \
531 11 { SELECT t1.b, t2.b 535 11 { SELECT t1.b, t2.b
532 FROM t1 %JOIN% t2 ON (CASE WHEN t1.a = 'a' THEN NULL ELSE 1 END) } \ 536 FROM t1 %JOIN% t2 ON (CASE WHEN t1.a = 'a' THEN NULL ELSE 1 END) } \
533 {two I two II two III three I three II three III} \ 537 {two I two II two III three I three II three III} \
534 ] { 538 ] {
535 do_join_test e_select-1.3.$tn $select $res 539 do_join_test e_select-1.3.$tn $select $res
536 } 540 }
537 541
538 # EVIDENCE-OF: R-63358-54862 If there is a USING clause specified as 542 # EVIDENCE-OF: R-49933-05137 If there is a USING clause then each of the
539 # part of the join-constraint, then each of the column names specified 543 # column names specified must exist in the datasets to both the left and
540 # must exist in the datasets to both the left and right of the join-op. 544 # right of the join-operator.
541 # 545 #
542 do_select_tests e_select-1.4 -error { 546 do_select_tests e_select-1.4 -error {
543 cannot join using column %s - column not present in both tables 547 cannot join using column %s - column not present in both tables
544 } { 548 } {
545 1 { SELECT * FROM t1, t3 USING (b) } "b" 549 1 { SELECT * FROM t1, t3 USING (b) } "b"
546 2 { SELECT * FROM t3, t1 USING (c) } "c" 550 2 { SELECT * FROM t3, t1 USING (c) } "c"
547 3 { SELECT * FROM t3, (SELECT a AS b, b AS c FROM t1) USING (a) } "a" 551 3 { SELECT * FROM t3, (SELECT a AS b, b AS c FROM t1) USING (a) } "a"
548 } 552 }
549 553
550 # EVIDENCE-OF: R-55987-04584 For each pair of namesake columns, the 554 # EVIDENCE-OF: R-22776-52830 For each pair of named columns, the
551 # expression "lhs.X = rhs.X" is evaluated for each row of the cartesian 555 # expression "lhs.X = rhs.X" is evaluated for each row of the cartesian
552 # product as a boolean expression. All rows for which one or more of the 556 # product as a boolean expression. Only rows for which all such
553 # expressions evaluates to false are excluded from the result set. 557 # expressions evaluates to true are included from the result set.
554 # 558 #
555 do_select_tests e_select-1.5 { 559 do_select_tests e_select-1.5 {
556 1 { SELECT * FROM t1, t3 USING (a) } {a one 1 b two 2} 560 1 { SELECT * FROM t1, t3 USING (a) } {a one 1 b two 2}
557 2 { SELECT * FROM t3, t4 USING (a,c) } {b 2} 561 2 { SELECT * FROM t3, t4 USING (a,c) } {b 2}
558 } 562 }
559 563
560 # EVIDENCE-OF: R-54046-48600 When comparing values as a result of a 564 # EVIDENCE-OF: R-54046-48600 When comparing values as a result of a
561 # USING clause, the normal rules for handling affinities, collation 565 # USING clause, the normal rules for handling affinities, collation
562 # sequences and NULL values in comparisons apply. 566 # sequences and NULL values in comparisons apply.
563 # 567 #
564 # EVIDENCE-OF: R-35466-18578 The column from the dataset on the 568 # EVIDENCE-OF: R-38422-04402 The column from the dataset on the
565 # left-hand side of the join operator is considered to be on the 569 # left-hand side of the join-operator is considered to be on the
566 # left-hand side of the comparison operator (=) for the purposes of 570 # left-hand side of the comparison operator (=) for the purposes of
567 # collation sequence and affinity precedence. 571 # collation sequence and affinity precedence.
568 # 572 #
569 do_execsql_test e_select-1.6.0 { 573 do_execsql_test e_select-1.6.0 {
570 CREATE TABLE t5(a COLLATE nocase, b COLLATE binary); 574 CREATE TABLE t5(a COLLATE nocase, b COLLATE binary);
571 INSERT INTO t5 VALUES('AA', 'cc'); 575 INSERT INTO t5 VALUES('AA', 'cc');
572 INSERT INTO t5 VALUES('BB', 'dd'); 576 INSERT INTO t5 VALUES('BB', 'dd');
573 INSERT INTO t5 VALUES(NULL, NULL); 577 INSERT INTO t5 VALUES(NULL, NULL);
574 CREATE TABLE t6(a COLLATE binary, b COLLATE nocase); 578 CREATE TABLE t6(a COLLATE binary, b COLLATE nocase);
575 INSERT INTO t6 VALUES('aa', 'cc'); 579 INSERT INTO t6 VALUES('aa', 'cc');
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 614
611 4a { SELECT * FROM (SELECT a COLLATE nocase, b FROM t6) AS x 615 4a { SELECT * FROM (SELECT a COLLATE nocase, b FROM t6) AS x
612 %JOIN% t5 USING (a) } 616 %JOIN% t5 USING (a) }
613 {aa cc cc bb DD dd} 617 {aa cc cc bb DD dd}
614 4b { SELECT * FROM (SELECT a COLLATE nocase, b FROM t6) AS x 618 4b { SELECT * FROM (SELECT a COLLATE nocase, b FROM t6) AS x
615 %JOIN% t5 ON (x.a=t5.a) } 619 %JOIN% t5 ON (x.a=t5.a) }
616 {aa cc AA cc bb DD BB dd} 620 {aa cc AA cc bb DD BB dd}
617 } { 621 } {
618 do_join_test e_select-1.7.$tn $select $res 622 do_join_test e_select-1.7.$tn $select $res
619 } 623 }
620 624 # EVIDENCE-OF: R-42531-52874 If the join-operator is a "LEFT JOIN" or
621 # EVIDENCE-OF: R-41434-12448 If the join-op is a "LEFT JOIN" or "LEFT 625 # "LEFT OUTER JOIN", then after the ON or USING filtering clauses have
622 # OUTER JOIN", then after the ON or USING filtering clauses have been 626 # been applied, an extra row is added to the output for each row in the
623 # applied, an extra row is added to the output for each row in the
624 # original left-hand input dataset that corresponds to no rows at all in 627 # original left-hand input dataset that corresponds to no rows at all in
625 # the composite dataset (if any). 628 # the composite dataset (if any).
626 # 629 #
627 do_execsql_test e_select-1.8.0 { 630 do_execsql_test e_select-1.8.0 {
628 CREATE TABLE t7(a, b, c); 631 CREATE TABLE t7(a, b, c);
629 CREATE TABLE t8(a, d, e); 632 CREATE TABLE t8(a, d, e);
630 633
631 INSERT INTO t7 VALUES('x', 'ex', 24); 634 INSERT INTO t7 VALUES('x', 'ex', 24);
632 INSERT INTO t7 VALUES('y', 'why', 25); 635 INSERT INTO t7 VALUES('y', 'why', 25);
633 636
(...skipping 14 matching lines...) Expand all
648 # input dataset. 651 # input dataset.
649 # 652 #
650 do_select_tests e_select-1.9 { 653 do_select_tests e_select-1.9 {
651 1a "SELECT * FROM t7 JOIN t8 ON (t7.a=t8.a)" {x ex 24 x abc 24} 654 1a "SELECT * FROM t7 JOIN t8 ON (t7.a=t8.a)" {x ex 24 x abc 24}
652 1b "SELECT * FROM t7 LEFT JOIN t8 ON (t7.a=t8.a)" 655 1b "SELECT * FROM t7 LEFT JOIN t8 ON (t7.a=t8.a)"
653 {x ex 24 x abc 24 y why 25 {} {} {}} 656 {x ex 24 x abc 24 y why 25 {} {} {}}
654 2a "SELECT * FROM t7 JOIN t8 USING (a)" {x ex 24 abc 24} 657 2a "SELECT * FROM t7 JOIN t8 USING (a)" {x ex 24 abc 24}
655 2b "SELECT * FROM t7 LEFT JOIN t8 USING (a)" {x ex 24 abc 24 y why 25 {} {}} 658 2b "SELECT * FROM t7 LEFT JOIN t8 USING (a)" {x ex 24 abc 24 y why 25 {} {}}
656 } 659 }
657 660
658 # EVIDENCE-OF: R-01809-52134 If the NATURAL keyword is added to any of 661 # EVIDENCE-OF: R-04932-55942 If the NATURAL keyword is in the
659 # the join-ops, then an implicit USING clause is added to the 662 # join-operator then an implicit USING clause is added to the
660 # join-constraints. The implicit USING clause contains each of the 663 # join-constraints. The implicit USING clause contains each of the
661 # column names that appear in both the left and right-hand input 664 # column names that appear in both the left and right-hand input
662 # datasets. 665 # datasets.
663 # 666 #
664 do_select_tests e_select-1-10 { 667 do_select_tests e_select-1-10 {
665 1a "SELECT * FROM t7 JOIN t8 USING (a)" {x ex 24 abc 24} 668 1a "SELECT * FROM t7 JOIN t8 USING (a)" {x ex 24 abc 24}
666 1b "SELECT * FROM t7 NATURAL JOIN t8" {x ex 24 abc 24} 669 1b "SELECT * FROM t7 NATURAL JOIN t8" {x ex 24 abc 24}
667 670
668 2a "SELECT * FROM t8 JOIN t7 USING (a)" {x abc 24 ex 24} 671 2a "SELECT * FROM t8 JOIN t7 USING (a)" {x abc 24 ex 24}
669 2b "SELECT * FROM t8 NATURAL JOIN t7" {x abc 24 ex 24} 672 2b "SELECT * FROM t8 NATURAL JOIN t7" {x abc 24 ex 24}
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 INSERT INTO x1 VALUES(5, NULL, 96.28, NULL); 725 INSERT INTO x1 VALUES(5, NULL, 96.28, NULL);
723 INSERT INTO x1 VALUES(6, 0, 1, 2); 726 INSERT INTO x1 VALUES(6, 0, 1, 2);
724 727
725 CREATE TABLE x2(k, x, y2); 728 CREATE TABLE x2(k, x, y2);
726 INSERT INTO x2 VALUES(1, 50, X'B82838'); 729 INSERT INTO x2 VALUES(1, 50, X'B82838');
727 INSERT INTO x2 VALUES(5, 84.79, 65.88); 730 INSERT INTO x2 VALUES(5, 84.79, 65.88);
728 INSERT INTO x2 VALUES(3, -22, X'0E1BE452A393'); 731 INSERT INTO x2 VALUES(3, -22, X'0E1BE452A393');
729 INSERT INTO x2 VALUES(7, 'mistrusted', 'standardized'); 732 INSERT INTO x2 VALUES(7, 'mistrusted', 'standardized');
730 } {} 733 } {}
731 734
732 # EVIDENCE-OF: R-06999-14330 If a WHERE clause is specified, the WHERE 735 # EVIDENCE-OF: R-60775-64916 If a WHERE clause is specified, the WHERE
733 # expression is evaluated for each row in the input data as a boolean 736 # expression is evaluated for each row in the input data as a boolean
734 # expression. All rows for which the WHERE clause expression evaluates 737 # expression. Only rows for which the WHERE clause expression evaluates
735 # to false are excluded from the dataset before continuing. 738 # to true are included from the dataset before continuing.
736 # 739 #
737 do_execsql_test e_select-3.1.1 { SELECT k FROM x1 WHERE x } {3} 740 do_execsql_test e_select-3.1.1 { SELECT k FROM x1 WHERE x } {3}
738 do_execsql_test e_select-3.1.2 { SELECT k FROM x1 WHERE y } {3 5 6} 741 do_execsql_test e_select-3.1.2 { SELECT k FROM x1 WHERE y } {3 5 6}
739 do_execsql_test e_select-3.1.3 { SELECT k FROM x1 WHERE z } {1 2 6} 742 do_execsql_test e_select-3.1.3 { SELECT k FROM x1 WHERE z } {1 2 6}
740 do_execsql_test e_select-3.1.4 { SELECT k FROM x1 WHERE '1'||z } {1 2 4 6} 743 do_execsql_test e_select-3.1.4 { SELECT k FROM x1 WHERE '1'||z } {1 2 4 6}
741 do_execsql_test e_select-3.1.5 { SELECT k FROM x1 WHERE x IS NULL } {4 5} 744 do_execsql_test e_select-3.1.5 { SELECT k FROM x1 WHERE x IS NULL } {4 5}
742 do_execsql_test e_select-3.1.6 { SELECT k FROM x1 WHERE z - 78.43 } {2 4 6} 745 do_execsql_test e_select-3.1.6 { SELECT k FROM x1 WHERE z - 78.43 } {2 4 6}
743 746
744 do_execsql_test e_select-3.2.1a { 747 do_execsql_test e_select-3.2.1a {
745 SELECT k FROM x1 LEFT JOIN x2 USING(k) 748 SELECT k FROM x1 LEFT JOIN x2 USING(k)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 # 796 #
794 do_select_tests e_select-4.1 { 797 do_select_tests e_select-4.1 {
795 1 "SELECT * FROM z1 LIMIT 1" {51.65 -59.58 belfries} 798 1 "SELECT * FROM z1 LIMIT 1" {51.65 -59.58 belfries}
796 2 "SELECT * FROM z1,z2 LIMIT 1" {51.65 -59.58 belfries {} 21} 799 2 "SELECT * FROM z1,z2 LIMIT 1" {51.65 -59.58 belfries {} 21}
797 3 "SELECT z1.* FROM z1,z2 LIMIT 1" {51.65 -59.58 belfries} 800 3 "SELECT z1.* FROM z1,z2 LIMIT 1" {51.65 -59.58 belfries}
798 4 "SELECT z2.* FROM z1,z2 LIMIT 1" {{} 21} 801 4 "SELECT z2.* FROM z1,z2 LIMIT 1" {{} 21}
799 5 "SELECT z2.*, z1.* FROM z1,z2 LIMIT 1" {{} 21 51.65 -59.58 belfries} 802 5 "SELECT z2.*, z1.* FROM z1,z2 LIMIT 1" {{} 21 51.65 -59.58 belfries}
800 803
801 6 "SELECT count(*), * FROM z1" {6 63 born -26} 804 6 "SELECT count(*), * FROM z1" {6 63 born -26}
802 7 "SELECT max(a), * FROM z1" {63 63 born -26} 805 7 "SELECT max(a), * FROM z1" {63 63 born -26}
803 8 "SELECT *, min(a) FROM z1" {63 born -26 -5} 806 8 "SELECT *, min(a) FROM z1" {-5 {} 75 -5}
804 807
805 9 "SELECT *,* FROM z1,z2 LIMIT 1" { 808 9 "SELECT *,* FROM z1,z2 LIMIT 1" {
806 51.65 -59.58 belfries {} 21 51.65 -59.58 belfries {} 21 809 51.65 -59.58 belfries {} 21 51.65 -59.58 belfries {} 21
807 } 810 }
808 10 "SELECT z1.*,z1.* FROM z2,z1 LIMIT 1" { 811 10 "SELECT z1.*,z1.* FROM z2,z1 LIMIT 1" {
809 51.65 -59.58 belfries 51.65 -59.58 belfries 812 51.65 -59.58 belfries 51.65 -59.58 belfries
810 } 813 }
811 } 814 }
812 815
813 # EVIDENCE-OF: R-61869-22578 It is an error to use a "*" or "alias.*" 816 # EVIDENCE-OF: R-38023-18396 It is an error to use a "*" or "alias.*"
814 # expression in any context other than than a result expression list. 817 # expression in any context other than a result expression list.
815 # 818 #
816 # EVIDENCE-OF: R-44324-41166 It is also an error to use a "*" or 819 # EVIDENCE-OF: R-44324-41166 It is also an error to use a "*" or
817 # "alias.*" expression in a simple SELECT query that does not have a 820 # "alias.*" expression in a simple SELECT query that does not have a
818 # FROM clause. 821 # FROM clause.
819 # 822 #
820 foreach {tn select err} { 823 foreach {tn select err} {
821 1.1 "SELECT a, b, c FROM z1 WHERE *" {near "*": syntax error} 824 1.1 "SELECT a, b, c FROM z1 WHERE *" {near "*": syntax error}
822 1.2 "SELECT a, b, c FROM z1 GROUP BY *" {near "*": syntax error} 825 1.2 "SELECT a, b, c FROM z1 GROUP BY *" {near "*": syntax error}
823 1.3 "SELECT 1 + * FROM z1" {near "*": syntax error} 826 1.3 "SELECT 1 + * FROM z1" {near "*": syntax error}
824 1.4 "SELECT * + 1 FROM z1" {near "+": syntax error} 827 1.4 "SELECT * + 1 FROM z1" {near "+": syntax error}
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 INSERT INTO b2 VALUES('abc', 3); 1000 INSERT INTO b2 VALUES('abc', 3);
998 INSERT INTO b2 VALUES('xyz', 4); 1001 INSERT INTO b2 VALUES('xyz', 4);
999 1002
1000 CREATE TABLE b3(a COLLATE nocase, b COLLATE binary); 1003 CREATE TABLE b3(a COLLATE nocase, b COLLATE binary);
1001 INSERT INTO b3 VALUES('abc', 'abc'); 1004 INSERT INTO b3 VALUES('abc', 'abc');
1002 INSERT INTO b3 VALUES('aBC', 'aBC'); 1005 INSERT INTO b3 VALUES('aBC', 'aBC');
1003 INSERT INTO b3 VALUES('Def', 'Def'); 1006 INSERT INTO b3 VALUES('Def', 'Def');
1004 INSERT INTO b3 VALUES('dEF', 'dEF'); 1007 INSERT INTO b3 VALUES('dEF', 'dEF');
1005 } {} 1008 } {}
1006 1009
1007 # EVIDENCE-OF: R-57754-57109 If the SELECT statement is an aggregate 1010 # EVIDENCE-OF: R-07284-35990 If the SELECT statement is an aggregate
1008 # query with a GROUP BY clause, then each of the expressions specified 1011 # query with a GROUP BY clause, then each of the expressions specified
1009 # as part of the GROUP BY clause is evaluated for each row of the 1012 # as part of the GROUP BY clause is evaluated for each row of the
1010 # dataset. Each row is then assigned to a "group" based on the results; 1013 # dataset. Each row is then assigned to a "group" based on the results;
1011 # rows for which the results of evaluating the GROUP BY expressions are 1014 # rows for which the results of evaluating the GROUP BY expressions are
1012 # the same are assigned to the same group. 1015 # the same get assigned to the same group.
1013 # 1016 #
1014 # These tests also show that the following is not untrue: 1017 # These tests also show that the following is not untrue:
1015 # 1018 #
1016 # EVIDENCE-OF: R-25883-55063 The expressions in the GROUP BY clause do 1019 # EVIDENCE-OF: R-25883-55063 The expressions in the GROUP BY clause do
1017 # not have to be expressions that appear in the result. 1020 # not have to be expressions that appear in the result.
1018 # 1021 #
1019 do_select_tests e_select-4.9 { 1022 do_select_tests e_select-4.9 {
1020 1 "SELECT group_concat(one), two FROM b1 GROUP BY two" { 1023 1 "SELECT group_concat(one), two FROM b1 GROUP BY two" {
1021 4,5 f 1 o 7,6 s 3,2 t 1024 /#,# f 1 o #,# s #,# t/
1022 } 1025 }
1023 2 "SELECT group_concat(one), sum(one) FROM b1 GROUP BY (one>4)" { 1026 2 "SELECT group_concat(one), sum(one) FROM b1 GROUP BY (one>4)" {
1024 1,4,3,2 10 5,7,6 18 1027 1,2,3,4 10 5,6,7 18
1025 } 1028 }
1026 3 "SELECT group_concat(one) FROM b1 GROUP BY (two>'o'), one%2" { 1029 3 "SELECT group_concat(one) FROM b1 GROUP BY (two>'o'), one%2" {
1027 4 1,5 2,6 3,7 1030 4 1,5 2,6 3,7
1028 } 1031 }
1029 4 "SELECT group_concat(one) FROM b1 GROUP BY (one==2 OR two=='o')" { 1032 4 "SELECT group_concat(one) FROM b1 GROUP BY (one==2 OR two=='o')" {
1030 4,3,5,7,6 1,2 1033 4,3,5,7,6 1,2
1031 } 1034 }
1032 } 1035 }
1033 1036
1034 # EVIDENCE-OF: R-14926-50129 For the purposes of grouping rows, NULL 1037 # EVIDENCE-OF: R-14926-50129 For the purposes of grouping rows, NULL
1035 # values are considered equal. 1038 # values are considered equal.
1036 # 1039 #
1037 do_select_tests e_select-4.10 { 1040 do_select_tests e_select-4.10 {
1038 1 "SELECT group_concat(y) FROM b2 GROUP BY x" {0,1 3 2,4} 1041 1 "SELECT group_concat(y) FROM b2 GROUP BY x" {/#,# 3 #,#/}
1039 2 "SELECT count(*) FROM b2 GROUP BY CASE WHEN y<4 THEN NULL ELSE 0 END" {4 1} 1042 2 "SELECT count(*) FROM b2 GROUP BY CASE WHEN y<4 THEN NULL ELSE 0 END" {4 1}
1040 } 1043 }
1041 1044
1042 # EVIDENCE-OF: R-10470-30318 The usual rules for selecting a collation 1045 # EVIDENCE-OF: R-10470-30318 The usual rules for selecting a collation
1043 # sequence with which to compare text values apply when evaluating 1046 # sequence with which to compare text values apply when evaluating
1044 # expressions in a GROUP BY clause. 1047 # expressions in a GROUP BY clause.
1045 # 1048 #
1046 do_select_tests e_select-4.11 { 1049 do_select_tests e_select-4.11 {
1047 1 "SELECT count(*) FROM b3 GROUP BY b" {1 1 1 1} 1050 1 "SELECT count(*) FROM b3 GROUP BY b" {1 1 1 1}
1048 2 "SELECT count(*) FROM b3 GROUP BY a" {2 2} 1051 2 "SELECT count(*) FROM b3 GROUP BY a" {2 2}
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 # follow the SELECT keyword in a simple SELECT statement. 1217 # follow the SELECT keyword in a simple SELECT statement.
1215 # 1218 #
1216 do_select_tests e_select-5.1 { 1219 do_select_tests e_select-5.1 {
1217 1 "SELECT ALL a FROM h1" {1 1 1 4 4 4} 1220 1 "SELECT ALL a FROM h1" {1 1 1 4 4 4}
1218 2 "SELECT DISTINCT a FROM h1" {1 4} 1221 2 "SELECT DISTINCT a FROM h1" {1 4}
1219 } 1222 }
1220 1223
1221 # EVIDENCE-OF: R-08861-34280 If the simple SELECT is a SELECT ALL, then 1224 # EVIDENCE-OF: R-08861-34280 If the simple SELECT is a SELECT ALL, then
1222 # the entire set of result rows are returned by the SELECT. 1225 # the entire set of result rows are returned by the SELECT.
1223 # 1226 #
1224 # EVIDENCE-OF: R-47911-02086 If neither ALL or DISTINCT are present, 1227 # EVIDENCE-OF: R-01256-01950 If neither ALL or DISTINCT are present,
1225 # then the behaviour is as if ALL were specified. 1228 # then the behavior is as if ALL were specified.
1226 # 1229 #
1227 # EVIDENCE-OF: R-14442-41305 If the simple SELECT is a SELECT DISTINCT, 1230 # EVIDENCE-OF: R-14442-41305 If the simple SELECT is a SELECT DISTINCT,
1228 # then duplicate rows are removed from the set of result rows before it 1231 # then duplicate rows are removed from the set of result rows before it
1229 # is returned. 1232 # is returned.
1230 # 1233 #
1231 # The three testable statements above are tested by e_select-5.2.*, 1234 # The three testable statements above are tested by e_select-5.2.*,
1232 # 5.3.* and 5.4.* respectively. 1235 # 5.3.* and 5.4.* respectively.
1233 # 1236 #
1234 do_select_tests e_select-5 { 1237 do_select_tests e_select-5 {
1235 3.1 "SELECT ALL x FROM h2" {One Two Three Four one two three four} 1238 3.1 "SELECT ALL x FROM h2" {One Two Three Four one two three four}
1236 3.2 "SELECT ALL x FROM h1, h2 ON (x=b)" {One one Four four} 1239 3.2 "SELECT ALL x FROM h1, h2 ON (x=b)" {One one Four four}
1237 1240
1238 3.1 "SELECT x FROM h2" {One Two Three Four one two three four} 1241 3.1 "SELECT x FROM h2" {One Two Three Four one two three four}
1239 3.2 "SELECT x FROM h1, h2 ON (x=b)" {One one Four four} 1242 3.2 "SELECT x FROM h1, h2 ON (x=b)" {One one Four four}
1240 1243
1241 4.1 "SELECT DISTINCT x FROM h2" {four one three two} 1244 4.1 "SELECT DISTINCT x FROM h2" {One Two Three Four}
1242 4.2 "SELECT DISTINCT x FROM h1, h2 ON (x=b)" {four one} 1245 4.2 "SELECT DISTINCT x FROM h1, h2 ON (x=b)" {One Four}
1243 } 1246 }
1244 1247
1245 # EVIDENCE-OF: R-02054-15343 For the purposes of detecting duplicate 1248 # EVIDENCE-OF: R-02054-15343 For the purposes of detecting duplicate
1246 # rows, two NULL values are considered to be equal. 1249 # rows, two NULL values are considered to be equal.
1247 # 1250 #
1248 do_select_tests e_select-5.5 { 1251 do_select_tests e_select-5.5 {
1249 1 "SELECT DISTINCT d FROM h3" {{} 2 2,3 2,4 3} 1252 1 "SELECT DISTINCT d FROM h3" {{} 2 2,3 2,4 3}
1250 } 1253 }
1251 1254
1252 # EVIDENCE-OF: R-58359-52112 The normal rules for selecting a collation 1255 # EVIDENCE-OF: R-58359-52112 The normal rules for selecting a collation
1253 # sequence to compare text values with apply. 1256 # sequence to compare text values with apply.
1254 # 1257 #
1255 do_select_tests e_select-5.6 { 1258 do_select_tests e_select-5.6 {
1256 1 "SELECT DISTINCT b FROM h1" {I IV four i iv one} 1259 1 "SELECT DISTINCT b FROM h1" {one I i four IV iv}
1257 2 "SELECT DISTINCT b COLLATE nocase FROM h1" {four i iv one} 1260 2 "SELECT DISTINCT b COLLATE nocase FROM h1" {one I four IV}
1258 3 "SELECT DISTINCT x FROM h2" {four one three two} 1261 3 "SELECT DISTINCT x FROM h2" {One Two Three Four}
1259 4 "SELECT DISTINCT x COLLATE binary FROM h2" { 1262 4 "SELECT DISTINCT x COLLATE binary FROM h2" {
1260 Four One Three Two four one three two 1263 One Two Three Four one two three four
1261 } 1264 }
1262 } 1265 }
1263 1266
1264 #------------------------------------------------------------------------- 1267 #-------------------------------------------------------------------------
1265 # The following tests - e_select-7.* - test that statements made to do 1268 # The following tests - e_select-7.* - test that statements made to do
1266 # with compound SELECT statements are correct. 1269 # with compound SELECT statements are correct.
1267 # 1270 #
1268 1271
1269 # EVIDENCE-OF: R-39368-64333 In a compound SELECT, all the constituent 1272 # EVIDENCE-OF: R-39368-64333 In a compound SELECT, all the constituent
1270 # SELECTs must return the same number of result columns. 1273 # SELECTs must return the same number of result columns.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 LIMIT {INTERSECT} 1364 LIMIT {INTERSECT}
1362 23 "SELECT * FROM j1 LIMIT 10 OFFSET 5 INTERSECT SELECT * FROM j2,j3" 1365 23 "SELECT * FROM j1 LIMIT 10 OFFSET 5 INTERSECT SELECT * FROM j2,j3"
1363 LIMIT {INTERSECT} 1366 LIMIT {INTERSECT}
1364 24 "SELECT a FROM j1 LIMIT (SELECT e FROM j2) INTERSECT SELECT g FROM j2,j3" 1367 24 "SELECT a FROM j1 LIMIT (SELECT e FROM j2) INTERSECT SELECT g FROM j2,j3"
1365 LIMIT {INTERSECT} 1368 LIMIT {INTERSECT}
1366 } { 1369 } {
1367 set err "$op1 clause should come after $op2 not before" 1370 set err "$op1 clause should come after $op2 not before"
1368 do_catchsql_test e_select-7.2.$tn $select [list 1 $err] 1371 do_catchsql_test e_select-7.2.$tn $select [list 1 $err]
1369 } 1372 }
1370 1373
1371 # EVIDENCE-OF: R-22874-32655 ORDER BY and LIMIT clauses may only occur 1374 # EVIDENCE-OF: R-45440-25633 ORDER BY and LIMIT clauses may only occur
1372 # at the end of the entire compound SELECT. 1375 # at the end of the entire compound SELECT, and then only if the final
1376 # element of the compound is not a VALUES clause.
1373 # 1377 #
1374 foreach {tn select} { 1378 foreach {tn select} {
1375 1 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 ORDER BY a" 1379 1 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 ORDER BY a"
1376 2 "SELECT count(*) FROM j1 UNION ALL SELECT max(e) FROM j2 ORDER BY 1" 1380 2 "SELECT count(*) FROM j1 UNION ALL SELECT max(e) FROM j2 ORDER BY 1"
1377 3 "SELECT count(*), * FROM j1 UNION ALL SELECT *,* FROM j2 ORDER BY 1,2,3" 1381 3 "SELECT count(*), * FROM j1 UNION ALL SELECT *,* FROM j2 ORDER BY 1,2,3"
1378 4 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 LIMIT 10" 1382 4 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 LIMIT 10"
1379 5 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 LIMIT 10 OFFSET 5" 1383 5 "SELECT * FROM j1 UNION ALL SELECT * FROM j2,j3 LIMIT 10 OFFSET 5"
1380 6 "SELECT a FROM j1 UNION ALL SELECT g FROM j2,j3 LIMIT (SELECT 10)" 1384 6 "SELECT a FROM j1 UNION ALL SELECT g FROM j2,j3 LIMIT (SELECT 10)"
1381 1385
1382 7 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 ORDER BY a" 1386 7 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 ORDER BY a"
1383 8 "SELECT count(*) FROM j1 UNION SELECT max(e) FROM j2 ORDER BY 1" 1387 8 "SELECT count(*) FROM j1 UNION SELECT max(e) FROM j2 ORDER BY 1"
1388 8b "VALUES('8b') UNION SELECT max(e) FROM j2 ORDER BY 1"
1384 9 "SELECT count(*), * FROM j1 UNION SELECT *,* FROM j2 ORDER BY 1,2,3" 1389 9 "SELECT count(*), * FROM j1 UNION SELECT *,* FROM j2 ORDER BY 1,2,3"
1385 10 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10" 1390 10 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10"
1386 11 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10 OFFSET 5" 1391 11 "SELECT * FROM j1 UNION SELECT * FROM j2,j3 LIMIT 10 OFFSET 5"
1387 12 "SELECT a FROM j1 UNION SELECT g FROM j2,j3 LIMIT (SELECT 10)" 1392 12 "SELECT a FROM j1 UNION SELECT g FROM j2,j3 LIMIT (SELECT 10)"
1388 1393
1389 13 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 ORDER BY a" 1394 13 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 ORDER BY a"
1390 14 "SELECT count(*) FROM j1 EXCEPT SELECT max(e) FROM j2 ORDER BY 1" 1395 14 "SELECT count(*) FROM j1 EXCEPT SELECT max(e) FROM j2 ORDER BY 1"
1391 15 "SELECT count(*), * FROM j1 EXCEPT SELECT *,* FROM j2 ORDER BY 1,2,3" 1396 15 "SELECT count(*), * FROM j1 EXCEPT SELECT *,* FROM j2 ORDER BY 1,2,3"
1392 16 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 LIMIT 10" 1397 16 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 LIMIT 10"
1393 17 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 LIMIT 10 OFFSET 5" 1398 17 "SELECT * FROM j1 EXCEPT SELECT * FROM j2,j3 LIMIT 10 OFFSET 5"
1394 18 "SELECT a FROM j1 EXCEPT SELECT g FROM j2,j3 LIMIT (SELECT 10)" 1399 18 "SELECT a FROM j1 EXCEPT SELECT g FROM j2,j3 LIMIT (SELECT 10)"
1395 1400
1396 19 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 ORDER BY a" 1401 19 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 ORDER BY a"
1397 20 "SELECT count(*) FROM j1 INTERSECT SELECT max(e) FROM j2 ORDER BY 1" 1402 20 "SELECT count(*) FROM j1 INTERSECT SELECT max(e) FROM j2 ORDER BY 1"
1398 21 "SELECT count(*), * FROM j1 INTERSECT SELECT *,* FROM j2 ORDER BY 1,2,3" 1403 21 "SELECT count(*), * FROM j1 INTERSECT SELECT *,* FROM j2 ORDER BY 1,2,3"
1399 22 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 LIMIT 10" 1404 22 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 LIMIT 10"
1400 23 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 LIMIT 10 OFFSET 5" 1405 23 "SELECT * FROM j1 INTERSECT SELECT * FROM j2,j3 LIMIT 10 OFFSET 5"
1401 24 "SELECT a FROM j1 INTERSECT SELECT g FROM j2,j3 LIMIT (SELECT 10)" 1406 24 "SELECT a FROM j1 INTERSECT SELECT g FROM j2,j3 LIMIT (SELECT 10)"
1402 } { 1407 } {
1403 do_test e_select-7.3.$tn { catch {execsql $select} msg } 0 1408 do_test e_select-7.3.$tn { catch {execsql $select} msg } 0
1404 } 1409 }
1410 foreach {tn select} {
1411 50 "SELECT * FROM j1 ORDER BY 1 UNION ALL SELECT * FROM j2,j3"
1412 51 "SELECT * FROM j1 LIMIT 1 UNION ALL SELECT * FROM j2,j3"
1413 52 "SELECT count(*) FROM j1 UNION ALL VALUES(11) ORDER BY 1"
1414 53 "SELECT count(*) FROM j1 UNION ALL VALUES(11) LIMIT 1"
1415 } {
1416 do_test e_select-7.3.$tn { catch {execsql $select} msg } 1
1417 }
1405 1418
1406 # EVIDENCE-OF: R-08531-36543 A compound SELECT created using UNION ALL 1419 # EVIDENCE-OF: R-08531-36543 A compound SELECT created using UNION ALL
1407 # operator returns all the rows from the SELECT to the left of the UNION 1420 # operator returns all the rows from the SELECT to the left of the UNION
1408 # ALL operator, and all the rows from the SELECT to the right of it. 1421 # ALL operator, and all the rows from the SELECT to the right of it.
1409 # 1422 #
1410 drop_all_tables 1423 drop_all_tables
1411 do_execsql_test e_select-7.4.0 { 1424 do_execsql_test e_select-7.4.0 {
1412 CREATE TABLE q1(a TEXT, b INTEGER, c); 1425 CREATE TABLE q1(a TEXT, b INTEGER, c);
1413 CREATE TABLE q2(d NUMBER, e BLOB); 1426 CREATE TABLE q2(d NUMBER, e BLOB);
1414 CREATE TABLE q3(f REAL, g); 1427 CREATE TABLE q3(f REAL, g);
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1733 } 1746 }
1734 6 "SELECT * FROM d1 ORDER BY 1 DESC, 2, 3 DESC" { 1747 6 "SELECT * FROM d1 ORDER BY 1 DESC, 2, 3 DESC" {
1735 2 4 93 2 5 -1 1 2 8 1 2 7 1748 2 4 93 2 5 -1 1 2 8 1 2 7
1736 1 2 3 1 2 -20 1 4 93 1 5 -1 1749 1 2 3 1 2 -20 1 4 93 1 5 -1
1737 } 1750 }
1738 7 "SELECT * FROM d1 ORDER BY 1 DESC, 2, 3" { 1751 7 "SELECT * FROM d1 ORDER BY 1 DESC, 2, 3" {
1739 2 4 93 2 5 -1 1 2 -20 1 2 3 1752 2 4 93 2 5 -1 1 2 -20 1 2 3
1740 1 2 7 1 2 8 1 4 93 1 5 -1 1753 1 2 7 1 2 8 1 4 93 1 5 -1
1741 } 1754 }
1742 8 "SELECT z, x FROM d1 ORDER BY 2" { 1755 8 "SELECT z, x FROM d1 ORDER BY 2" {
1743 3 1 8 1 7 1 -20 1 1756 /# 1 # 1 # 1 # 1
1744 93 1 -1 1 -1 2 93 2 1757 # 1 # 1 # 2 # 2/
1745 } 1758 }
1746 9 "SELECT z, x FROM d1 ORDER BY 1" { 1759 9 "SELECT z, x FROM d1 ORDER BY 1" {
1747 -20 1 -1 2 -1 1 3 1 1760 /-20 1 -1 # -1 # 3 1
1748 7 1 8 1 93 2 93 1 1761 7 1 8 1 93 # 93 #/
1749 } 1762 }
1750 } 1763 }
1751 1764
1752 # EVIDENCE-OF: R-63286-51977 If the ORDER BY expression is an identifier 1765 # EVIDENCE-OF: R-63286-51977 If the ORDER BY expression is an identifier
1753 # that corresponds to the alias of one of the output columns, then the 1766 # that corresponds to the alias of one of the output columns, then the
1754 # expression is considered an alias for that column. 1767 # expression is considered an alias for that column.
1755 # 1768 #
1756 do_select_tests e_select-8.5 { 1769 do_select_tests e_select-8.5 {
1757 1 "SELECT z+1 AS abc FROM d1 ORDER BY abc" { 1770 1 "SELECT z+1 AS abc FROM d1 ORDER BY abc" {
1758 -19 0 0 4 8 9 94 94 1771 -19 0 0 4 8 9 94 94
1759 } 1772 }
1760 2 "SELECT z+1 AS abc FROM d1 ORDER BY abc DESC" { 1773 2 "SELECT z+1 AS abc FROM d1 ORDER BY abc DESC" {
1761 94 94 9 8 4 0 0 -19 1774 94 94 9 8 4 0 0 -19
1762 } 1775 }
1763 3 "SELECT z AS x, x AS z FROM d1 ORDER BY z" { 1776 3 "SELECT z AS x, x AS z FROM d1 ORDER BY z" {
1764 3 1 8 1 7 1 -20 1 93 1 -1 1 -1 2 93 2 1777 /# 1 # 1 # 1 # 1 # 1 # 1 # 2 # 2/
1765 } 1778 }
1766 4 "SELECT z AS x, x AS z FROM d1 ORDER BY x" { 1779 4 "SELECT z AS x, x AS z FROM d1 ORDER BY x" {
1767 -20 1 -1 2 -1 1 3 1 7 1 8 1 93 2 93 1 1780 /-20 1 -1 # -1 # 3 1 7 1 8 1 93 # 93 #/
1768 } 1781 }
1769 } 1782 }
1770 1783
1771 # EVIDENCE-OF: R-27923-38747 Otherwise, if the ORDER BY expression is 1784 # EVIDENCE-OF: R-65068-27207 Otherwise, if the ORDER BY expression is
1772 # any other expression, it is evaluated and the the returned value used 1785 # any other expression, it is evaluated and the returned value used to
1773 # to order the output rows. 1786 # order the output rows.
1774 # 1787 #
1775 # EVIDENCE-OF: R-03421-57988 If the SELECT statement is a simple SELECT, 1788 # EVIDENCE-OF: R-03421-57988 If the SELECT statement is a simple SELECT,
1776 # then an ORDER BY may contain any arbitrary expressions. 1789 # then an ORDER BY may contain any arbitrary expressions.
1777 # 1790 #
1778 do_select_tests e_select-8.6 { 1791 do_select_tests e_select-8.6 {
1779 1 "SELECT * FROM d1 ORDER BY x+y+z" { 1792 1 "SELECT * FROM d1 ORDER BY x+y+z" {
1780 1 2 -20 1 5 -1 1 2 3 2 5 -1 1793 1 2 -20 1 5 -1 1 2 3 2 5 -1
1781 1 2 7 1 2 8 1 4 93 2 4 93 1794 1 2 7 1 2 8 1 4 93 2 4 93
1782 } 1795 }
1783 2 "SELECT * FROM d1 ORDER BY x*z" { 1796 2 "SELECT * FROM d1 ORDER BY x*z" {
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
2153 2166
2154 8 { SELECT b FROM f1 ORDER BY a LIMIT 20, 10 } {u v w x y z} 2167 8 { SELECT b FROM f1 ORDER BY a LIMIT 20, 10 } {u v w x y z}
2155 9 { SELECT a FROM f1 ORDER BY a DESC LIMIT 18+4, 100 } {4 3 2 1} 2168 9 { SELECT a FROM f1 ORDER BY a DESC LIMIT 18+4, 100 } {4 3 2 1}
2156 2169
2157 10 { SELECT b FROM f1 ORDER BY a LIMIT -1, 5 } {a b c d e} 2170 10 { SELECT b FROM f1 ORDER BY a LIMIT -1, 5 } {a b c d e}
2158 11 { SELECT b FROM f1 ORDER BY a LIMIT -500, 5 } {a b c d e} 2171 11 { SELECT b FROM f1 ORDER BY a LIMIT -500, 5 } {a b c d e}
2159 12 { SELECT b FROM f1 ORDER BY a LIMIT 0, 5 } {a b c d e} 2172 12 { SELECT b FROM f1 ORDER BY a LIMIT 0, 5 } {a b c d e}
2160 } 2173 }
2161 2174
2162 finish_test 2175 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698