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