OLD | NEW |
| (Empty) |
1 # 2001 September 15 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # 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. | |
9 # | |
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 # | |
15 # $Id: select4.test,v 1.30 2009/04/16 00:24:24 drh Exp $ | |
16 | |
17 set testdir [file dirname $argv0] | |
18 source $testdir/tester.tcl | |
19 | |
20 # Most tests in this file depend on compound-select. But there are a couple | |
21 # right at the end that test DISTINCT, so we cannot omit the entire file. | |
22 # | |
23 ifcapable compound { | |
24 | |
25 # Build some test data | |
26 # | |
27 execsql { | |
28 CREATE TABLE t1(n int, log int); | |
29 BEGIN; | |
30 } | |
31 for {set i 1} {$i<32} {incr i} { | |
32 for {set j 0} {(1<<$j)<$i} {incr j} {} | |
33 execsql "INSERT INTO t1 VALUES($i,$j)" | |
34 } | |
35 execsql { | |
36 COMMIT; | |
37 } | |
38 | |
39 do_test select4-1.0 { | |
40 execsql {SELECT DISTINCT log FROM t1 ORDER BY log} | |
41 } {0 1 2 3 4 5} | |
42 | |
43 # Union All operator | |
44 # | |
45 do_test select4-1.1a { | |
46 lsort [execsql {SELECT DISTINCT log FROM t1}] | |
47 } {0 1 2 3 4 5} | |
48 do_test select4-1.1b { | |
49 lsort [execsql {SELECT n FROM t1 WHERE log=3}] | |
50 } {5 6 7 8} | |
51 do_test select4-1.1c { | |
52 execsql { | |
53 SELECT DISTINCT log FROM t1 | |
54 UNION ALL | |
55 SELECT n FROM t1 WHERE log=3 | |
56 ORDER BY log; | |
57 } | |
58 } {0 1 2 3 4 5 5 6 7 8} | |
59 do_test select4-1.1d { | |
60 execsql { | |
61 CREATE TABLE t2 AS | |
62 SELECT DISTINCT log FROM t1 | |
63 UNION ALL | |
64 SELECT n FROM t1 WHERE log=3 | |
65 ORDER BY log; | |
66 SELECT * FROM t2; | |
67 } | |
68 } {0 1 2 3 4 5 5 6 7 8} | |
69 execsql {DROP TABLE t2} | |
70 do_test select4-1.1e { | |
71 execsql { | |
72 CREATE TABLE t2 AS | |
73 SELECT DISTINCT log FROM t1 | |
74 UNION ALL | |
75 SELECT n FROM t1 WHERE log=3 | |
76 ORDER BY log DESC; | |
77 SELECT * FROM t2; | |
78 } | |
79 } {8 7 6 5 5 4 3 2 1 0} | |
80 execsql {DROP TABLE t2} | |
81 do_test select4-1.1f { | |
82 execsql { | |
83 SELECT DISTINCT log FROM t1 | |
84 UNION ALL | |
85 SELECT n FROM t1 WHERE log=2 | |
86 } | |
87 } {0 1 2 3 4 5 3 4} | |
88 do_test select4-1.1g { | |
89 execsql { | |
90 CREATE TABLE t2 AS | |
91 SELECT DISTINCT log FROM t1 | |
92 UNION ALL | |
93 SELECT n FROM t1 WHERE log=2; | |
94 SELECT * FROM t2; | |
95 } | |
96 } {0 1 2 3 4 5 3 4} | |
97 execsql {DROP TABLE t2} | |
98 ifcapable subquery { | |
99 do_test select4-1.2 { | |
100 execsql { | |
101 SELECT log FROM t1 WHERE n IN | |
102 (SELECT DISTINCT log FROM t1 UNION ALL | |
103 SELECT n FROM t1 WHERE log=3) | |
104 ORDER BY log; | |
105 } | |
106 } {0 1 2 2 3 3 3 3} | |
107 } | |
108 do_test select4-1.3 { | |
109 set v [catch {execsql { | |
110 SELECT DISTINCT log FROM t1 ORDER BY log | |
111 UNION ALL | |
112 SELECT n FROM t1 WHERE log=3 | |
113 ORDER BY log; | |
114 }} msg] | |
115 lappend v $msg | |
116 } {1 {ORDER BY clause should come after UNION ALL not before}} | |
117 | |
118 # Union operator | |
119 # | |
120 do_test select4-2.1 { | |
121 execsql { | |
122 SELECT DISTINCT log FROM t1 | |
123 UNION | |
124 SELECT n FROM t1 WHERE log=3 | |
125 ORDER BY log; | |
126 } | |
127 } {0 1 2 3 4 5 6 7 8} | |
128 ifcapable subquery { | |
129 do_test select4-2.2 { | |
130 execsql { | |
131 SELECT log FROM t1 WHERE n IN | |
132 (SELECT DISTINCT log FROM t1 UNION | |
133 SELECT n FROM t1 WHERE log=3) | |
134 ORDER BY log; | |
135 } | |
136 } {0 1 2 2 3 3 3 3} | |
137 } | |
138 do_test select4-2.3 { | |
139 set v [catch {execsql { | |
140 SELECT DISTINCT log FROM t1 ORDER BY log | |
141 UNION | |
142 SELECT n FROM t1 WHERE log=3 | |
143 ORDER BY log; | |
144 }} msg] | |
145 lappend v $msg | |
146 } {1 {ORDER BY clause should come after UNION not before}} | |
147 | |
148 # Except operator | |
149 # | |
150 do_test select4-3.1.1 { | |
151 execsql { | |
152 SELECT DISTINCT log FROM t1 | |
153 EXCEPT | |
154 SELECT n FROM t1 WHERE log=3 | |
155 ORDER BY log; | |
156 } | |
157 } {0 1 2 3 4} | |
158 do_test select4-3.1.2 { | |
159 execsql { | |
160 CREATE TABLE t2 AS | |
161 SELECT DISTINCT log FROM t1 | |
162 EXCEPT | |
163 SELECT n FROM t1 WHERE log=3 | |
164 ORDER BY log; | |
165 SELECT * FROM t2; | |
166 } | |
167 } {0 1 2 3 4} | |
168 execsql {DROP TABLE t2} | |
169 do_test select4-3.1.3 { | |
170 execsql { | |
171 CREATE TABLE t2 AS | |
172 SELECT DISTINCT log FROM t1 | |
173 EXCEPT | |
174 SELECT n FROM t1 WHERE log=3 | |
175 ORDER BY log DESC; | |
176 SELECT * FROM t2; | |
177 } | |
178 } {4 3 2 1 0} | |
179 execsql {DROP TABLE t2} | |
180 ifcapable subquery { | |
181 do_test select4-3.2 { | |
182 execsql { | |
183 SELECT log FROM t1 WHERE n IN | |
184 (SELECT DISTINCT log FROM t1 EXCEPT | |
185 SELECT n FROM t1 WHERE log=3) | |
186 ORDER BY log; | |
187 } | |
188 } {0 1 2 2} | |
189 } | |
190 do_test select4-3.3 { | |
191 set v [catch {execsql { | |
192 SELECT DISTINCT log FROM t1 ORDER BY log | |
193 EXCEPT | |
194 SELECT n FROM t1 WHERE log=3 | |
195 ORDER BY log; | |
196 }} msg] | |
197 lappend v $msg | |
198 } {1 {ORDER BY clause should come after EXCEPT not before}} | |
199 | |
200 # Intersect operator | |
201 # | |
202 do_test select4-4.1.1 { | |
203 execsql { | |
204 SELECT DISTINCT log FROM t1 | |
205 INTERSECT | |
206 SELECT n FROM t1 WHERE log=3 | |
207 ORDER BY log; | |
208 } | |
209 } {5} | |
210 | |
211 do_test select4-4.1.2 { | |
212 execsql { | |
213 SELECT DISTINCT log FROM t1 | |
214 UNION ALL | |
215 SELECT 6 | |
216 INTERSECT | |
217 SELECT n FROM t1 WHERE log=3 | |
218 ORDER BY t1.log; | |
219 } | |
220 } {5 6} | |
221 | |
222 do_test select4-4.1.3 { | |
223 execsql { | |
224 CREATE TABLE t2 AS | |
225 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 | |
226 INTERSECT | |
227 SELECT n FROM t1 WHERE log=3 | |
228 ORDER BY log; | |
229 SELECT * FROM t2; | |
230 } | |
231 } {5 6} | |
232 execsql {DROP TABLE t2} | |
233 do_test select4-4.1.4 { | |
234 execsql { | |
235 CREATE TABLE t2 AS | |
236 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 | |
237 INTERSECT | |
238 SELECT n FROM t1 WHERE log=3 | |
239 ORDER BY log DESC; | |
240 SELECT * FROM t2; | |
241 } | |
242 } {6 5} | |
243 execsql {DROP TABLE t2} | |
244 ifcapable subquery { | |
245 do_test select4-4.2 { | |
246 execsql { | |
247 SELECT log FROM t1 WHERE n IN | |
248 (SELECT DISTINCT log FROM t1 INTERSECT | |
249 SELECT n FROM t1 WHERE log=3) | |
250 ORDER BY log; | |
251 } | |
252 } {3} | |
253 } | |
254 do_test select4-4.3 { | |
255 set v [catch {execsql { | |
256 SELECT DISTINCT log FROM t1 ORDER BY log | |
257 INTERSECT | |
258 SELECT n FROM t1 WHERE log=3 | |
259 ORDER BY log; | |
260 }} msg] | |
261 lappend v $msg | |
262 } {1 {ORDER BY clause should come after INTERSECT not before}} | |
263 | |
264 # Various error messages while processing UNION or INTERSECT | |
265 # | |
266 do_test select4-5.1 { | |
267 set v [catch {execsql { | |
268 SELECT DISTINCT log FROM t2 | |
269 UNION ALL | |
270 SELECT n FROM t1 WHERE log=3 | |
271 ORDER BY log; | |
272 }} msg] | |
273 lappend v $msg | |
274 } {1 {no such table: t2}} | |
275 do_test select4-5.2 { | |
276 set v [catch {execsql { | |
277 SELECT DISTINCT log AS "xyzzy" FROM t1 | |
278 UNION ALL | |
279 SELECT n FROM t1 WHERE log=3 | |
280 ORDER BY xyzzy; | |
281 }} msg] | |
282 lappend v $msg | |
283 } {0 {0 1 2 3 4 5 5 6 7 8}} | |
284 do_test select4-5.2b { | |
285 set v [catch {execsql { | |
286 SELECT DISTINCT log AS xyzzy FROM t1 | |
287 UNION ALL | |
288 SELECT n FROM t1 WHERE log=3 | |
289 ORDER BY "xyzzy"; | |
290 }} msg] | |
291 lappend v $msg | |
292 } {0 {0 1 2 3 4 5 5 6 7 8}} | |
293 do_test select4-5.2c { | |
294 set v [catch {execsql { | |
295 SELECT DISTINCT log FROM t1 | |
296 UNION ALL | |
297 SELECT n FROM t1 WHERE log=3 | |
298 ORDER BY "xyzzy"; | |
299 }} msg] | |
300 lappend v $msg | |
301 } {1 {1st ORDER BY term does not match any column in the result set}} | |
302 do_test select4-5.2d { | |
303 set v [catch {execsql { | |
304 SELECT DISTINCT log FROM t1 | |
305 INTERSECT | |
306 SELECT n FROM t1 WHERE log=3 | |
307 ORDER BY "xyzzy"; | |
308 }} msg] | |
309 lappend v $msg | |
310 } {1 {1st ORDER BY term does not match any column in the result set}} | |
311 do_test select4-5.2e { | |
312 set v [catch {execsql { | |
313 SELECT DISTINCT log FROM t1 | |
314 UNION ALL | |
315 SELECT n FROM t1 WHERE log=3 | |
316 ORDER BY n; | |
317 }} msg] | |
318 lappend v $msg | |
319 } {0 {0 1 2 3 4 5 5 6 7 8}} | |
320 do_test select4-5.2f { | |
321 catchsql { | |
322 SELECT DISTINCT log FROM t1 | |
323 UNION ALL | |
324 SELECT n FROM t1 WHERE log=3 | |
325 ORDER BY log; | |
326 } | |
327 } {0 {0 1 2 3 4 5 5 6 7 8}} | |
328 do_test select4-5.2g { | |
329 catchsql { | |
330 SELECT DISTINCT log FROM t1 | |
331 UNION ALL | |
332 SELECT n FROM t1 WHERE log=3 | |
333 ORDER BY 1; | |
334 } | |
335 } {0 {0 1 2 3 4 5 5 6 7 8}} | |
336 do_test select4-5.2h { | |
337 catchsql { | |
338 SELECT DISTINCT log FROM t1 | |
339 UNION ALL | |
340 SELECT n FROM t1 WHERE log=3 | |
341 ORDER BY 2; | |
342 } | |
343 } {1 {1st ORDER BY term out of range - should be between 1 and 1}} | |
344 do_test select4-5.2i { | |
345 catchsql { | |
346 SELECT DISTINCT 1, log FROM t1 | |
347 UNION ALL | |
348 SELECT 2, n FROM t1 WHERE log=3 | |
349 ORDER BY 2, 1; | |
350 } | |
351 } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} | |
352 do_test select4-5.2j { | |
353 catchsql { | |
354 SELECT DISTINCT 1, log FROM t1 | |
355 UNION ALL | |
356 SELECT 2, n FROM t1 WHERE log=3 | |
357 ORDER BY 1, 2 DESC; | |
358 } | |
359 } {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}} | |
360 do_test select4-5.2k { | |
361 catchsql { | |
362 SELECT DISTINCT 1, log FROM t1 | |
363 UNION ALL | |
364 SELECT 2, n FROM t1 WHERE log=3 | |
365 ORDER BY n, 1; | |
366 } | |
367 } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} | |
368 do_test select4-5.3 { | |
369 set v [catch {execsql { | |
370 SELECT DISTINCT log, n FROM t1 | |
371 UNION ALL | |
372 SELECT n FROM t1 WHERE log=3 | |
373 ORDER BY log; | |
374 }} msg] | |
375 lappend v $msg | |
376 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} | |
377 do_test select4-5.3-3807-1 { | |
378 catchsql { | |
379 SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1; | |
380 } | |
381 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} | |
382 do_test select4-5.4 { | |
383 set v [catch {execsql { | |
384 SELECT log FROM t1 WHERE n=2 | |
385 UNION ALL | |
386 SELECT log FROM t1 WHERE n=3 | |
387 UNION ALL | |
388 SELECT log FROM t1 WHERE n=4 | |
389 UNION ALL | |
390 SELECT log FROM t1 WHERE n=5 | |
391 ORDER BY log; | |
392 }} msg] | |
393 lappend v $msg | |
394 } {0 {1 2 2 3}} | |
395 | |
396 do_test select4-6.1 { | |
397 execsql { | |
398 SELECT log, count(*) as cnt FROM t1 GROUP BY log | |
399 UNION | |
400 SELECT log, n FROM t1 WHERE n=7 | |
401 ORDER BY cnt, log; | |
402 } | |
403 } {0 1 1 1 2 2 3 4 3 7 4 8 5 15} | |
404 do_test select4-6.2 { | |
405 execsql { | |
406 SELECT log, count(*) FROM t1 GROUP BY log | |
407 UNION | |
408 SELECT log, n FROM t1 WHERE n=7 | |
409 ORDER BY count(*), log; | |
410 } | |
411 } {0 1 1 1 2 2 3 4 3 7 4 8 5 15} | |
412 | |
413 # NULLs are indistinct for the UNION operator. | |
414 # Make sure the UNION operator recognizes this | |
415 # | |
416 do_test select4-6.3 { | |
417 execsql { | |
418 SELECT NULL UNION SELECT NULL UNION | |
419 SELECT 1 UNION SELECT 2 AS 'x' | |
420 ORDER BY x; | |
421 } | |
422 } {{} 1 2} | |
423 do_test select4-6.3.1 { | |
424 execsql { | |
425 SELECT NULL UNION ALL SELECT NULL UNION ALL | |
426 SELECT 1 UNION ALL SELECT 2 AS 'x' | |
427 ORDER BY x; | |
428 } | |
429 } {{} {} 1 2} | |
430 | |
431 # Make sure the DISTINCT keyword treats NULLs as indistinct. | |
432 # | |
433 ifcapable subquery { | |
434 do_test select4-6.4 { | |
435 execsql { | |
436 SELECT * FROM ( | |
437 SELECT NULL, 1 UNION ALL SELECT NULL, 1 | |
438 ); | |
439 } | |
440 } {{} 1 {} 1} | |
441 do_test select4-6.5 { | |
442 execsql { | |
443 SELECT DISTINCT * FROM ( | |
444 SELECT NULL, 1 UNION ALL SELECT NULL, 1 | |
445 ); | |
446 } | |
447 } {{} 1} | |
448 do_test select4-6.6 { | |
449 execsql { | |
450 SELECT DISTINCT * FROM ( | |
451 SELECT 1,2 UNION ALL SELECT 1,2 | |
452 ); | |
453 } | |
454 } {1 2} | |
455 } | |
456 | |
457 # Test distinctness of NULL in other ways. | |
458 # | |
459 do_test select4-6.7 { | |
460 execsql { | |
461 SELECT NULL EXCEPT SELECT NULL | |
462 } | |
463 } {} | |
464 | |
465 | |
466 # Make sure column names are correct when a compound select appears as | |
467 # an expression in the WHERE clause. | |
468 # | |
469 do_test select4-7.1 { | |
470 execsql { | |
471 CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log; | |
472 SELECT * FROM t2 ORDER BY x; | |
473 } | |
474 } {0 1 1 1 2 2 3 4 4 8 5 15} | |
475 ifcapable subquery { | |
476 do_test select4-7.2 { | |
477 execsql2 { | |
478 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2) | |
479 ORDER BY n | |
480 } | |
481 } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3} | |
482 do_test select4-7.3 { | |
483 execsql2 { | |
484 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2) | |
485 ORDER BY n LIMIT 2 | |
486 } | |
487 } {n 6 log 3 n 7 log 3} | |
488 do_test select4-7.4 { | |
489 execsql2 { | |
490 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2) | |
491 ORDER BY n LIMIT 2 | |
492 } | |
493 } {n 1 log 0 n 2 log 1} | |
494 } ;# ifcapable subquery | |
495 | |
496 } ;# ifcapable compound | |
497 | |
498 # Make sure DISTINCT works appropriately on TEXT and NUMERIC columns. | |
499 do_test select4-8.1 { | |
500 execsql { | |
501 BEGIN; | |
502 CREATE TABLE t3(a text, b float, c text); | |
503 INSERT INTO t3 VALUES(1, 1.1, '1.1'); | |
504 INSERT INTO t3 VALUES(2, 1.10, '1.10'); | |
505 INSERT INTO t3 VALUES(3, 1.10, '1.1'); | |
506 INSERT INTO t3 VALUES(4, 1.1, '1.10'); | |
507 INSERT INTO t3 VALUES(5, 1.2, '1.2'); | |
508 INSERT INTO t3 VALUES(6, 1.3, '1.3'); | |
509 COMMIT; | |
510 } | |
511 execsql { | |
512 SELECT DISTINCT b FROM t3 ORDER BY c; | |
513 } | |
514 } {1.1 1.2 1.3} | |
515 do_test select4-8.2 { | |
516 execsql { | |
517 SELECT DISTINCT c FROM t3 ORDER BY c; | |
518 } | |
519 } {1.1 1.10 1.2 1.3} | |
520 | |
521 # Make sure the names of columns are taken from the right-most subquery | |
522 # right in a compound query. Ticket #1721 | |
523 # | |
524 ifcapable compound { | |
525 | |
526 do_test select4-9.1 { | |
527 execsql2 { | |
528 SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1 | |
529 } | |
530 } {x 0 y 1} | |
531 do_test select4-9.2 { | |
532 execsql2 { | |
533 SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1 | |
534 } | |
535 } {x 0 y 1} | |
536 do_test select4-9.3 { | |
537 execsql2 { | |
538 SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1 | |
539 } | |
540 } {x 0 y 1} | |
541 do_test select4-9.4 { | |
542 execsql2 { | |
543 SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b; | |
544 } | |
545 } {x 0 y 1} | |
546 do_test select4-9.5 { | |
547 execsql2 { | |
548 SELECT 0 AS x, 1 AS y | |
549 UNION | |
550 SELECT 2 AS p, 3 AS q | |
551 UNION | |
552 SELECT 4 AS a, 5 AS b | |
553 ORDER BY x LIMIT 1 | |
554 } | |
555 } {x 0 y 1} | |
556 | |
557 ifcapable subquery { | |
558 do_test select4-9.6 { | |
559 execsql2 { | |
560 SELECT * FROM ( | |
561 SELECT 0 AS x, 1 AS y | |
562 UNION | |
563 SELECT 2 AS p, 3 AS q | |
564 UNION | |
565 SELECT 4 AS a, 5 AS b | |
566 ) ORDER BY 1 LIMIT 1; | |
567 } | |
568 } {x 0 y 1} | |
569 do_test select4-9.7 { | |
570 execsql2 { | |
571 SELECT * FROM ( | |
572 SELECT 0 AS x, 1 AS y | |
573 UNION | |
574 SELECT 2 AS p, 3 AS q | |
575 UNION | |
576 SELECT 4 AS a, 5 AS b | |
577 ) ORDER BY x LIMIT 1; | |
578 } | |
579 } {x 0 y 1} | |
580 } ;# ifcapable subquery | |
581 | |
582 do_test select4-9.8 { | |
583 execsql { | |
584 SELECT 0 AS x, 1 AS y | |
585 UNION | |
586 SELECT 2 AS y, -3 AS x | |
587 ORDER BY x LIMIT 1; | |
588 } | |
589 } {0 1} | |
590 | |
591 do_test select4-9.9.1 { | |
592 execsql2 { | |
593 SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a | |
594 } | |
595 } {a 1 b 2 a 3 b 4} | |
596 | |
597 ifcapable subquery { | |
598 do_test select4-9.9.2 { | |
599 execsql2 { | |
600 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) | |
601 WHERE b=3 | |
602 } | |
603 } {} | |
604 do_test select4-9.10 { | |
605 execsql2 { | |
606 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) | |
607 WHERE b=2 | |
608 } | |
609 } {a 1 b 2} | |
610 do_test select4-9.11 { | |
611 execsql2 { | |
612 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) | |
613 WHERE b=2 | |
614 } | |
615 } {a 1 b 2} | |
616 do_test select4-9.12 { | |
617 execsql2 { | |
618 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) | |
619 WHERE b>0 | |
620 } | |
621 } {a 1 b 2 a 3 b 4} | |
622 } ;# ifcapable subquery | |
623 | |
624 # Try combining DISTINCT, LIMIT, and OFFSET. Make sure they all work | |
625 # together. | |
626 # | |
627 do_test select4-10.1 { | |
628 execsql { | |
629 SELECT DISTINCT log FROM t1 ORDER BY log | |
630 } | |
631 } {0 1 2 3 4 5} | |
632 do_test select4-10.2 { | |
633 execsql { | |
634 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4 | |
635 } | |
636 } {0 1 2 3} | |
637 do_test select4-10.3 { | |
638 execsql { | |
639 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 | |
640 } | |
641 } {} | |
642 do_test select4-10.4 { | |
643 execsql { | |
644 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 | |
645 } | |
646 } {0 1 2 3 4 5} | |
647 do_test select4-10.5 { | |
648 execsql { | |
649 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2 | |
650 } | |
651 } {2 3 4 5} | |
652 do_test select4-10.6 { | |
653 execsql { | |
654 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2 | |
655 } | |
656 } {2 3 4} | |
657 do_test select4-10.7 { | |
658 execsql { | |
659 SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20 | |
660 } | |
661 } {} | |
662 do_test select4-10.8 { | |
663 execsql { | |
664 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3 | |
665 } | |
666 } {} | |
667 do_test select4-10.9 { | |
668 execsql { | |
669 SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1 | |
670 } | |
671 } {31 5} | |
672 | |
673 # Make sure compound SELECTs with wildly different numbers of columns | |
674 # do not cause assertion faults due to register allocation issues. | |
675 # | |
676 do_test select4-11.1 { | |
677 catchsql { | |
678 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 | |
679 UNION | |
680 SELECT x FROM t2 | |
681 } | |
682 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} | |
683 do_test select4-11.2 { | |
684 catchsql { | |
685 SELECT x FROM t2 | |
686 UNION | |
687 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 | |
688 } | |
689 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} | |
690 do_test select4-11.3 { | |
691 catchsql { | |
692 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 | |
693 UNION ALL | |
694 SELECT x FROM t2 | |
695 } | |
696 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} | |
697 do_test select4-11.4 { | |
698 catchsql { | |
699 SELECT x FROM t2 | |
700 UNION ALL | |
701 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 | |
702 } | |
703 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} | |
704 do_test select4-11.5 { | |
705 catchsql { | |
706 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 | |
707 EXCEPT | |
708 SELECT x FROM t2 | |
709 } | |
710 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} | |
711 do_test select4-11.6 { | |
712 catchsql { | |
713 SELECT x FROM t2 | |
714 EXCEPT | |
715 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 | |
716 } | |
717 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} | |
718 do_test select4-11.7 { | |
719 catchsql { | |
720 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 | |
721 INTERSECT | |
722 SELECT x FROM t2 | |
723 } | |
724 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} | |
725 do_test select4-11.8 { | |
726 catchsql { | |
727 SELECT x FROM t2 | |
728 INTERSECT | |
729 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 | |
730 } | |
731 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} | |
732 | |
733 do_test select4-11.11 { | |
734 catchsql { | |
735 SELECT x FROM t2 | |
736 UNION | |
737 SELECT x FROM t2 | |
738 UNION ALL | |
739 SELECT x FROM t2 | |
740 EXCEPT | |
741 SELECT x FROM t2 | |
742 INTERSECT | |
743 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 | |
744 } | |
745 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} | |
746 do_test select4-11.12 { | |
747 catchsql { | |
748 SELECT x FROM t2 | |
749 UNION | |
750 SELECT x FROM t2 | |
751 UNION ALL | |
752 SELECT x FROM t2 | |
753 EXCEPT | |
754 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 | |
755 EXCEPT | |
756 SELECT x FROM t2 | |
757 } | |
758 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} | |
759 do_test select4-11.13 { | |
760 catchsql { | |
761 SELECT x FROM t2 | |
762 UNION | |
763 SELECT x FROM t2 | |
764 UNION ALL | |
765 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 | |
766 UNION ALL | |
767 SELECT x FROM t2 | |
768 EXCEPT | |
769 SELECT x FROM t2 | |
770 } | |
771 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} | |
772 do_test select4-11.14 { | |
773 catchsql { | |
774 SELECT x FROM t2 | |
775 UNION | |
776 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 | |
777 UNION | |
778 SELECT x FROM t2 | |
779 UNION ALL | |
780 SELECT x FROM t2 | |
781 EXCEPT | |
782 SELECT x FROM t2 | |
783 } | |
784 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} | |
785 do_test select4-11.15 { | |
786 catchsql { | |
787 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 | |
788 UNION | |
789 SELECT x FROM t2 | |
790 INTERSECT | |
791 SELECT 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 do not have the same number of resu
lt columns}} | |
798 | |
799 do_test select4-12.1 { | |
800 sqlite3 db2 :memory: | |
801 catchsql { | |
802 SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1; | |
803 } db2 | |
804 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} | |
805 | |
806 } ;# ifcapable compound | |
807 | |
808 | |
809 # Ticket [3557ad65a076c] - Incorrect DISTINCT processing with an | |
810 # indexed query using IN. | |
811 # | |
812 do_test select4-13.1 { | |
813 sqlite3 db test.db | |
814 db eval { | |
815 CREATE TABLE t13(a,b); | |
816 INSERT INTO t13 VALUES(1,1); | |
817 INSERT INTO t13 VALUES(2,1); | |
818 INSERT INTO t13 VALUES(3,1); | |
819 INSERT INTO t13 VALUES(2,2); | |
820 INSERT INTO t13 VALUES(3,2); | |
821 INSERT INTO t13 VALUES(4,2); | |
822 CREATE INDEX t13ab ON t13(a,b); | |
823 SELECT DISTINCT b from t13 WHERE a IN (1,2,3); | |
824 } | |
825 } {1 2} | |
826 | |
827 # 2014-02-18: Make sure compound SELECTs work with VALUES clauses | |
828 # | |
829 do_execsql_test select4-14.1 { | |
830 CREATE TABLE t14(a,b,c); | |
831 INSERT INTO t14 VALUES(1,2,3),(4,5,6); | |
832 SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); | |
833 } {1 2 3} | |
834 do_execsql_test select4-14.2 { | |
835 SELECT * FROM t14 INTERSECT VALUES(1,2,3); | |
836 } {1 2 3} | |
837 do_execsql_test select4-14.3 { | |
838 SELECT * FROM t14 | |
839 UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6) | |
840 UNION SELECT * FROM t14 ORDER BY 1, 2, 3 | |
841 } {1 2 3 2 3 1 3 2 1 4 5 6 7 8 9} | |
842 do_execsql_test select4-14.4 { | |
843 SELECT * FROM t14 | |
844 UNION VALUES(3,2,1) | |
845 UNION SELECT * FROM t14 ORDER BY 1, 2, 3 | |
846 } {1 2 3 3 2 1 4 5 6} | |
847 do_execsql_test select4-14.5 { | |
848 SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); | |
849 } {4 5 6} | |
850 do_execsql_test select4-14.6 { | |
851 SELECT * FROM t14 EXCEPT VALUES(1,2,3) | |
852 } {4 5 6} | |
853 do_execsql_test select4-14.7 { | |
854 SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6) | |
855 } {} | |
856 do_execsql_test select4-14.8 { | |
857 SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6) | |
858 } {1 2 3} | |
859 do_execsql_test select4-14.9 { | |
860 SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); | |
861 } {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3} | |
862 | |
863 finish_test | |
OLD | NEW |