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