blob: 51a1b1c4c512169e7a201b370c7ea70b7b5e71b0 [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh92dba242000-06-08 00:28:51 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh92dba242000-06-08 00:28:51 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
drh92dba242000-06-08 00:28:51 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is testing UNION, INTERSECT and EXCEPT operators
13# in SELECT statements.
14#
drh92dba242000-06-08 00:28:51 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
danielk197727c77432004-11-22 13:35:41 +000019# Most tests in this file depend on compound-select. But there are a couple
20# right at the end that test DISTINCT, so we cannot omit the entire file.
21#
22ifcapable compound {
23
drh92dba242000-06-08 00:28:51 +000024# Build some test data
25#
drh92cd52f2000-06-08 01:55:29 +000026execsql {
27 CREATE TABLE t1(n int, log int);
drh5f3b4ab2004-05-27 17:22:54 +000028 BEGIN;
drh92cd52f2000-06-08 01:55:29 +000029}
drh5f3b4ab2004-05-27 17:22:54 +000030for {set i 1} {$i<32} {incr i} {
danielk197724acd8f2008-01-16 18:20:41 +000031 for {set j 0} {(1<<$j)<$i} {incr j} {}
drh5f3b4ab2004-05-27 17:22:54 +000032 execsql "INSERT INTO t1 VALUES($i,$j)"
33}
34execsql {
35 COMMIT;
36}
drh92cd52f2000-06-08 01:55:29 +000037
drh92dba242000-06-08 00:28:51 +000038do_test select4-1.0 {
drh92dba242000-06-08 00:28:51 +000039 execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
40} {0 1 2 3 4 5}
41
42# Union All operator
43#
44do_test select4-1.1a {
45 lsort [execsql {SELECT DISTINCT log FROM t1}]
46} {0 1 2 3 4 5}
47do_test select4-1.1b {
48 lsort [execsql {SELECT n FROM t1 WHERE log=3}]
49} {5 6 7 8}
50do_test select4-1.1c {
51 execsql {
52 SELECT DISTINCT log FROM t1
53 UNION ALL
54 SELECT n FROM t1 WHERE log=3
55 ORDER BY log;
56 }
57} {0 1 2 3 4 5 5 6 7 8}
drhc926afb2002-06-20 03:38:26 +000058do_test select4-1.1d {
59 execsql {
60 CREATE TABLE t2 AS
61 SELECT DISTINCT log FROM t1
62 UNION ALL
63 SELECT n FROM t1 WHERE log=3
64 ORDER BY log;
65 SELECT * FROM t2;
66 }
67} {0 1 2 3 4 5 5 6 7 8}
68execsql {DROP TABLE t2}
69do_test select4-1.1e {
70 execsql {
71 CREATE TABLE t2 AS
72 SELECT DISTINCT log FROM t1
73 UNION ALL
74 SELECT n FROM t1 WHERE log=3
75 ORDER BY log DESC;
76 SELECT * FROM t2;
77 }
78} {8 7 6 5 5 4 3 2 1 0}
79execsql {DROP TABLE t2}
drhf46f9052002-06-22 02:33:38 +000080do_test select4-1.1f {
81 execsql {
82 SELECT DISTINCT log FROM t1
83 UNION ALL
84 SELECT n FROM t1 WHERE log=2
85 }
86} {0 1 2 3 4 5 3 4}
87do_test select4-1.1g {
88 execsql {
89 CREATE TABLE t2 AS
90 SELECT DISTINCT log FROM t1
91 UNION ALL
92 SELECT n FROM t1 WHERE log=2;
93 SELECT * FROM t2;
94 }
95} {0 1 2 3 4 5 3 4}
96execsql {DROP TABLE t2}
danielk1977e61b9f42005-01-21 04:25:47 +000097ifcapable subquery {
98 do_test select4-1.2 {
99 execsql {
100 SELECT log FROM t1 WHERE n IN
101 (SELECT DISTINCT log FROM t1 UNION ALL
102 SELECT n FROM t1 WHERE log=3)
103 ORDER BY log;
104 }
105 } {0 1 2 2 3 3 3 3}
106}
drh2af878e2015-03-05 01:29:51 +0000107
108# EVIDENCE-OF: R-02644-22131 In a compound SELECT statement, only the
109# last or right-most simple SELECT may have an ORDER BY clause.
110#
drh92cd52f2000-06-08 01:55:29 +0000111do_test select4-1.3 {
112 set v [catch {execsql {
113 SELECT DISTINCT log FROM t1 ORDER BY log
114 UNION ALL
115 SELECT n FROM t1 WHERE log=3
116 ORDER BY log;
117 }} msg]
118 lappend v $msg
119} {1 {ORDER BY clause should come after UNION ALL not before}}
drha276e3f2015-04-16 16:22:27 +0000120do_catchsql_test select4-1.4 {
drh7b4da152015-04-17 18:52:37 +0000121 SELECT (VALUES(0) INTERSECT SELECT(0) UNION SELECT(0) ORDER BY 1 UNION
drha276e3f2015-04-16 16:22:27 +0000122 SELECT 0 UNION SELECT 0 ORDER BY 1);
123} {1 {ORDER BY clause should come after UNION not before}}
drh92dba242000-06-08 00:28:51 +0000124
125# Union operator
126#
127do_test select4-2.1 {
128 execsql {
129 SELECT DISTINCT log FROM t1
130 UNION
131 SELECT n FROM t1 WHERE log=3
132 ORDER BY log;
133 }
134} {0 1 2 3 4 5 6 7 8}
danielk1977e61b9f42005-01-21 04:25:47 +0000135ifcapable subquery {
136 do_test select4-2.2 {
137 execsql {
138 SELECT log FROM t1 WHERE n IN
139 (SELECT DISTINCT log FROM t1 UNION
140 SELECT n FROM t1 WHERE log=3)
141 ORDER BY log;
142 }
143 } {0 1 2 2 3 3 3 3}
144}
drh92cd52f2000-06-08 01:55:29 +0000145do_test select4-2.3 {
146 set v [catch {execsql {
147 SELECT DISTINCT log FROM t1 ORDER BY log
148 UNION
149 SELECT n FROM t1 WHERE log=3
150 ORDER BY log;
151 }} msg]
152 lappend v $msg
153} {1 {ORDER BY clause should come after UNION not before}}
drh7b4da152015-04-17 18:52:37 +0000154do_test select4-2.4 {
155 set v [catch {execsql {
156 SELECT 0 ORDER BY (SELECT 0) UNION SELECT 0;
157 }} msg]
158 lappend v $msg
159} {1 {ORDER BY clause should come after UNION not before}}
drh9b40e472015-05-07 00:09:29 +0000160do_execsql_test select4-2.5 {
161 SELECT 123 AS x ORDER BY (SELECT x ORDER BY 1);
162} {123}
drh92dba242000-06-08 00:28:51 +0000163
164# Except operator
165#
drhc926afb2002-06-20 03:38:26 +0000166do_test select4-3.1.1 {
drh92dba242000-06-08 00:28:51 +0000167 execsql {
168 SELECT DISTINCT log FROM t1
169 EXCEPT
170 SELECT n FROM t1 WHERE log=3
171 ORDER BY log;
172 }
173} {0 1 2 3 4}
drhc926afb2002-06-20 03:38:26 +0000174do_test select4-3.1.2 {
175 execsql {
176 CREATE TABLE t2 AS
177 SELECT DISTINCT log FROM t1
178 EXCEPT
179 SELECT n FROM t1 WHERE log=3
180 ORDER BY log;
181 SELECT * FROM t2;
182 }
183} {0 1 2 3 4}
184execsql {DROP TABLE t2}
185do_test select4-3.1.3 {
186 execsql {
187 CREATE TABLE t2 AS
188 SELECT DISTINCT log FROM t1
189 EXCEPT
190 SELECT n FROM t1 WHERE log=3
191 ORDER BY log DESC;
192 SELECT * FROM t2;
193 }
194} {4 3 2 1 0}
195execsql {DROP TABLE t2}
danielk1977e61b9f42005-01-21 04:25:47 +0000196ifcapable subquery {
197 do_test select4-3.2 {
198 execsql {
199 SELECT log FROM t1 WHERE n IN
200 (SELECT DISTINCT log FROM t1 EXCEPT
201 SELECT n FROM t1 WHERE log=3)
202 ORDER BY log;
203 }
204 } {0 1 2 2}
205}
drh92cd52f2000-06-08 01:55:29 +0000206do_test select4-3.3 {
207 set v [catch {execsql {
208 SELECT DISTINCT log FROM t1 ORDER BY log
209 EXCEPT
210 SELECT n FROM t1 WHERE log=3
211 ORDER BY log;
212 }} msg]
213 lappend v $msg
214} {1 {ORDER BY clause should come after EXCEPT not before}}
drh92dba242000-06-08 00:28:51 +0000215
216# Intersect operator
217#
drhc926afb2002-06-20 03:38:26 +0000218do_test select4-4.1.1 {
drh92dba242000-06-08 00:28:51 +0000219 execsql {
220 SELECT DISTINCT log FROM t1
221 INTERSECT
222 SELECT n FROM t1 WHERE log=3
223 ORDER BY log;
224 }
225} {5}
danielk1977452c9892004-05-13 05:16:15 +0000226
drhc926afb2002-06-20 03:38:26 +0000227do_test select4-4.1.2 {
228 execsql {
drh1e281292007-12-13 03:45:07 +0000229 SELECT DISTINCT log FROM t1
230 UNION ALL
231 SELECT 6
drhc926afb2002-06-20 03:38:26 +0000232 INTERSECT
233 SELECT n FROM t1 WHERE log=3
drh1e281292007-12-13 03:45:07 +0000234 ORDER BY t1.log;
drhc926afb2002-06-20 03:38:26 +0000235 }
236} {5 6}
drh1e281292007-12-13 03:45:07 +0000237
drhc926afb2002-06-20 03:38:26 +0000238do_test select4-4.1.3 {
239 execsql {
240 CREATE TABLE t2 AS
danielk19773d1bfea2004-05-14 11:00:53 +0000241 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
drhc926afb2002-06-20 03:38:26 +0000242 INTERSECT
243 SELECT n FROM t1 WHERE log=3
244 ORDER BY log;
245 SELECT * FROM t2;
246 }
247} {5 6}
248execsql {DROP TABLE t2}
249do_test select4-4.1.4 {
250 execsql {
251 CREATE TABLE t2 AS
danielk19773d1bfea2004-05-14 11:00:53 +0000252 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
drhc926afb2002-06-20 03:38:26 +0000253 INTERSECT
254 SELECT n FROM t1 WHERE log=3
255 ORDER BY log DESC;
256 SELECT * FROM t2;
257 }
258} {6 5}
259execsql {DROP TABLE t2}
danielk1977e61b9f42005-01-21 04:25:47 +0000260ifcapable subquery {
261 do_test select4-4.2 {
262 execsql {
263 SELECT log FROM t1 WHERE n IN
264 (SELECT DISTINCT log FROM t1 INTERSECT
265 SELECT n FROM t1 WHERE log=3)
266 ORDER BY log;
267 }
268 } {3}
269}
drh92cd52f2000-06-08 01:55:29 +0000270do_test select4-4.3 {
271 set v [catch {execsql {
272 SELECT DISTINCT log FROM t1 ORDER BY log
273 INTERSECT
274 SELECT n FROM t1 WHERE log=3
275 ORDER BY log;
276 }} msg]
277 lappend v $msg
278} {1 {ORDER BY clause should come after INTERSECT not before}}
drh9af86462015-05-04 16:09:34 +0000279do_catchsql_test select4-4.4 {
280 SELECT 3 IN (
281 SELECT 0 ORDER BY 1
282 INTERSECT
283 SELECT 1
284 INTERSECT
285 SELECT 2
286 ORDER BY 1
287 );
288} {1 {ORDER BY clause should come after INTERSECT not before}}
drh92cd52f2000-06-08 01:55:29 +0000289
290# Various error messages while processing UNION or INTERSECT
291#
292do_test select4-5.1 {
293 set v [catch {execsql {
294 SELECT DISTINCT log FROM t2
295 UNION ALL
296 SELECT n FROM t1 WHERE log=3
297 ORDER BY log;
298 }} msg]
299 lappend v $msg
300} {1 {no such table: t2}}
301do_test select4-5.2 {
302 set v [catch {execsql {
303 SELECT DISTINCT log AS "xyzzy" FROM t1
304 UNION ALL
305 SELECT n FROM t1 WHERE log=3
306 ORDER BY xyzzy;
307 }} msg]
308 lappend v $msg
309} {0 {0 1 2 3 4 5 5 6 7 8}}
310do_test select4-5.2b {
311 set v [catch {execsql {
drh01f3f252002-05-24 16:14:15 +0000312 SELECT DISTINCT log AS xyzzy FROM t1
drh92cd52f2000-06-08 01:55:29 +0000313 UNION ALL
314 SELECT n FROM t1 WHERE log=3
drh4c774312007-12-08 21:10:20 +0000315 ORDER BY "xyzzy";
drh92cd52f2000-06-08 01:55:29 +0000316 }} msg]
317 lappend v $msg
318} {0 {0 1 2 3 4 5 5 6 7 8}}
319do_test select4-5.2c {
320 set v [catch {execsql {
321 SELECT DISTINCT log FROM t1
322 UNION ALL
323 SELECT n FROM t1 WHERE log=3
drh4c774312007-12-08 21:10:20 +0000324 ORDER BY "xyzzy";
drh92cd52f2000-06-08 01:55:29 +0000325 }} msg]
326 lappend v $msg
danielk197701874bf2007-12-13 07:58:50 +0000327} {1 {1st ORDER BY term does not match any column in the result set}}
drh92cd52f2000-06-08 01:55:29 +0000328do_test select4-5.2d {
329 set v [catch {execsql {
330 SELECT DISTINCT log FROM t1
331 INTERSECT
332 SELECT n FROM t1 WHERE log=3
drh4c774312007-12-08 21:10:20 +0000333 ORDER BY "xyzzy";
drh92cd52f2000-06-08 01:55:29 +0000334 }} msg]
335 lappend v $msg
danielk197701874bf2007-12-13 07:58:50 +0000336} {1 {1st ORDER BY term does not match any column in the result set}}
drh92cd52f2000-06-08 01:55:29 +0000337do_test select4-5.2e {
338 set v [catch {execsql {
339 SELECT DISTINCT log FROM t1
340 UNION ALL
341 SELECT n FROM t1 WHERE log=3
342 ORDER BY n;
343 }} msg]
344 lappend v $msg
345} {0 {0 1 2 3 4 5 5 6 7 8}}
drhe4de1fe2002-06-02 16:09:01 +0000346do_test select4-5.2f {
347 catchsql {
348 SELECT DISTINCT log FROM t1
349 UNION ALL
350 SELECT n FROM t1 WHERE log=3
351 ORDER BY log;
352 }
353} {0 {0 1 2 3 4 5 5 6 7 8}}
354do_test select4-5.2g {
355 catchsql {
356 SELECT DISTINCT log FROM t1
357 UNION ALL
358 SELECT n FROM t1 WHERE log=3
359 ORDER BY 1;
360 }
361} {0 {0 1 2 3 4 5 5 6 7 8}}
362do_test select4-5.2h {
363 catchsql {
364 SELECT DISTINCT log FROM t1
365 UNION ALL
366 SELECT n FROM t1 WHERE log=3
367 ORDER BY 2;
368 }
danielk197701874bf2007-12-13 07:58:50 +0000369} {1 {1st ORDER BY term out of range - should be between 1 and 1}}
drhe4de1fe2002-06-02 16:09:01 +0000370do_test select4-5.2i {
371 catchsql {
372 SELECT DISTINCT 1, log FROM t1
373 UNION ALL
374 SELECT 2, n FROM t1 WHERE log=3
375 ORDER BY 2, 1;
376 }
377} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
378do_test select4-5.2j {
379 catchsql {
380 SELECT DISTINCT 1, log FROM t1
381 UNION ALL
382 SELECT 2, n FROM t1 WHERE log=3
383 ORDER BY 1, 2 DESC;
384 }
385} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
386do_test select4-5.2k {
387 catchsql {
388 SELECT DISTINCT 1, log FROM t1
389 UNION ALL
390 SELECT 2, n FROM t1 WHERE log=3
391 ORDER BY n, 1;
392 }
393} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
drh92cd52f2000-06-08 01:55:29 +0000394do_test select4-5.3 {
395 set v [catch {execsql {
396 SELECT DISTINCT log, n FROM t1
397 UNION ALL
398 SELECT n FROM t1 WHERE log=3
399 ORDER BY log;
400 }} msg]
401 lappend v $msg
402} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
drh10c081a2009-04-16 00:24:23 +0000403do_test select4-5.3-3807-1 {
404 catchsql {
405 SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1;
406 }
407} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
drh92cd52f2000-06-08 01:55:29 +0000408do_test select4-5.4 {
409 set v [catch {execsql {
410 SELECT log FROM t1 WHERE n=2
411 UNION ALL
412 SELECT log FROM t1 WHERE n=3
413 UNION ALL
414 SELECT log FROM t1 WHERE n=4
415 UNION ALL
416 SELECT log FROM t1 WHERE n=5
417 ORDER BY log;
418 }} msg]
419 lappend v $msg
420} {0 {1 2 2 3}}
drh92dba242000-06-08 00:28:51 +0000421
drh4cfa7932000-06-08 15:10:46 +0000422do_test select4-6.1 {
423 execsql {
424 SELECT log, count(*) as cnt FROM t1 GROUP BY log
425 UNION
426 SELECT log, n FROM t1 WHERE n=7
427 ORDER BY cnt, log;
428 }
429} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
430do_test select4-6.2 {
431 execsql {
432 SELECT log, count(*) FROM t1 GROUP BY log
433 UNION
434 SELECT log, n FROM t1 WHERE n=7
435 ORDER BY count(*), log;
436 }
437} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
438
drhf570f012002-05-31 15:51:25 +0000439# NULLs are indistinct for the UNION operator.
440# Make sure the UNION operator recognizes this
drhf5905aa2002-05-26 20:54:33 +0000441#
442do_test select4-6.3 {
443 execsql {
444 SELECT NULL UNION SELECT NULL UNION
445 SELECT 1 UNION SELECT 2 AS 'x'
446 ORDER BY x;
447 }
drhf570f012002-05-31 15:51:25 +0000448} {{} 1 2}
449do_test select4-6.3.1 {
drhf5905aa2002-05-26 20:54:33 +0000450 execsql {
451 SELECT NULL UNION ALL SELECT NULL UNION ALL
452 SELECT 1 UNION ALL SELECT 2 AS 'x'
453 ORDER BY x;
454 }
455} {{} {} 1 2}
456
drhf570f012002-05-31 15:51:25 +0000457# Make sure the DISTINCT keyword treats NULLs as indistinct.
drhf5905aa2002-05-26 20:54:33 +0000458#
danielk1977e61b9f42005-01-21 04:25:47 +0000459ifcapable subquery {
460 do_test select4-6.4 {
461 execsql {
462 SELECT * FROM (
463 SELECT NULL, 1 UNION ALL SELECT NULL, 1
464 );
465 }
466 } {{} 1 {} 1}
467 do_test select4-6.5 {
468 execsql {
469 SELECT DISTINCT * FROM (
470 SELECT NULL, 1 UNION ALL SELECT NULL, 1
471 );
472 }
473 } {{} 1}
474 do_test select4-6.6 {
475 execsql {
476 SELECT DISTINCT * FROM (
477 SELECT 1,2 UNION ALL SELECT 1,2
478 );
479 }
480 } {1 2}
481}
drhf5905aa2002-05-26 20:54:33 +0000482
drhbb113512002-05-27 01:04:51 +0000483# Test distinctness of NULL in other ways.
484#
485do_test select4-6.7 {
486 execsql {
487 SELECT NULL EXCEPT SELECT NULL
488 }
drhf570f012002-05-31 15:51:25 +0000489} {}
drhbb113512002-05-27 01:04:51 +0000490
drhf5905aa2002-05-26 20:54:33 +0000491
drh41202cc2002-04-23 17:10:18 +0000492# Make sure column names are correct when a compound select appears as
493# an expression in the WHERE clause.
494#
495do_test select4-7.1 {
496 execsql {
497 CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
498 SELECT * FROM t2 ORDER BY x;
499 }
500} {0 1 1 1 2 2 3 4 4 8 5 15}
danielk1977e61b9f42005-01-21 04:25:47 +0000501ifcapable subquery {
502 do_test select4-7.2 {
503 execsql2 {
504 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
505 ORDER BY n
506 }
507 } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
508 do_test select4-7.3 {
509 execsql2 {
510 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
511 ORDER BY n LIMIT 2
512 }
513 } {n 6 log 3 n 7 log 3}
514 do_test select4-7.4 {
515 execsql2 {
516 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
517 ORDER BY n LIMIT 2
518 }
519 } {n 1 log 0 n 2 log 1}
520} ;# ifcapable subquery
drh41202cc2002-04-23 17:10:18 +0000521
danielk197727c77432004-11-22 13:35:41 +0000522} ;# ifcapable compound
523
drhbb999ef2003-02-02 12:41:25 +0000524# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
drhbb999ef2003-02-02 12:41:25 +0000525do_test select4-8.1 {
526 execsql {
527 BEGIN;
528 CREATE TABLE t3(a text, b float, c text);
danielk19773d1bfea2004-05-14 11:00:53 +0000529 INSERT INTO t3 VALUES(1, 1.1, '1.1');
530 INSERT INTO t3 VALUES(2, 1.10, '1.10');
531 INSERT INTO t3 VALUES(3, 1.10, '1.1');
532 INSERT INTO t3 VALUES(4, 1.1, '1.10');
533 INSERT INTO t3 VALUES(5, 1.2, '1.2');
534 INSERT INTO t3 VALUES(6, 1.3, '1.3');
drhbb999ef2003-02-02 12:41:25 +0000535 COMMIT;
536 }
537 execsql {
538 SELECT DISTINCT b FROM t3 ORDER BY c;
539 }
540} {1.1 1.2 1.3}
541do_test select4-8.2 {
542 execsql {
543 SELECT DISTINCT c FROM t3 ORDER BY c;
544 }
545} {1.1 1.10 1.2 1.3}
546
mihailim29b13cc2008-06-25 08:02:44 +0000547# Make sure the names of columns are taken from the right-most subquery
drh92378252006-03-26 01:21:22 +0000548# right in a compound query. Ticket #1721
549#
danielk19774b2688a2006-06-20 11:01:07 +0000550ifcapable compound {
551
drh92378252006-03-26 01:21:22 +0000552do_test select4-9.1 {
553 execsql2 {
554 SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1
555 }
556} {x 0 y 1}
557do_test select4-9.2 {
558 execsql2 {
559 SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1
560 }
561} {x 0 y 1}
562do_test select4-9.3 {
563 execsql2 {
564 SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1
565 }
566} {x 0 y 1}
567do_test select4-9.4 {
568 execsql2 {
569 SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b;
570 }
571} {x 0 y 1}
572do_test select4-9.5 {
573 execsql2 {
574 SELECT 0 AS x, 1 AS y
575 UNION
576 SELECT 2 AS p, 3 AS q
577 UNION
578 SELECT 4 AS a, 5 AS b
579 ORDER BY x LIMIT 1
580 }
581} {x 0 y 1}
danielk19774b2688a2006-06-20 11:01:07 +0000582
583ifcapable subquery {
drh92378252006-03-26 01:21:22 +0000584do_test select4-9.6 {
585 execsql2 {
586 SELECT * FROM (
587 SELECT 0 AS x, 1 AS y
588 UNION
589 SELECT 2 AS p, 3 AS q
590 UNION
591 SELECT 4 AS a, 5 AS b
592 ) ORDER BY 1 LIMIT 1;
593 }
594} {x 0 y 1}
595do_test select4-9.7 {
596 execsql2 {
597 SELECT * FROM (
598 SELECT 0 AS x, 1 AS y
599 UNION
600 SELECT 2 AS p, 3 AS q
601 UNION
602 SELECT 4 AS a, 5 AS b
603 ) ORDER BY x LIMIT 1;
604 }
605} {x 0 y 1}
danielk19774b2688a2006-06-20 11:01:07 +0000606} ;# ifcapable subquery
607
drh92378252006-03-26 01:21:22 +0000608do_test select4-9.8 {
danielk197701874bf2007-12-13 07:58:50 +0000609 execsql {
drh92378252006-03-26 01:21:22 +0000610 SELECT 0 AS x, 1 AS y
611 UNION
612 SELECT 2 AS y, -3 AS x
613 ORDER BY x LIMIT 1;
614 }
danielk197701874bf2007-12-13 07:58:50 +0000615} {0 1}
danielk197770517ab2007-12-10 18:51:47 +0000616
danielk19774b2688a2006-06-20 11:01:07 +0000617do_test select4-9.9.1 {
drh92378252006-03-26 01:21:22 +0000618 execsql2 {
619 SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a
620 }
621} {a 1 b 2 a 3 b 4}
danielk19774b2688a2006-06-20 11:01:07 +0000622
623ifcapable subquery {
624do_test select4-9.9.2 {
drh92378252006-03-26 01:21:22 +0000625 execsql2 {
626 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
627 WHERE b=3
628 }
629} {}
630do_test select4-9.10 {
631 execsql2 {
632 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
633 WHERE b=2
634 }
635} {a 1 b 2}
636do_test select4-9.11 {
637 execsql2 {
638 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
639 WHERE b=2
640 }
641} {a 1 b 2}
642do_test select4-9.12 {
643 execsql2 {
644 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
645 WHERE b>0
646 }
647} {a 1 b 2 a 3 b 4}
danielk19774b2688a2006-06-20 11:01:07 +0000648} ;# ifcapable subquery
649
drhb7654112008-01-12 12:48:07 +0000650# Try combining DISTINCT, LIMIT, and OFFSET. Make sure they all work
651# together.
652#
653do_test select4-10.1 {
654 execsql {
655 SELECT DISTINCT log FROM t1 ORDER BY log
656 }
657} {0 1 2 3 4 5}
658do_test select4-10.2 {
659 execsql {
660 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4
661 }
662} {0 1 2 3}
663do_test select4-10.3 {
664 execsql {
665 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0
666 }
667} {}
668do_test select4-10.4 {
669 execsql {
670 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1
671 }
672} {0 1 2 3 4 5}
673do_test select4-10.5 {
674 execsql {
675 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2
676 }
677} {2 3 4 5}
678do_test select4-10.6 {
679 execsql {
680 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2
681 }
682} {2 3 4}
683do_test select4-10.7 {
684 execsql {
685 SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20
686 }
687} {}
688do_test select4-10.8 {
689 execsql {
690 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
691 }
692} {}
693do_test select4-10.9 {
drhb7654112008-01-12 12:48:07 +0000694 execsql {
695 SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
696 }
697} {31 5}
698
drhad27e762008-03-26 12:46:23 +0000699# Make sure compound SELECTs with wildly different numbers of columns
700# do not cause assertion faults due to register allocation issues.
701#
702do_test select4-11.1 {
703 catchsql {
704 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
705 UNION
706 SELECT x FROM t2
707 }
708} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
709do_test select4-11.2 {
710 catchsql {
711 SELECT x FROM t2
712 UNION
713 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
714 }
715} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
716do_test select4-11.3 {
717 catchsql {
718 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
719 UNION ALL
720 SELECT x FROM t2
721 }
722} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
723do_test select4-11.4 {
724 catchsql {
725 SELECT x FROM t2
726 UNION ALL
727 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
728 }
729} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
730do_test select4-11.5 {
731 catchsql {
732 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
733 EXCEPT
734 SELECT x FROM t2
735 }
736} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
737do_test select4-11.6 {
738 catchsql {
739 SELECT x FROM t2
740 EXCEPT
741 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
742 }
743} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
744do_test select4-11.7 {
745 catchsql {
746 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
747 INTERSECT
748 SELECT x FROM t2
749 }
750} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
751do_test select4-11.8 {
752 catchsql {
753 SELECT x FROM t2
754 INTERSECT
755 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
756 }
757} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
758
759do_test select4-11.11 {
760 catchsql {
761 SELECT x FROM t2
762 UNION
763 SELECT x FROM t2
764 UNION ALL
765 SELECT x FROM t2
766 EXCEPT
767 SELECT x FROM t2
768 INTERSECT
769 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
770 }
771} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
772do_test select4-11.12 {
773 catchsql {
774 SELECT x FROM t2
775 UNION
776 SELECT x FROM t2
777 UNION ALL
778 SELECT x FROM t2
779 EXCEPT
780 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
781 EXCEPT
782 SELECT x FROM t2
783 }
784} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
785do_test select4-11.13 {
786 catchsql {
787 SELECT x FROM t2
788 UNION
789 SELECT x FROM t2
790 UNION ALL
791 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
792 UNION ALL
793 SELECT x FROM t2
794 EXCEPT
795 SELECT x FROM t2
796 }
797} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
798do_test select4-11.14 {
799 catchsql {
800 SELECT x FROM t2
801 UNION
802 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
803 UNION
804 SELECT x FROM t2
805 UNION ALL
806 SELECT x FROM t2
807 EXCEPT
808 SELECT x FROM t2
809 }
810} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
811do_test select4-11.15 {
812 catchsql {
813 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
814 UNION
815 SELECT x FROM t2
816 INTERSECT
817 SELECT x FROM t2
818 UNION ALL
819 SELECT x FROM t2
820 EXCEPT
821 SELECT x FROM t2
822 }
823} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
drh3dc4cc62015-04-15 07:10:25 +0000824do_test select4-11.16 {
825 catchsql {
826 INSERT INTO t2(rowid) VALUES(2) UNION SELECT 3,4 UNION SELECT 5,6 ORDER BY 1;
827 }
828} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
drhb7654112008-01-12 12:48:07 +0000829
drh10c081a2009-04-16 00:24:23 +0000830do_test select4-12.1 {
831 sqlite3 db2 :memory:
832 catchsql {
833 SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1;
834 } db2
835} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
836
danielk1977de3e41e2008-08-04 03:51:24 +0000837} ;# ifcapable compound
838
drhc7240082012-03-03 01:44:12 +0000839
840# Ticket [3557ad65a076c] - Incorrect DISTINCT processing with an
841# indexed query using IN.
842#
843do_test select4-13.1 {
844 sqlite3 db test.db
845 db eval {
846 CREATE TABLE t13(a,b);
847 INSERT INTO t13 VALUES(1,1);
848 INSERT INTO t13 VALUES(2,1);
849 INSERT INTO t13 VALUES(3,1);
850 INSERT INTO t13 VALUES(2,2);
851 INSERT INTO t13 VALUES(3,2);
852 INSERT INTO t13 VALUES(4,2);
853 CREATE INDEX t13ab ON t13(a,b);
854 SELECT DISTINCT b from t13 WHERE a IN (1,2,3);
855 }
856} {1 2}
857
drhc0bf4932014-02-19 01:31:02 +0000858# 2014-02-18: Make sure compound SELECTs work with VALUES clauses
859#
860do_execsql_test select4-14.1 {
861 CREATE TABLE t14(a,b,c);
862 INSERT INTO t14 VALUES(1,2,3),(4,5,6);
863 SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
864} {1 2 3}
865do_execsql_test select4-14.2 {
866 SELECT * FROM t14 INTERSECT VALUES(1,2,3);
867} {1 2 3}
868do_execsql_test select4-14.3 {
869 SELECT * FROM t14
870 UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6)
871 UNION SELECT * FROM t14 ORDER BY 1, 2, 3
872} {1 2 3 2 3 1 3 2 1 4 5 6 7 8 9}
873do_execsql_test select4-14.4 {
874 SELECT * FROM t14
875 UNION VALUES(3,2,1)
876 UNION SELECT * FROM t14 ORDER BY 1, 2, 3
877} {1 2 3 3 2 1 4 5 6}
878do_execsql_test select4-14.5 {
879 SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
880} {4 5 6}
881do_execsql_test select4-14.6 {
882 SELECT * FROM t14 EXCEPT VALUES(1,2,3)
883} {4 5 6}
884do_execsql_test select4-14.7 {
885 SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6)
886} {}
887do_execsql_test select4-14.8 {
888 SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6)
889} {1 2 3}
890do_execsql_test select4-14.9 {
891 SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
892} {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3}
drh1978d172015-04-15 05:20:44 +0000893do_execsql_test select4-14.10 {
894 SELECT (VALUES(1),(2),(3),(4))
895} {1}
896do_execsql_test select4-14.11 {
897 SELECT (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4)
898} {1}
drh772460f2015-04-16 14:13:12 +0000899do_execsql_test select4-14.12 {
900 VALUES(1) UNION VALUES(2);
901} {1 2}
902do_execsql_test select4-14.13 {
903 VALUES(1),(2),(3) EXCEPT VALUES(2);
904} {1 3}
905do_execsql_test select4-14.14 {
906 VALUES(1),(2),(3) EXCEPT VALUES(1),(3);
907} {2}
drh60f4e092015-04-21 02:17:30 +0000908do_execsql_test select4-14.15 {
909 SELECT * FROM (SELECT 123), (SELECT 456) ON likely(0 OR 1) OR 0;
910} {123 456}
drh00d5ab72015-05-20 00:15:27 +0000911do_execsql_test select4-14.16 {
912 VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 99;
913} {1 2 3 4 5}
914do_execsql_test select4-14.17 {
915 VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 3;
916} {1 2 3}
drhc0bf4932014-02-19 01:31:02 +0000917
drh2fade2f2016-02-09 02:12:20 +0000918# Ticket https://www.sqlite.org/src/info/d06a25c84454a372
919# Incorrect answer due to two co-routines using the same registers and expecting
920# those register values to be preserved across a Yield.
921#
922do_execsql_test select4-15.1 {
923 DROP TABLE IF EXISTS tx;
924 CREATE TABLE tx(id INTEGER PRIMARY KEY, a, b);
925 INSERT INTO tx(a,b) VALUES(33,456);
926 INSERT INTO tx(a,b) VALUES(33,789);
927
928 SELECT DISTINCT t0.id, t0.a, t0.b
929 FROM tx AS t0, tx AS t1
930 WHERE t0.a=t1.a AND t1.a=33 AND t0.b=456
931 UNION
932 SELECT DISTINCT t0.id, t0.a, t0.b
933 FROM tx AS t0, tx AS t1
934 WHERE t0.a=t1.a AND t1.a=33 AND t0.b=789
935 ORDER BY 1;
936} {1 33 456 2 33 789}
937
drh0ff47e92016-03-15 17:52:12 +0000938# Enhancement (2016-03-15): Use a co-routine for subqueries if the
939# subquery is guaranteed to be the outer-most query
940#
941do_execsql_test select4-16.1 {
942 DROP TABLE IF EXISTS t1;
943 CREATE TABLE t1(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
944 PRIMARY KEY(a,b DESC)) WITHOUT ROWID;
945
946 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)
947 INSERT INTO t1(a,b,c,d)
948 SELECT x%10, x/10, x, printf('xyz%dabc',x) FROM c;
949
950 SELECT t3.c FROM
951 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
952 JOIN t1 AS t3
953 WHERE t2.a=t3.a AND t2.m=t3.b
954 ORDER BY t3.a;
955} {95 96 97 98 99}
956do_execsql_test select4-16.2 {
957 SELECT t3.c FROM
958 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
959 CROSS JOIN t1 AS t3
960 WHERE t2.a=t3.a AND t2.m=t3.b
961 ORDER BY t3.a;
962} {95 96 97 98 99}
963do_execsql_test select4-16.3 {
964 SELECT t3.c FROM
965 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
966 LEFT JOIN t1 AS t3
967 WHERE t2.a=t3.a AND t2.m=t3.b
968 ORDER BY t3.a;
969} {95 96 97 98 99}
970
drhb1ec87a2016-04-25 02:20:10 +0000971# Ticket https://www.sqlite.org/src/tktview/f7f8c97e975978d45 on 2016-04-25
972#
973# The where push-down optimization from 2015-06-02 is suppose to disable
974# on aggregate subqueries. But if the subquery is a compound where the
975# last SELECT is non-aggregate but some other SELECT is an aggregate, the
976# test is incomplete and the optimization is not properly disabled.
977#
978# The following test cases verify that the fix works.
979#
980do_execsql_test select4-17.1 {
981 DROP TABLE IF EXISTS t1;
982 CREATE TABLE t1(a int, b int);
983 INSERT INTO t1 VALUES(1,2),(1,18),(2,19);
984 SELECT x, y FROM (
985 SELECT 98 AS x, 99 AS y
986 UNION
987 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
988 ) AS w WHERE y>=20
989 ORDER BY +x;
990} {1 20 98 99}
991do_execsql_test select4-17.2 {
992 SELECT x, y FROM (
993 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
994 UNION
995 SELECT 98 AS x, 99 AS y
996 ) AS w WHERE y>=20
997 ORDER BY +x;
998} {1 20 98 99}
999do_catchsql_test select4-17.3 {
1000 SELECT x, y FROM (
1001 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a LIMIT 3
1002 UNION
1003 SELECT 98 AS x, 99 AS y
1004 ) AS w WHERE y>=20
1005 ORDER BY +x;
1006} {1 {LIMIT clause should come after UNION not before}}
drh0ff47e92016-03-15 17:52:12 +00001007
1008
1009
drh92dba242000-06-08 00:28:51 +00001010finish_test