blob: c4fc9dc373f2c6d7a6447eb1b3376af931ad71f9 [file] [log] [blame]
dan76cac6e2021-01-15 11:39:46 +00001# 2021 January 15
2#
3# The author disclaims copyright to this source code. In place of
4# 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. The
12# focus of this file is testing cases where EXISTS expressions are
13# transformed to IN() expressions by where.c
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18set testprefix exists2
19
20do_execsql_test 1.0 {
21 CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
22 INSERT INTO t1 VALUES(1, 'one');
23 INSERT INTO t1 VALUES(2, 'two');
24 INSERT INTO t1 VALUES(3, 'three');
25 INSERT INTO t1 VALUES(4, 'four');
26 INSERT INTO t1 VALUES(5, 'five');
27 INSERT INTO t1 VALUES(6, 'six');
28 INSERT INTO t1 VALUES(7, 'seven');
29
30 CREATE TABLE t2(c INTEGER, d INTEGER);
31 INSERT INTO t2 VALUES(1, 1);
32 INSERT INTO t2 VALUES(3, 2);
33 INSERT INTO t2 VALUES(5, 3);
34 INSERT INTO t2 VALUES(7, 4);
35}
36
37proc do_execsql_eqp_test {tn sql eqp res} {
38 uplevel [list do_eqp_test $tn.1 $sql [string trim $eqp]]
39 uplevel [list do_execsql_test $tn.2 $sql $res]
40}
41
42do_execsql_eqp_test 1.1 {
43 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t1.a=t2.c);
44} {
45 USING INTEGER PRIMARY KEY
46} {
47 1 one 3 three 5 five 7 seven
48}
49
50do_execsql_eqp_test 1.2 {
51 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c=t1.a);
52} {
53 SEARCH TABLE t1 USING INTEGER PRIMARY KEY
54} {
55 1 one 3 three 5 five 7 seven
56}
57
58do_execsql_eqp_test 1.3 {
59 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a);
60} {
61 SEARCH TABLE t1 USING INTEGER PRIMARY KEY
62} {
63 2 two 4 four 6 six
64}
65
66do_execsql_eqp_test 1.4 {
67 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a+1);
68} {
69 SCAN TABLE t1
70} {
71 1 one 3 three 5 five 7 seven
72}
73
dan76cac6e2021-01-15 11:39:46 +000074do_execsql_eqp_test 1.5 {
75 SELECT t1.* FROM t1 WHERE EXISTS(
76 SELECT * FROM t2 WHERE t1.a=t2.c AND d IN (1, 2, 3)
77 );
78} {
79 SEARCH TABLE t1 USING INTEGER PRIMARY KEY
80} {
81 1 one 3 three 5 five
82}
83
dane8f7fcf2021-01-15 15:32:09 +000084do_execsql_eqp_test 1.6 {
85 SELECT t1.* FROM t1 WHERE EXISTS(
86 SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c
87 );
88} {
89 SEARCH TABLE t1 USING INTEGER PRIMARY KEY
90} {
91 1 one 3 three 5 five
92}
93
94do_execsql_eqp_test 1.7 {
95 SELECT t1.* FROM t1 WHERE EXISTS(
96 SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c
97 );
98} {
99 SEARCH TABLE t1 USING INTEGER PRIMARY KEY
100} {
101 1 one 3 three 5 five
102}
103
104#-------------------------------------------------------------------------
105#
106reset_db
107do_execsql_test 2.0 {
drh9ffa2582021-01-16 20:22:11 +0000108 CREATE TABLE t3(a TEXT PRIMARY KEY, b TEXT, x INT) WITHOUT ROWID;
109 CREATE TABLE t4(c TEXT COLLATE nocase, y INT);
dane8f7fcf2021-01-15 15:32:09 +0000110
drh9ffa2582021-01-16 20:22:11 +0000111 INSERT INTO t3 VALUES('one', 'i', 1);
112 INSERT INTO t3 VALUES('two', 'ii', 2);
113 INSERT INTO t3 VALUES('three', 'iii', 3);
114 INSERT INTO t3 VALUES('four', 'iv', 4);
115 INSERT INTO t3 VALUES('five', 'v', 5);
dane8f7fcf2021-01-15 15:32:09 +0000116
drh9ffa2582021-01-16 20:22:11 +0000117 INSERT INTO t4 VALUES('FIVE',5), ('four',4), ('TWO',2), ('one',1);
dane8f7fcf2021-01-15 15:32:09 +0000118}
119
120do_execsql_test 2.1 { SELECT a FROM t3, t4 WHERE a=c } {four one}
121do_execsql_test 2.2 { SELECT a FROM t3, t4 WHERE c=a } {five four one two}
122
123do_execsql_eqp_test 2.3 {
124 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c)
125} {
126 SEARCH TABLE t3 USING PRIMARY KEY
127} {
128 four one
129}
130
131do_execsql_eqp_test 2.4 {
132 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a)
133} {
134 SCAN TABLE t3
135} {
136 five four one two
137}
138
139do_execsql_test 2.5 {
drh9ffa2582021-01-16 20:22:11 +0000140 CREATE INDEX t3anc ON t3(a COLLATE nocase, x);
dane8f7fcf2021-01-15 15:32:09 +0000141}
142
143do_execsql_eqp_test 2.6 {
144 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a)
145} {
146 SEARCH TABLE t3 USING COVERING INDEX t3anc
147} {
148 five four one two
149}
drh9ffa2582021-01-16 20:22:11 +0000150do_execsql_test 2.6a {
151 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (c,y)=(a,x))
152} {five four one two}
dane8f7fcf2021-01-15 15:32:09 +0000153
154do_execsql_eqp_test 2.7 {
155 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c)
156} {
157 SEARCH TABLE t3 USING PRIMARY KEY
158} {
159 four one
160}
drh9ffa2582021-01-16 20:22:11 +0000161do_execsql_test 2.7a {
162 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (a,x)=(c,y))
163} {
164 four one
165}
dane8f7fcf2021-01-15 15:32:09 +0000166
drh4be8bdc2021-01-16 18:55:10 +0000167# EXISTS clauses using vector expressions in the WHERE clause.
168#
169reset_db
170do_execsql_test 3.0 {
171 CREATE TABLE t1(a,b);
172 INSERT INTO t1(a,b) VALUES(1,111),(2,222),(8,888);
173 CREATE TABLE t2(x INTEGER PRIMARY KEY, y);
174 INSERT INTO t2(x,y) VALUES(2,222),(3,333),(7,333);
175 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,y)=(a,b));
176} {222}
177do_execsql_test 3.1 {
178 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (a,b)=(x,y));
179} {222}
180do_execsql_test 3.2 {
181 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,b)=(a,y));
182} {222}
183
184
dane8f7fcf2021-01-15 15:32:09 +0000185
dan76cac6e2021-01-15 11:39:46 +0000186
187
188finish_test