1a464c234Sdrh# 2011 September 16 2a464c234Sdrh# 3a464c234Sdrh# The author disclaims copyright to this source code. In place of 4a464c234Sdrh# a legal notice, here is a blessing: 5a464c234Sdrh# 6a464c234Sdrh# May you do good and not evil. 7a464c234Sdrh# May you find forgiveness for yourself and forgive others. 8a464c234Sdrh# May you share freely, never taking more than you give. 9a464c234Sdrh# 10a464c234Sdrh#************************************************************************* 11a464c234Sdrh# This file implements regression tests for SQLite library. The 12a464c234Sdrh# focus of this script is testing correlated subqueries 13a464c234Sdrh# 14a464c234Sdrh# 15a464c234Sdrh 16a464c234Sdrhset testdir [file dirname $argv0] 17a464c234Sdrhsource $testdir/tester.tcl 184b2f3589Sdanset ::testprefix subquery2 19a464c234Sdrh 20a464c234Sdrhifcapable !subquery { 21a464c234Sdrh finish_test 22a464c234Sdrh return 23a464c234Sdrh} 24a464c234Sdrh 25a464c234Sdrhdo_test subquery2-1.1 { 26a464c234Sdrh execsql { 27a464c234Sdrh BEGIN; 28a464c234Sdrh CREATE TABLE t1(a,b); 29a464c234Sdrh INSERT INTO t1 VALUES(1,2); 30a464c234Sdrh INSERT INTO t1 VALUES(3,4); 31a464c234Sdrh INSERT INTO t1 VALUES(5,6); 32a464c234Sdrh INSERT INTO t1 VALUES(7,8); 33a464c234Sdrh CREATE TABLE t2(c,d); 34a464c234Sdrh INSERT INTO t2 VALUES(1,1); 35a464c234Sdrh INSERT INTO t2 VALUES(3,9); 36a464c234Sdrh INSERT INTO t2 VALUES(5,25); 37a464c234Sdrh INSERT INTO t2 VALUES(7,49); 38a464c234Sdrh CREATE TABLE t3(e,f); 39a464c234Sdrh INSERT INTO t3 VALUES(1,1); 40a464c234Sdrh INSERT INTO t3 VALUES(3,27); 41a464c234Sdrh INSERT INTO t3 VALUES(5,125); 42a464c234Sdrh INSERT INTO t3 VALUES(7,343); 43a464c234Sdrh COMMIT; 44a464c234Sdrh } 45a464c234Sdrh execsql { 46a464c234Sdrh SELECT a FROM t1 47a464c234Sdrh WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); 48a464c234Sdrh } 49a464c234Sdrh} {1 3 5 7} 50a464c234Sdrhdo_test subquery2-1.2 { 51a464c234Sdrh execsql { 52a464c234Sdrh CREATE INDEX t1b ON t1(b); 53a464c234Sdrh SELECT a FROM t1 54a464c234Sdrh WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); 55a464c234Sdrh } 56a464c234Sdrh} {1 3 5 7} 57a464c234Sdrh 58a464c234Sdrhdo_test subquery2-1.11 { 59a464c234Sdrh execsql { 60a464c234Sdrh SELECT a FROM t1 61a464c234Sdrh WHERE +b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); 62a464c234Sdrh } 63a464c234Sdrh} {1} 64a464c234Sdrhdo_test subquery2-1.12 { 65a464c234Sdrh execsql { 66a464c234Sdrh SELECT a FROM t1 67a464c234Sdrh WHERE b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); 68a464c234Sdrh } 69a464c234Sdrh} {1} 70a464c234Sdrh 71a464c234Sdrhdo_test subquery2-1.21 { 72a464c234Sdrh execsql { 73a464c234Sdrh SELECT a FROM t1 74a464c234Sdrh WHERE +b=(SELECT x+1 FROM 75a464c234Sdrh (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f)) 76a464c234Sdrh } 77a464c234Sdrh} {1 3 5 7} 78a464c234Sdrhdo_test subquery2-1.22 { 79a464c234Sdrh execsql { 80a464c234Sdrh SELECT a FROM t1 81a464c234Sdrh WHERE b=(SELECT x+1 FROM 82a464c234Sdrh (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f)) 83a464c234Sdrh } 84a464c234Sdrh} {1 3 5 7} 85a464c234Sdrh 864b2f3589Sdan#------------------------------------------------------------------------- 874b2f3589Sdan# Test that ticket d6b36be38a has been fixed. 884b2f3589Sdando_execsql_test 2.1 { 894b2f3589Sdan CREATE TABLE t4(a, b); 904b2f3589Sdan CREATE TABLE t5(a, b); 914b2f3589Sdan INSERT INTO t5 VALUES(3, 5); 924b2f3589Sdan 934b2f3589Sdan INSERT INTO t4 VALUES(1, 1); 944b2f3589Sdan INSERT INTO t4 VALUES(2, 3); 954b2f3589Sdan INSERT INTO t4 VALUES(3, 6); 964b2f3589Sdan INSERT INTO t4 VALUES(4, 10); 974b2f3589Sdan INSERT INTO t4 VALUES(5, 15); 984b2f3589Sdan} 994b2f3589Sdan 1004b2f3589Sdando_execsql_test 2.2 { 1014b2f3589Sdan SELECT * 1024b2f3589Sdan FROM (SELECT * FROM t4 ORDER BY a LIMIT -1 OFFSET 1) 1034b2f3589Sdan LIMIT (SELECT a FROM t5) 1044b2f3589Sdan} {2 3 3 6 4 10} 1054b2f3589Sdan 106d7643037Sdrh############################################################################ 107d7643037Sdrh# Ticket http://www.sqlite.org/src/info/d11a6e908f (2014-09-20) 108d7643037Sdrh# Query planner fault on three-way nested join with compound inner SELECT 109d7643037Sdrh# 110d7643037Sdrhdo_execsql_test 3.0 { 111d7643037Sdrh DROP TABLE IF EXISTS t1; 112d7643037Sdrh DROP TABLE IF EXISTS t2; 113d7643037Sdrh CREATE TABLE t1 (id INTEGER PRIMARY KEY, data TEXT); 114d7643037Sdrh INSERT INTO t1(id,data) VALUES(9,'nine-a'); 115d7643037Sdrh INSERT INTO t1(id,data) VALUES(10,'ten-a'); 116d7643037Sdrh INSERT INTO t1(id,data) VALUES(11,'eleven-a'); 117d7643037Sdrh CREATE TABLE t2 (id INTEGER PRIMARY KEY, data TEXT); 118d7643037Sdrh INSERT INTO t2(id,data) VALUES(9,'nine-b'); 119d7643037Sdrh INSERT INTO t2(id,data) VALUES(10,'ten-b'); 120d7643037Sdrh INSERT INTO t2(id,data) VALUES(11,'eleven-b'); 121d7643037Sdrh 122d7643037Sdrh SELECT id FROM ( 123d7643037Sdrh SELECT id,data FROM ( 124d7643037Sdrh SELECT * FROM t1 UNION ALL SELECT * FROM t2 125d7643037Sdrh ) 126d7643037Sdrh WHERE id=10 ORDER BY data 127d7643037Sdrh ); 128d7643037Sdrh} {10 10} 129d7643037Sdrhdo_execsql_test 3.1 { 130d7643037Sdrh SELECT data FROM ( 131d7643037Sdrh SELECT 'dummy', data FROM ( 132d7643037Sdrh SELECT data FROM t1 UNION ALL SELECT data FROM t1 133d7643037Sdrh ) ORDER BY data 134d7643037Sdrh ); 135d7643037Sdrh} {eleven-a eleven-a nine-a nine-a ten-a ten-a} 136d7643037Sdrhdo_execsql_test 3.2 { 137d7643037Sdrh DROP TABLE IF EXISTS t3; 138d7643037Sdrh DROP TABLE IF EXISTS t4; 139d7643037Sdrh CREATE TABLE t3(id INTEGER, data TEXT); 140d7643037Sdrh CREATE TABLE t4(id INTEGER, data TEXT); 141d7643037Sdrh INSERT INTO t3 VALUES(4, 'a'),(2,'c'); 142d7643037Sdrh INSERT INTO t4 VALUES(3, 'b'),(1,'d'); 143d7643037Sdrh 144d7643037Sdrh SELECT data, id FROM ( 145d7643037Sdrh SELECT id, data FROM ( 146d7643037Sdrh SELECT * FROM t3 UNION ALL SELECT * FROM t4 147d7643037Sdrh ) ORDER BY data 148d7643037Sdrh ); 149d7643037Sdrh} {a 4 b 3 c 2 d 1} 150d7643037Sdrh 1514f9a7e5cSdan#------------------------------------------------------------------------- 1524f9a7e5cSdan 1534f9a7e5cSdando_execsql_test 4.0 { 1544f9a7e5cSdan CREATE TABLE t6(x); 1554f9a7e5cSdan} 1564f9a7e5cSdan 1574f9a7e5cSdanforeach {tn sql} { 1584f9a7e5cSdan 1 { 1594f9a7e5cSdan SELECT 'abc' FROM ( 1604f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1614f9a7e5cSdan UNION ALL 1624f9a7e5cSdan SELECT x FROM t6 1634f9a7e5cSdan ) 1644f9a7e5cSdan } 1654f9a7e5cSdan 2 { 1664f9a7e5cSdan SELECT 'abc' FROM ( 1674f9a7e5cSdan SELECT x FROM t6 1684f9a7e5cSdan UNION ALL 1694f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1704f9a7e5cSdan UNION ALL 1714f9a7e5cSdan SELECT x FROM t6 1724f9a7e5cSdan ) 1734f9a7e5cSdan } 1744f9a7e5cSdan 3 { 1754f9a7e5cSdan SELECT 'abc' FROM ( 1764f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1774f9a7e5cSdan UNION ALL 1784f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1794f9a7e5cSdan UNION ALL 1804f9a7e5cSdan SELECT x FROM t6 1814f9a7e5cSdan ) 1824f9a7e5cSdan } 1834f9a7e5cSdan 4 { 1844f9a7e5cSdan SELECT 'abc' FROM ( 1854f9a7e5cSdan SELECT x FROM t6 1864f9a7e5cSdan UNION ALL 1874f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1884f9a7e5cSdan UNION ALL 1894f9a7e5cSdan SELECT x FROM t6 ORDER BY 1 1904f9a7e5cSdan UNION ALL 1914f9a7e5cSdan SELECT x FROM t6 1924f9a7e5cSdan ) 1934f9a7e5cSdan } 1944f9a7e5cSdan} { 1954f9a7e5cSdan do_catchsql_test 4.$tn $sql [list {*}{ 1964f9a7e5cSdan 1 {ORDER BY clause should come after UNION ALL not before} 1974f9a7e5cSdan }] 1984f9a7e5cSdan} 1994f9a7e5cSdan 200*855b5d14Sdan#------------------------------------------------------------------------- 201*855b5d14Sdan# Test that ticket [9cdc5c46] is fixed. 202*855b5d14Sdan# 203*855b5d14Sdanreset_db 204*855b5d14Sdando_execsql_test 5.0 { 205*855b5d14Sdan CREATE TABLE t1(x); 206*855b5d14Sdan INSERT INTO t1 VALUES('ALFKI'); 207*855b5d14Sdan INSERT INTO t1 VALUES('ANATR'); 208*855b5d14Sdan 209*855b5d14Sdan CREATE TABLE t2(y, z); 210*855b5d14Sdan CREATE INDEX t2y ON t2 (y); 211*855b5d14Sdan INSERT INTO t2 VALUES('ANATR', '1997-08-08 00:00:00'); 212*855b5d14Sdan INSERT INTO t2 VALUES('ALFKI', '1997-08-25 00:00:00'); 213*855b5d14Sdan} 214*855b5d14Sdando_execsql_test 5.1 { 215*855b5d14Sdan SELECT ( SELECT y FROM t2 WHERE x = y ORDER BY y, z) FROM t1; 216*855b5d14Sdan} {ALFKI ANATR} 217a464c234Sdrh 218a464c234Sdrhfinish_test 219