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