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