xref: /sqlite-3.40.0/test/subquery2.test (revision 855b5d14)
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