tuple: update to make use of C++11
[chromium-blink-merge.git] / third_party / sqlite / src / test / selectB.test
blob3fdf85c0f9fc92b47b02bb2215b55b22702db470
1 # 2008 June 24
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
18 ifcapable !compound {
19   finish_test
20   return
23 proc test_transform {testname sql1 sql2 results} {
24   set ::vdbe1 [list]
25   set ::vdbe2 [list]
26   db eval "explain $sql1" { lappend ::vdbe1 $opcode }
27   db eval "explain $sql2" { lappend ::vdbe2 $opcode }
29   do_test $testname.transform {
30     set ::vdbe1
31   } $::vdbe2
33   set ::sql1 $sql1
34   do_test $testname.sql1 {
35     execsql $::sql1
36   } $results
38   set ::sql2 $sql2
39   do_test $testname.sql2 {
40     execsql $::sql2
41   } $results
44 do_test selectB-1.1 {
45   execsql {
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);
56   }
57 } {}
59 for {set ii 1} {$ii <= 2} {incr ii} {
61   if {$ii == 2} {
62     do_test selectB-2.1 {
63       execsql {
64         CREATE INDEX i1 ON t1(a);
65         CREATE INDEX i2 ON t2(d);
66       }
67     } {}
68   }
70   test_transform selectB-$ii.2 {
71     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
72   } {
73     SELECT a FROM t1 UNION ALL SELECT d FROM t2
74   } {2 8 14 3 12 21}
75   
76   test_transform selectB-$ii.3 {
77     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
78   } {
79     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
80   } {2 3 8 12 14 21}
81   
82   test_transform selectB-$ii.4 {
83     SELECT * FROM 
84       (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
85     WHERE a>10 ORDER BY 1
86   } {
87     SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
88   } {12 14 21}
89   
90   test_transform selectB-$ii.5 {
91     SELECT * FROM 
92       (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
93     WHERE a>10 ORDER BY a
94   } {
95     SELECT a FROM t1 WHERE a>10 
96       UNION ALL 
97     SELECT d FROM t2 WHERE d>10 
98     ORDER BY a
99   } {12 14 21}
100   
101   test_transform selectB-$ii.6 {
102     SELECT * FROM 
103       (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12) 
104     WHERE a>10 ORDER BY a
105   } {
106     SELECT a FROM t1 WHERE a>10
107       UNION ALL 
108     SELECT d FROM t2 WHERE d>12 AND d>10
109     ORDER BY a
110   } {14 21}
111   
112   test_transform selectB-$ii.7 {
113     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
114     LIMIT 2
115   } {
116     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
117   } {2 3}
118   
119   test_transform selectB-$ii.8 {
120     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
121     LIMIT 2 OFFSET 3
122   } {
123     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
124   } {12 14}
126   test_transform selectB-$ii.9 {
127     SELECT * FROM (
128       SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
129     ) 
130   } {
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}
133   
134   test_transform selectB-$ii.10 {
135     SELECT * FROM (
136       SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
137     ) ORDER BY 1
138   } {
139     SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
140     ORDER BY 1
141   } {2 3 6 8 12 12 14 18 21}
142   
143   test_transform selectB-$ii.11 {
144     SELECT * FROM (
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
147   } {
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
150     ORDER BY 1 LIMIT 3
151   } {12 12 14}
153   test_transform selectB-$ii.12 {
154     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2)
155   } {
156     SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2
157   } {2 8}
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)
162   # } {
163   #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC
164   # } {2 3 8 12 14 21}
165   # 
166   # test_transform selectB-$ii.14 {
167   #  SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC)
168   # } {
169   #  SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
170   # } {21 14 12 8 3 2}
171   #
172   # test_transform selectB-$ii.14 {
173   #   SELECT * FROM (
174   #     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC
175   #   ) LIMIT 2 OFFSET 2
176   # } {
177   #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
178   #    LIMIT 2 OFFSET 2
179   # } {12 8}
180   #
181   # test_transform selectB-$ii.15 {
182   #   SELECT * FROM (
183   #     SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
184   #  )
185   # } {
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 {
191   execsql {
192     DROP INDEX i1;
193     DROP INDEX i2;
194   }
195 } {}
197 for {set ii 3} {$ii <= 4} {incr ii} {
199   if {$ii == 4} {
200     do_test selectB-4.0 {
201       execsql {
202         CREATE INDEX i1 ON t1(a);
203         CREATE INDEX i2 ON t1(b);
204         CREATE INDEX i3 ON t1(c);
205         CREATE INDEX i4 ON t2(d);
206         CREATE INDEX i5 ON t2(e);
207         CREATE INDEX i6 ON t2(f);
208       }
209     } {}
210   }
212   do_test selectB-$ii.1 {
213     execsql {
214       SELECT DISTINCT * FROM 
215         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
216       ORDER BY 1;
217     }
218   } {6 12 15 18 24}
219   
220   do_test selectB-$ii.2 {
221     execsql {
222       SELECT c, count(*) FROM 
223         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
224       GROUP BY c ORDER BY 1;
225     }
226   } {6 2 12 1 15 1 18 1 24 1}
227   do_test selectB-$ii.3 {
228     execsql {
229       SELECT c, count(*) FROM 
230         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
231       GROUP BY c HAVING count(*)>1;
232     }
233   } {6 2}
234   do_test selectB-$ii.4 {
235     execsql {
236       SELECT t4.c, t3.a FROM 
237         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
238       WHERE t3.a=14
239       ORDER BY 1
240     }
241   } {6 14 6 14 12 14 15 14 18 14 24 14}
242   
243   do_test selectB-$ii.5 {
244     execsql {
245       SELECT d FROM t2 
246       EXCEPT 
247       SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
248     }
249   } {}
250   do_test selectB-$ii.6 {
251     execsql {
252       SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
253       EXCEPT 
254       SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
255     }
256   } {}
257   do_test selectB-$ii.7 {
258     execsql {
259       SELECT c FROM t1
260       EXCEPT 
261       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
262     }
263   } {12}
264   do_test selectB-$ii.8 {
265     execsql {
266       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
267       EXCEPT 
268       SELECT c FROM t1
269     }
270   } {9 15 24 27}
271   do_test selectB-$ii.9 {
272     execsql {
273       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
274       EXCEPT 
275       SELECT c FROM t1
276       ORDER BY c DESC
277     }
278   } {27 24 15 9}
279   
280   do_test selectB-$ii.10 {
281     execsql {
282       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
283       UNION 
284       SELECT c FROM t1
285       ORDER BY c DESC
286     }
287   } {27 24 18 15 12 9 6}
288   do_test selectB-$ii.11 {
289     execsql {
290       SELECT c FROM t1
291       UNION 
292       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
293       ORDER BY c
294     }
295   } {6 9 12 15 18 24 27}
296   do_test selectB-$ii.12 {
297     execsql {
298       SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2
299       ORDER BY c
300     }
301   } {6 9 12 15 18 18 24 27}
302   do_test selectB-$ii.13 {
303     execsql {
304       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
305       UNION 
306       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
307       ORDER BY 1
308     }
309   } {6 9 15 18 24 27}
310   
311   do_test selectB-$ii.14 {
312     execsql {
313       SELECT c FROM t1
314       INTERSECT 
315       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
316       ORDER BY 1
317     }
318   } {6 18}
319   do_test selectB-$ii.15 {
320     execsql {
321       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
322       INTERSECT 
323       SELECT c FROM t1
324       ORDER BY 1
325     }
326   } {6 18}
327   do_test selectB-$ii.16 {
328     execsql {
329       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
330       INTERSECT 
331       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
332       ORDER BY 1
333     }
334   } {6 9 15 18 24 27}
336   do_test selectB-$ii.17 {
337     execsql {
338       SELECT * FROM (
339         SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4
340       ) LIMIT 2
341     }
342   } {2 8}
344   do_test selectB-$ii.18 {
345     execsql {
346       SELECT * FROM (
347         SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2
348       ) LIMIT 2
349     }
350   } {14 3}
352   do_test selectB-$ii.19 {
353     execsql {
354       SELECT * FROM (
355         SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
356       )
357     }
358   } {0 1 0 1}
360   do_test selectB-$ii.20 {
361     execsql {
362       SELECT DISTINCT * FROM (
363         SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
364       )
365     }
366   } {0 1}
368   do_test selectB-$ii.21 {
369     execsql {
370       SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b
371     }
372   } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27}
374   do_test selectB-$ii.21 {
375     execsql {
376       SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1;
377     }
378   } {3 12 21 345}
381 finish_test