xref: /titanic_51/usr/src/lib/libsqlite/test/select6.test (revision c5c4113dfcabb1eed3d4bdf7609de5170027a794)
1*c5c4113dSnw141292
2*c5c4113dSnw141292#pragma ident	"%Z%%M%	%I%	%E% SMI"
3*c5c4113dSnw141292
4*c5c4113dSnw141292# 2001 September 15
5*c5c4113dSnw141292#
6*c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
7*c5c4113dSnw141292# a legal notice, here is a blessing:
8*c5c4113dSnw141292#
9*c5c4113dSnw141292#    May you do good and not evil.
10*c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
11*c5c4113dSnw141292#    May you share freely, never taking more than you give.
12*c5c4113dSnw141292#
13*c5c4113dSnw141292#***********************************************************************
14*c5c4113dSnw141292# This file implements regression tests for SQLite library.  The
15*c5c4113dSnw141292# focus of this file is testing SELECT statements that contain
16*c5c4113dSnw141292# subqueries in their FROM clause.
17*c5c4113dSnw141292#
18*c5c4113dSnw141292# $Id: select6.test,v 1.11 2004/01/24 20:18:13 drh Exp $
19*c5c4113dSnw141292
20*c5c4113dSnw141292set testdir [file dirname $argv0]
21*c5c4113dSnw141292source $testdir/tester.tcl
22*c5c4113dSnw141292
23*c5c4113dSnw141292do_test select6-1.0 {
24*c5c4113dSnw141292  execsql {
25*c5c4113dSnw141292    BEGIN;
26*c5c4113dSnw141292    CREATE TABLE t1(x, y);
27*c5c4113dSnw141292    INSERT INTO t1 VALUES(1,1);
28*c5c4113dSnw141292    INSERT INTO t1 VALUES(2,2);
29*c5c4113dSnw141292    INSERT INTO t1 VALUES(3,2);
30*c5c4113dSnw141292    INSERT INTO t1 VALUES(4,3);
31*c5c4113dSnw141292    INSERT INTO t1 VALUES(5,3);
32*c5c4113dSnw141292    INSERT INTO t1 VALUES(6,3);
33*c5c4113dSnw141292    INSERT INTO t1 VALUES(7,3);
34*c5c4113dSnw141292    INSERT INTO t1 VALUES(8,4);
35*c5c4113dSnw141292    INSERT INTO t1 VALUES(9,4);
36*c5c4113dSnw141292    INSERT INTO t1 VALUES(10,4);
37*c5c4113dSnw141292    INSERT INTO t1 VALUES(11,4);
38*c5c4113dSnw141292    INSERT INTO t1 VALUES(12,4);
39*c5c4113dSnw141292    INSERT INTO t1 VALUES(13,4);
40*c5c4113dSnw141292    INSERT INTO t1 VALUES(14,4);
41*c5c4113dSnw141292    INSERT INTO t1 VALUES(15,4);
42*c5c4113dSnw141292    INSERT INTO t1 VALUES(16,5);
43*c5c4113dSnw141292    INSERT INTO t1 VALUES(17,5);
44*c5c4113dSnw141292    INSERT INTO t1 VALUES(18,5);
45*c5c4113dSnw141292    INSERT INTO t1 VALUES(19,5);
46*c5c4113dSnw141292    INSERT INTO t1 VALUES(20,5);
47*c5c4113dSnw141292    COMMIT;
48*c5c4113dSnw141292    SELECT DISTINCT y FROM t1 ORDER BY y;
49*c5c4113dSnw141292  }
50*c5c4113dSnw141292} {1 2 3 4 5}
51*c5c4113dSnw141292
52*c5c4113dSnw141292do_test select6-1.1 {
53*c5c4113dSnw141292  execsql2 {SELECT * FROM (SELECT x, y FROM t1 WHERE x<2)}
54*c5c4113dSnw141292} {x 1 y 1}
55*c5c4113dSnw141292do_test select6-1.2 {
56*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT y FROM t1)}
57*c5c4113dSnw141292} {20}
58*c5c4113dSnw141292do_test select6-1.3 {
59*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT DISTINCT y FROM t1)}
60*c5c4113dSnw141292} {5}
61*c5c4113dSnw141292do_test select6-1.4 {
62*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT y FROM t1))}
63*c5c4113dSnw141292} {5}
64*c5c4113dSnw141292do_test select6-1.5 {
65*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT y FROM t1))}
66*c5c4113dSnw141292} {5}
67*c5c4113dSnw141292
68*c5c4113dSnw141292do_test select6-1.6 {
69*c5c4113dSnw141292  execsql {
70*c5c4113dSnw141292    SELECT *
71*c5c4113dSnw141292    FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
72*c5c4113dSnw141292         (SELECT max(x),y FROM t1 GROUP BY y) as b
73*c5c4113dSnw141292    WHERE a.y=b.y ORDER BY a.y
74*c5c4113dSnw141292  }
75*c5c4113dSnw141292} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
76*c5c4113dSnw141292do_test select6-1.7 {
77*c5c4113dSnw141292  execsql {
78*c5c4113dSnw141292    SELECT a.y, a.[count(*)], [max(x)], [count(*)]
79*c5c4113dSnw141292    FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
80*c5c4113dSnw141292         (SELECT max(x),y FROM t1 GROUP BY y) as b
81*c5c4113dSnw141292    WHERE a.y=b.y ORDER BY a.y
82*c5c4113dSnw141292  }
83*c5c4113dSnw141292} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
84*c5c4113dSnw141292do_test select6-1.8 {
85*c5c4113dSnw141292  execsql {
86*c5c4113dSnw141292    SELECT q, p, r
87*c5c4113dSnw141292    FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
88*c5c4113dSnw141292         (SELECT max(x) as r, y as s FROM t1 GROUP BY y) as b
89*c5c4113dSnw141292    WHERE q=s ORDER BY s
90*c5c4113dSnw141292  }
91*c5c4113dSnw141292} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
92*c5c4113dSnw141292do_test select6-1.9 {
93*c5c4113dSnw141292  execsql {
94*c5c4113dSnw141292    SELECT q, p, r, b.[min(x)+y]
95*c5c4113dSnw141292    FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
96*c5c4113dSnw141292         (SELECT max(x) as r, y as s, min(x)+y FROM t1 GROUP BY y) as b
97*c5c4113dSnw141292    WHERE q=s ORDER BY s
98*c5c4113dSnw141292  }
99*c5c4113dSnw141292} {1 1 1 2 2 2 3 4 3 4 7 7 4 8 15 12 5 5 20 21}
100*c5c4113dSnw141292
101*c5c4113dSnw141292do_test select6-2.0 {
102*c5c4113dSnw141292  execsql {
103*c5c4113dSnw141292    CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
104*c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t1;
105*c5c4113dSnw141292    SELECT DISTINCT b FROM t2 ORDER BY b;
106*c5c4113dSnw141292  }
107*c5c4113dSnw141292} {1 2 3 4 5}
108*c5c4113dSnw141292do_test select6-2.1 {
109*c5c4113dSnw141292  execsql2 {SELECT * FROM (SELECT a, b FROM t2 WHERE a<2)}
110*c5c4113dSnw141292} {a 1 b 1}
111*c5c4113dSnw141292do_test select6-2.2 {
112*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT b FROM t2)}
113*c5c4113dSnw141292} {20}
114*c5c4113dSnw141292do_test select6-2.3 {
115*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT DISTINCT b FROM t2)}
116*c5c4113dSnw141292} {5}
117*c5c4113dSnw141292do_test select6-2.4 {
118*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT b FROM t2))}
119*c5c4113dSnw141292} {5}
120*c5c4113dSnw141292do_test select6-2.5 {
121*c5c4113dSnw141292  execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT b FROM t2))}
122*c5c4113dSnw141292} {5}
123*c5c4113dSnw141292
124*c5c4113dSnw141292do_test select6-2.6 {
125*c5c4113dSnw141292  execsql {
126*c5c4113dSnw141292    SELECT *
127*c5c4113dSnw141292    FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
128*c5c4113dSnw141292         (SELECT max(a),b FROM t2 GROUP BY b) as b
129*c5c4113dSnw141292    WHERE a.b=b.b ORDER BY a.b
130*c5c4113dSnw141292  }
131*c5c4113dSnw141292} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
132*c5c4113dSnw141292do_test select6-2.7 {
133*c5c4113dSnw141292  execsql {
134*c5c4113dSnw141292    SELECT a.b, a.[count(*)], [max(a)], [count(*)]
135*c5c4113dSnw141292    FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
136*c5c4113dSnw141292         (SELECT max(a),b FROM t2 GROUP BY b) as b
137*c5c4113dSnw141292    WHERE a.b=b.b ORDER BY a.b
138*c5c4113dSnw141292  }
139*c5c4113dSnw141292} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
140*c5c4113dSnw141292do_test select6-2.8 {
141*c5c4113dSnw141292  execsql {
142*c5c4113dSnw141292    SELECT q, p, r
143*c5c4113dSnw141292    FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY b) AS a,
144*c5c4113dSnw141292         (SELECT max(a) as r, b as s FROM t2 GROUP BY b) as b
145*c5c4113dSnw141292    WHERE q=s ORDER BY s
146*c5c4113dSnw141292  }
147*c5c4113dSnw141292} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
148*c5c4113dSnw141292do_test select6-2.9 {
149*c5c4113dSnw141292  execsql {
150*c5c4113dSnw141292    SELECT a.q, a.p, b.r
151*c5c4113dSnw141292    FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
152*c5c4113dSnw141292         (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
153*c5c4113dSnw141292    WHERE a.q=b.s ORDER BY a.q
154*c5c4113dSnw141292  }
155*c5c4113dSnw141292} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
156*c5c4113dSnw141292
157*c5c4113dSnw141292do_test sqlite6-3.1 {
158*c5c4113dSnw141292  execsql2 {
159*c5c4113dSnw141292    SELECT * FROM (SELECT * FROM (SELECT * FROM t1 WHERE x=3));
160*c5c4113dSnw141292  }
161*c5c4113dSnw141292} {x 3 y 2}
162*c5c4113dSnw141292do_test sqlite6-3.2 {
163*c5c4113dSnw141292  execsql {
164*c5c4113dSnw141292    SELECT * FROM
165*c5c4113dSnw141292      (SELECT a.q, a.p, b.r
166*c5c4113dSnw141292       FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
167*c5c4113dSnw141292            (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
168*c5c4113dSnw141292       WHERE a.q=b.s ORDER BY a.q)
169*c5c4113dSnw141292    ORDER BY q
170*c5c4113dSnw141292  }
171*c5c4113dSnw141292} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
172*c5c4113dSnw141292do_test select6-3.3 {
173*c5c4113dSnw141292  execsql {
174*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
175*c5c4113dSnw141292  }
176*c5c4113dSnw141292} {10.5 3.7 14.2}
177*c5c4113dSnw141292do_test select6-3.4 {
178*c5c4113dSnw141292  execsql {
179*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
180*c5c4113dSnw141292  }
181*c5c4113dSnw141292} {11.5 4 15.5}
182*c5c4113dSnw141292do_test select6-3.5 {
183*c5c4113dSnw141292  execsql {
184*c5c4113dSnw141292    SELECT x,y,x+y FROM (SELECT avg(a) as 'x', avg(b) as 'y' FROM t2 WHERE a=4)
185*c5c4113dSnw141292  }
186*c5c4113dSnw141292} {4 3 7}
187*c5c4113dSnw141292do_test select6-3.6 {
188*c5c4113dSnw141292  execsql {
189*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
190*c5c4113dSnw141292    WHERE a>10
191*c5c4113dSnw141292  }
192*c5c4113dSnw141292} {10.5 3.7 14.2}
193*c5c4113dSnw141292do_test select6-3.7 {
194*c5c4113dSnw141292  execsql {
195*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
196*c5c4113dSnw141292    WHERE a<10
197*c5c4113dSnw141292  }
198*c5c4113dSnw141292} {}
199*c5c4113dSnw141292do_test select6-3.8 {
200*c5c4113dSnw141292  execsql {
201*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
202*c5c4113dSnw141292    WHERE a>10
203*c5c4113dSnw141292  }
204*c5c4113dSnw141292} {11.5 4 15.5}
205*c5c4113dSnw141292do_test select6-3.9 {
206*c5c4113dSnw141292  execsql {
207*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
208*c5c4113dSnw141292    WHERE a<10
209*c5c4113dSnw141292  }
210*c5c4113dSnw141292} {}
211*c5c4113dSnw141292do_test select6-3.10 {
212*c5c4113dSnw141292  execsql {
213*c5c4113dSnw141292    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
214*c5c4113dSnw141292    ORDER BY a
215*c5c4113dSnw141292  }
216*c5c4113dSnw141292} {1 1 2 2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18 5 23}
217*c5c4113dSnw141292do_test select6-3.11 {
218*c5c4113dSnw141292  execsql {
219*c5c4113dSnw141292    SELECT a,b,a+b FROM
220*c5c4113dSnw141292       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
221*c5c4113dSnw141292    WHERE b<4 ORDER BY a
222*c5c4113dSnw141292  }
223*c5c4113dSnw141292} {1 1 2 2.5 2 4.5 5.5 3 8.5}
224*c5c4113dSnw141292do_test select6-3.12 {
225*c5c4113dSnw141292  execsql {
226*c5c4113dSnw141292    SELECT a,b,a+b FROM
227*c5c4113dSnw141292       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
228*c5c4113dSnw141292    WHERE b<4 ORDER BY a
229*c5c4113dSnw141292  }
230*c5c4113dSnw141292} {2.5 2 4.5 5.5 3 8.5}
231*c5c4113dSnw141292do_test select6-3.13 {
232*c5c4113dSnw141292  execsql {
233*c5c4113dSnw141292    SELECT a,b,a+b FROM
234*c5c4113dSnw141292       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
235*c5c4113dSnw141292    ORDER BY a
236*c5c4113dSnw141292  }
237*c5c4113dSnw141292} {2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18 5 23}
238*c5c4113dSnw141292do_test select6-3.14 {
239*c5c4113dSnw141292  execsql {
240*c5c4113dSnw141292    SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
241*c5c4113dSnw141292    ORDER BY [count(*)]
242*c5c4113dSnw141292  }
243*c5c4113dSnw141292} {1 1 2 2 4 3 5 5 8 4}
244*c5c4113dSnw141292do_test select6-3.15 {
245*c5c4113dSnw141292  execsql {
246*c5c4113dSnw141292    SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
247*c5c4113dSnw141292    ORDER BY y
248*c5c4113dSnw141292  }
249*c5c4113dSnw141292} {1 1 2 2 4 3 8 4 5 5}
250*c5c4113dSnw141292
251*c5c4113dSnw141292do_test select6-4.1 {
252*c5c4113dSnw141292  execsql {
253*c5c4113dSnw141292    SELECT a,b,c FROM
254*c5c4113dSnw141292      (SELECT x AS 'a', y AS 'b', x+y AS 'c' FROM t1 WHERE y=4)
255*c5c4113dSnw141292    WHERE a<10 ORDER BY a;
256*c5c4113dSnw141292  }
257*c5c4113dSnw141292} {8 4 12 9 4 13}
258*c5c4113dSnw141292do_test select6-4.2 {
259*c5c4113dSnw141292  execsql {
260*c5c4113dSnw141292    SELECT y FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
261*c5c4113dSnw141292  }
262*c5c4113dSnw141292} {1 2 3 4}
263*c5c4113dSnw141292do_test select6-4.3 {
264*c5c4113dSnw141292  execsql {
265*c5c4113dSnw141292    SELECT DISTINCT y FROM (SELECT y FROM t1) WHERE y<5 ORDER BY y
266*c5c4113dSnw141292  }
267*c5c4113dSnw141292} {1 2 3 4}
268*c5c4113dSnw141292do_test select6-4.4 {
269*c5c4113dSnw141292  execsql {
270*c5c4113dSnw141292    SELECT avg(y) FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
271*c5c4113dSnw141292  }
272*c5c4113dSnw141292} {2.5}
273*c5c4113dSnw141292do_test select6-4.5 {
274*c5c4113dSnw141292  execsql {
275*c5c4113dSnw141292    SELECT avg(y) FROM (SELECT DISTINCT y FROM t1 WHERE y<5) ORDER BY y
276*c5c4113dSnw141292  }
277*c5c4113dSnw141292} {2.5}
278*c5c4113dSnw141292
279*c5c4113dSnw141292do_test select6-5.1 {
280*c5c4113dSnw141292  execsql {
281*c5c4113dSnw141292    SELECT a,x,b FROM
282*c5c4113dSnw141292      (SELECT x+3 AS 'a', x FROM t1 WHERE y=3) AS 'p',
283*c5c4113dSnw141292      (SELECT x AS 'b' FROM t1 WHERE y=4) AS 'q'
284*c5c4113dSnw141292    WHERE a=b
285*c5c4113dSnw141292    ORDER BY a
286*c5c4113dSnw141292  }
287*c5c4113dSnw141292} {8 5 8 9 6 9 10 7 10}
288*c5c4113dSnw141292do_test select6-5.2 {
289*c5c4113dSnw141292  execsql {
290*c5c4113dSnw141292    SELECT a,x,b FROM
291*c5c4113dSnw141292      (SELECT x+3 AS 'a', x FROM t1 WHERE y=3),
292*c5c4113dSnw141292      (SELECT x AS 'b' FROM t1 WHERE y=4)
293*c5c4113dSnw141292    WHERE a=b
294*c5c4113dSnw141292    ORDER BY a
295*c5c4113dSnw141292  }
296*c5c4113dSnw141292} {8 5 8 9 6 9 10 7 10}
297*c5c4113dSnw141292
298*c5c4113dSnw141292# Tests of compound sub-selects
299*c5c4113dSnw141292#
300*c5c4113dSnw141292do_test select5-6.1 {
301*c5c4113dSnw141292  execsql {
302*c5c4113dSnw141292    DELETE FROM t1 WHERE x>4;
303*c5c4113dSnw141292    SELECT * FROM t1
304*c5c4113dSnw141292  }
305*c5c4113dSnw141292} {1 1 2 2 3 2 4 3}
306*c5c4113dSnw141292do_test select6-6.2 {
307*c5c4113dSnw141292  execsql {
308*c5c4113dSnw141292    SELECT * FROM (
309*c5c4113dSnw141292      SELECT x AS 'a' FROM t1 UNION ALL SELECT x+10 AS 'a' FROM t1
310*c5c4113dSnw141292    ) ORDER BY a;
311*c5c4113dSnw141292  }
312*c5c4113dSnw141292} {1 2 3 4 11 12 13 14}
313*c5c4113dSnw141292do_test select6-6.3 {
314*c5c4113dSnw141292  execsql {
315*c5c4113dSnw141292    SELECT * FROM (
316*c5c4113dSnw141292      SELECT x AS 'a' FROM t1 UNION ALL SELECT x+1 AS 'a' FROM t1
317*c5c4113dSnw141292    ) ORDER BY a;
318*c5c4113dSnw141292  }
319*c5c4113dSnw141292} {1 2 2 3 3 4 4 5}
320*c5c4113dSnw141292do_test select6-6.4 {
321*c5c4113dSnw141292  execsql {
322*c5c4113dSnw141292    SELECT * FROM (
323*c5c4113dSnw141292      SELECT x AS 'a' FROM t1 UNION SELECT x+1 AS 'a' FROM t1
324*c5c4113dSnw141292    ) ORDER BY a;
325*c5c4113dSnw141292  }
326*c5c4113dSnw141292} {1 2 3 4 5}
327*c5c4113dSnw141292do_test select6-6.5 {
328*c5c4113dSnw141292  execsql {
329*c5c4113dSnw141292    SELECT * FROM (
330*c5c4113dSnw141292      SELECT x AS 'a' FROM t1 INTERSECT SELECT x+1 AS 'a' FROM t1
331*c5c4113dSnw141292    ) ORDER BY a;
332*c5c4113dSnw141292  }
333*c5c4113dSnw141292} {2 3 4}
334*c5c4113dSnw141292do_test select6-6.6 {
335*c5c4113dSnw141292  execsql {
336*c5c4113dSnw141292    SELECT * FROM (
337*c5c4113dSnw141292      SELECT x AS 'a' FROM t1 EXCEPT SELECT x*2 AS 'a' FROM t1
338*c5c4113dSnw141292    ) ORDER BY a;
339*c5c4113dSnw141292  }
340*c5c4113dSnw141292} {1 3}
341*c5c4113dSnw141292
342*c5c4113dSnw141292# Subselects with no FROM clause
343*c5c4113dSnw141292#
344*c5c4113dSnw141292do_test select6-7.1 {
345*c5c4113dSnw141292  execsql {
346*c5c4113dSnw141292    SELECT * FROM (SELECT 1)
347*c5c4113dSnw141292  }
348*c5c4113dSnw141292} {1}
349*c5c4113dSnw141292do_test select6-7.2 {
350*c5c4113dSnw141292  execsql {
351*c5c4113dSnw141292    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c')
352*c5c4113dSnw141292  }
353*c5c4113dSnw141292} {abc 2 1 1 2 abc}
354*c5c4113dSnw141292do_test select6-7.3 {
355*c5c4113dSnw141292  execsql {
356*c5c4113dSnw141292    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c' WHERE 0)
357*c5c4113dSnw141292  }
358*c5c4113dSnw141292} {}
359*c5c4113dSnw141292do_test select6-7.4 {
360*c5c4113dSnw141292  execsql2 {
361*c5c4113dSnw141292    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c' WHERE 1)
362*c5c4113dSnw141292  }
363*c5c4113dSnw141292} {c abc b 2 a 1 a 1 b 2 c abc}
364*c5c4113dSnw141292
365*c5c4113dSnw141292# The following procedure compiles the SQL given as an argument and returns
366*c5c4113dSnw141292# TRUE if that SQL uses any transient tables and returns FALSE if no
367*c5c4113dSnw141292# transient tables are used.  This is used to make sure that the
368*c5c4113dSnw141292# sqliteFlattenSubquery() routine in select.c is doing its job.
369*c5c4113dSnw141292#
370*c5c4113dSnw141292proc is_flat {sql} {
371*c5c4113dSnw141292  return [expr 0>[lsearch [execsql "EXPLAIN $sql"] OpenTemp]]
372*c5c4113dSnw141292}
373*c5c4113dSnw141292
374*c5c4113dSnw141292# Check that the flattener works correctly for deeply nested subqueries
375*c5c4113dSnw141292# involving joins.
376*c5c4113dSnw141292#
377*c5c4113dSnw141292do_test select6-8.1 {
378*c5c4113dSnw141292  execsql {
379*c5c4113dSnw141292    BEGIN;
380*c5c4113dSnw141292    CREATE TABLE t3(p,q);
381*c5c4113dSnw141292    INSERT INTO t3 VALUES(1,11);
382*c5c4113dSnw141292    INSERT INTO t3 VALUES(2,22);
383*c5c4113dSnw141292    CREATE TABLE t4(q,r);
384*c5c4113dSnw141292    INSERT INTO t4 VALUES(11,111);
385*c5c4113dSnw141292    INSERT INTO t4 VALUES(22,222);
386*c5c4113dSnw141292    COMMIT;
387*c5c4113dSnw141292    SELECT * FROM t3 NATURAL JOIN t4;
388*c5c4113dSnw141292  }
389*c5c4113dSnw141292} {1 11 111 2 22 222}
390*c5c4113dSnw141292do_test select6-8.2 {
391*c5c4113dSnw141292  execsql {
392*c5c4113dSnw141292    SELECT y, p, q, r FROM
393*c5c4113dSnw141292       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
394*c5c4113dSnw141292       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
395*c5c4113dSnw141292    WHERE  y=p
396*c5c4113dSnw141292  }
397*c5c4113dSnw141292} {1 1 11 111 2 2 22 222 2 2 22 222}
398*c5c4113dSnw141292do_test select6-8.3 {
399*c5c4113dSnw141292  is_flat {
400*c5c4113dSnw141292    SELECT y, p, q, r FROM
401*c5c4113dSnw141292       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
402*c5c4113dSnw141292       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
403*c5c4113dSnw141292    WHERE  y=p
404*c5c4113dSnw141292  }
405*c5c4113dSnw141292} {1}
406*c5c4113dSnw141292do_test select6-8.4 {
407*c5c4113dSnw141292  execsql {
408*c5c4113dSnw141292    SELECT DISTINCT y, p, q, r FROM
409*c5c4113dSnw141292       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
410*c5c4113dSnw141292       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
411*c5c4113dSnw141292    WHERE  y=p
412*c5c4113dSnw141292  }
413*c5c4113dSnw141292} {1 1 11 111 2 2 22 222}
414*c5c4113dSnw141292do_test select6-8.5 {
415*c5c4113dSnw141292  execsql {
416*c5c4113dSnw141292    SELECT * FROM
417*c5c4113dSnw141292      (SELECT y, p, q, r FROM
418*c5c4113dSnw141292         (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
419*c5c4113dSnw141292         (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
420*c5c4113dSnw141292      WHERE  y=p) AS e,
421*c5c4113dSnw141292      (SELECT r AS z FROM t4 WHERE q=11) AS f
422*c5c4113dSnw141292    WHERE e.r=f.z
423*c5c4113dSnw141292  }
424*c5c4113dSnw141292} {1 1 11 111 111}
425*c5c4113dSnw141292do_test select6-8.6 {
426*c5c4113dSnw141292  is_flat {
427*c5c4113dSnw141292    SELECT * FROM
428*c5c4113dSnw141292      (SELECT y, p, q, r FROM
429*c5c4113dSnw141292         (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
430*c5c4113dSnw141292         (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
431*c5c4113dSnw141292      WHERE  y=p) AS e,
432*c5c4113dSnw141292      (SELECT r AS z FROM t4 WHERE q=11) AS f
433*c5c4113dSnw141292    WHERE e.r=f.z
434*c5c4113dSnw141292  }
435*c5c4113dSnw141292} {1}
436*c5c4113dSnw141292
437*c5c4113dSnw141292
438*c5c4113dSnw141292finish_test
439