3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # $Id: selectB.test,v 1.10 2009/04/02 16:59:47 drh Exp $
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
23 proc test_transform {testname sql1 sql2 results} {
26 db eval "explain $sql1" { lappend ::vdbe1 $opcode }
27 db eval "explain $sql2" { lappend ::vdbe2 $opcode }
29 do_test $testname.transform {
34 do_test $testname.sql1 {
39 do_test $testname.sql2 {
46 CREATE TABLE t1(a, b, c);
47 CREATE TABLE t2(d, e, f);
49 INSERT INTO t1 VALUES( 2, 4, 6);
50 INSERT INTO t1 VALUES( 8, 10, 12);
51 INSERT INTO t1 VALUES(14, 16, 18);
53 INSERT INTO t2 VALUES(3, 6, 9);
54 INSERT INTO t2 VALUES(12, 15, 18);
55 INSERT INTO t2 VALUES(21, 24, 27);
59 for {set ii 1} {$ii <= 2} {incr ii} {
64 CREATE INDEX i1 ON t1(a);
65 CREATE INDEX i2 ON t2(d);
70 test_transform selectB-$ii.2 {
71 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
73 SELECT a FROM t1 UNION ALL SELECT d FROM t2
76 test_transform selectB-$ii.3 {
77 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
79 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
82 test_transform selectB-$ii.4 {
84 (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
87 SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
90 test_transform selectB-$ii.5 {
92 (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
95 SELECT a FROM t1 WHERE a>10
97 SELECT d FROM t2 WHERE d>10
101 test_transform selectB-$ii.6 {
103 (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12)
104 WHERE a>10 ORDER BY a
106 SELECT a FROM t1 WHERE a>10
108 SELECT d FROM t2 WHERE d>12 AND d>10
112 test_transform selectB-$ii.7 {
113 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
116 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
119 test_transform selectB-$ii.8 {
120 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
123 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
126 test_transform selectB-$ii.9 {
128 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
131 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
132 } {2 8 14 3 12 21 6 12 18}
134 test_transform selectB-$ii.10 {
136 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
139 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
141 } {2 3 6 8 12 12 14 18 21}
143 test_transform selectB-$ii.11 {
145 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
146 ) WHERE a>=10 ORDER BY 1 LIMIT 3
148 SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10
149 UNION ALL SELECT c FROM t1 WHERE c>=10
153 test_transform selectB-$ii.12 {
154 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2)
156 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2
159 # An ORDER BY in a compound subqueries defeats flattening. Ticket #3773
160 # test_transform selectB-$ii.13 {
161 # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a ASC)
163 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC
166 # test_transform selectB-$ii.14 {
167 # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC)
169 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
172 # test_transform selectB-$ii.14 {
174 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC
177 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
181 # test_transform selectB-$ii.15 {
183 # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
186 # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
187 # } {2 4 3 6 8 10 12 15 14 16 21 24}
190 do_test selectB-3.0 {
197 for {set ii 3} {$ii <= 6} {incr ii} {
201 optimization_control db query-flattener off
204 optimization_control db query-flattener on
205 do_test selectB-5.0 {
207 CREATE INDEX i1 ON t1(a);
208 CREATE INDEX i2 ON t1(b);
209 CREATE INDEX i3 ON t1(c);
210 CREATE INDEX i4 ON t2(d);
211 CREATE INDEX i5 ON t2(e);
212 CREATE INDEX i6 ON t2(f);
217 optimization_control db query-flattener off
221 do_test selectB-$ii.1 {
223 SELECT DISTINCT * FROM
224 (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
229 do_test selectB-$ii.2 {
231 SELECT c, count(*) FROM
232 (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
233 GROUP BY c ORDER BY 1;
235 } {6 2 12 1 15 1 18 1 24 1}
236 do_test selectB-$ii.3 {
238 SELECT c, count(*) FROM
239 (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
240 GROUP BY c HAVING count(*)>1;
243 do_test selectB-$ii.4 {
245 SELECT t4.c, t3.a FROM
246 (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
250 } {6 14 6 14 12 14 15 14 18 14 24 14}
252 do_test selectB-$ii.5 {
256 SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
259 do_test selectB-$ii.6 {
261 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
263 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
266 do_test selectB-$ii.7 {
270 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
273 do_test selectB-$ii.8 {
275 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
280 do_test selectB-$ii.9 {
282 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
289 do_test selectB-$ii.10 {
291 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
296 } {27 24 18 15 12 9 6}
297 do_test selectB-$ii.11 {
301 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
304 } {6 9 12 15 18 24 27}
305 do_test selectB-$ii.12 {
307 SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2
310 } {6 9 12 15 18 18 24 27}
311 do_test selectB-$ii.13 {
313 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
315 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
320 do_test selectB-$ii.14 {
324 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
328 do_test selectB-$ii.15 {
330 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
336 do_test selectB-$ii.16 {
338 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
340 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
345 do_test selectB-$ii.17 {
348 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4
353 do_test selectB-$ii.18 {
356 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2
361 do_test selectB-$ii.19 {
364 SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
369 do_test selectB-$ii.20 {
371 SELECT DISTINCT * FROM (
372 SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
377 do_test selectB-$ii.21 {
379 SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b
381 } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27}
383 do_test selectB-$ii.22 {
385 SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1;
389 do_test selectB-$ii.23 {
392 SELECT a AS x, b AS y FROM t1
394 SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 JOIN t2 ON (c=d)
396 SELECT a*100, b*100 FROM t1
399 } {2 4 8 10 14 16 80.1 180.1 200 400 800 1000 1400 1600}
401 do_test selectB-$ii.24 {
404 SELECT a AS x, b AS y FROM t1
406 SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
408 SELECT a*100, b*100 FROM t1
411 } {2 4 8 10 14 16 20.1 {} 80.1 180.1 140.1 {} 200 400 800 1000 1400 1600}
413 do_test selectB-$ii.25 {
416 SELECT a AS x, b AS y FROM t1
418 SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
420 SELECT a*100, b*100 FROM t1
421 ) WHERE y+x NOT NULL ORDER BY 1;
423 } {6 18 30 260.2 600 1800 3000}