AryaWu/sqlite
0
1# 2011 September 162#3# The author disclaims copyright to this source code. In place of4# 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. The12# focus of this script is testing correlated subqueries13#14#15 16set testdir [file dirname $argv0]17source $testdir/tester.tcl18set ::testprefix subquery219 20ifcapable !subquery {21 finish_test22 return23}24 25do_test subquery2-1.1 {26 execsql {27 BEGIN;28 CREATE TABLE t1(a,b);29 INSERT INTO t1 VALUES(1,2);30 INSERT INTO t1 VALUES(3,4);31 INSERT INTO t1 VALUES(5,6);32 INSERT INTO t1 VALUES(7,8);33 CREATE TABLE t2(c,d);34 INSERT INTO t2 VALUES(1,1);35 INSERT INTO t2 VALUES(3,9);36 INSERT INTO t2 VALUES(5,25);37 INSERT INTO t2 VALUES(7,49);38 CREATE TABLE t3(e,f);39 INSERT INTO t3 VALUES(1,1);40 INSERT INTO t3 VALUES(3,27);41 INSERT INTO t3 VALUES(5,125);42 INSERT INTO t3 VALUES(7,343);43 COMMIT;44 }45 execsql {46 SELECT a FROM t147 WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3));48 }49} {1 3 5 7}50do_test subquery2-1.2 {51 execsql {52 CREATE INDEX t1b ON t1(b);53 SELECT a FROM t154 WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3));55 }56} {1 3 5 7}57 58do_test subquery2-1.11 {59 execsql {60 SELECT a FROM t161 WHERE +b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3));62 }63} {1}64do_test subquery2-1.12 {65 execsql {66 SELECT a FROM t167 WHERE b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3));68 }69} {1}70 71do_test subquery2-1.21 {72 execsql {73 SELECT a FROM t174 WHERE +b=(SELECT x+1 FROM 75 (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f))76 }77} {1 3 5 7}78do_test subquery2-1.22 {79 execsql {80 SELECT a FROM t181 WHERE b=(SELECT x+1 FROM 82 (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f))83 }84} {1 3 5 7}85 86#-------------------------------------------------------------------------87# Test that ticket d6b36be38a has been fixed.88do_execsql_test 2.1 {89 CREATE TABLE t4(a, b);90 CREATE TABLE t5(a, b);91 INSERT INTO t5 VALUES(3, 5);92 93 INSERT INTO t4 VALUES(1, 1);94 INSERT INTO t4 VALUES(2, 3);95 INSERT INTO t4 VALUES(3, 6);96 INSERT INTO t4 VALUES(4, 10);97 INSERT INTO t4 VALUES(5, 15);98}99 100do_execsql_test 2.2 {101 SELECT * 102 FROM (SELECT * FROM t4 ORDER BY a LIMIT -1 OFFSET 1) 103 LIMIT (SELECT a FROM t5)104} {2 3 3 6 4 10}105 106############################################################################107# Ticket http://sqlite.org/src/info/d11a6e908f (2014-09-20)108# Query planner fault on three-way nested join with compound inner SELECT 109#110do_execsql_test 3.0 {111 DROP TABLE IF EXISTS t1;112 DROP TABLE IF EXISTS t2;113 CREATE TABLE t1 (id INTEGER PRIMARY KEY, data TEXT);114 INSERT INTO t1(id,data) VALUES(9,'nine-a');115 INSERT INTO t1(id,data) VALUES(10,'ten-a');116 INSERT INTO t1(id,data) VALUES(11,'eleven-a');117 CREATE TABLE t2 (id INTEGER PRIMARY KEY, data TEXT);118 INSERT INTO t2(id,data) VALUES(9,'nine-b');119 INSERT INTO t2(id,data) VALUES(10,'ten-b');120 INSERT INTO t2(id,data) VALUES(11,'eleven-b');121 122 SELECT id FROM (123 SELECT id,data FROM (124 SELECT * FROM t1 UNION ALL SELECT * FROM t2125 )126 WHERE id=10 ORDER BY data127 );128} {10 10}129do_execsql_test 3.1 {130 SELECT data FROM (131 SELECT 'dummy', data FROM (132 SELECT data FROM t1 UNION ALL SELECT data FROM t1133 ) ORDER BY data134 );135} {eleven-a eleven-a nine-a nine-a ten-a ten-a}136do_execsql_test 3.2 {137 DROP TABLE IF EXISTS t3;138 DROP TABLE IF EXISTS t4;139 CREATE TABLE t3(id INTEGER, data TEXT);140 CREATE TABLE t4(id INTEGER, data TEXT);141 INSERT INTO t3 VALUES(4, 'a'),(2,'c');142 INSERT INTO t4 VALUES(3, 'b'),(1,'d');143 144 SELECT data, id FROM (145 SELECT id, data FROM (146 SELECT * FROM t3 UNION ALL SELECT * FROM t4147 ) ORDER BY data148 );149} {a 4 b 3 c 2 d 1}150 151#-------------------------------------------------------------------------152 153do_execsql_test 4.0 {154 CREATE TABLE t6(x);155}156 157foreach {tn sql} {158 1 {159 SELECT 'abc' FROM (160 SELECT x FROM t6 ORDER BY 1161 UNION ALL162 SELECT x FROM t6163 )164 }165 2 {166 SELECT 'abc' FROM (167 SELECT x FROM t6168 UNION ALL169 SELECT x FROM t6 ORDER BY 1170 UNION ALL171 SELECT x FROM t6172 )173 }174 3 {175 SELECT 'abc' FROM (176 SELECT x FROM t6 ORDER BY 1177 UNION ALL178 SELECT x FROM t6 ORDER BY 1179 UNION ALL180 SELECT x FROM t6181 )182 }183 4 {184 SELECT 'abc' FROM (185 SELECT x FROM t6186 UNION ALL187 SELECT x FROM t6 ORDER BY 1188 UNION ALL189 SELECT x FROM t6 ORDER BY 1190 UNION ALL191 SELECT x FROM t6192 )193 }194} {195 do_catchsql_test 4.$tn $sql [list {*}{196 1 {ORDER BY clause should come after UNION ALL not before}197 }]198}199 200#-------------------------------------------------------------------------201# Test that ticket [9cdc5c46] is fixed.202#203reset_db204do_execsql_test 5.0 {205 CREATE TABLE t1(x);206 INSERT INTO t1 VALUES('ALFKI');207 INSERT INTO t1 VALUES('ANATR');208 209 CREATE TABLE t2(y, z);210 CREATE INDEX t2y ON t2 (y);211 INSERT INTO t2 VALUES('ANATR', '1997-08-08 00:00:00');212 INSERT INTO t2 VALUES('ALFKI', '1997-08-25 00:00:00');213}214do_execsql_test 5.1 {215 SELECT ( SELECT y FROM t2 WHERE x = y ORDER BY y, z) FROM t1;216} {ALFKI ANATR}217 218#-------------------------------------------------------------------------219reset_db220do_execsql_test 6.0 {221 CREATE TABLE t1(x);222 INSERT INTO t1 VALUES(1234);223}224 225do_execsql_test 6.1 {226 SELECT DISTINCT 'string' FROM t1 LIMIT 1 OFFSET 5;227}228 229do_execsql_test 6.2 {230 SELECT (231 SELECT 'string' FROM t1 LIMIT 1 OFFSET 5232 );233} {{}}234 235do_execsql_test 6.3 {236 SELECT (237 SELECT DISTINCT 'string' FROM t1 LIMIT 1 OFFSET 5238 );239} {{}}240 241do_execsql_test 6.4 {242 SELECT (243 SELECT DISTINCT 'string' FROM t1 ORDER BY 1 LIMIT 1 OFFSET 5244 );245} {{}}246 247do_execsql_test 6.5 {248 SELECT (249 SELECT 'string' FROM t1 ORDER BY 1 LIMIT 1 OFFSET 5250 );251} {{}}252 253do_execsql_test 6.6 {254 SELECT (SELECT DISTINCT x, x FROM t1 LIMIT 1 OFFSET 5)==(1234, 1234)255} {{}}256 257#-------------------------------------------------------------------------258reset_db259do_execsql_test 7.0 {260 CREATE TABLE t1(x);261 CREATE INDEX i1 ON t1(x);262 INSERT INTO t1 VALUES(1234);263}264 265do_execsql_test 7.1 {266 SELECT (267 SELECT DISTINCT 'string' FROM t1 ORDER BY x LIMIT 1 OFFSET 5268 );269} {{}}270 271do_execsql_test 7.2 {272 DROP INDEX i1;273 CREATE UNIQUE INDEX i1 ON t1(x);274}275 276do_execsql_test 7.3 {277 SELECT (278 SELECT DISTINCT x FROM t1 ORDER BY 1 LIMIT 1 OFFSET 5279 );280} {{}}281 282do_execsql_test 7.4 {283 SELECT (SELECT DISTINCT x FROM t1 ORDER BY +x LIMIT 1 OFFSET 0);284} {1234}285 286finish_test287 