github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/overlay/exists2.test (about) 1 # 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 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 set testprefix exists2 19 20 do_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 37 proc do_execsql_eqp_test {tn sql eqp res} { 38 # cf.: https://sqlite.org/forum/info/a9f6bb5c78248929 39 # uplevel [list do_eqp_test $tn.1 $sql [string trim $eqp]] 40 uplevel [list do_execsql_test $tn.2 $sql $res] 41 } 42 43 do_execsql_eqp_test 1.1 { 44 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t1.a=t2.c); 45 } { 46 USING INTEGER PRIMARY KEY 47 } { 48 1 one 3 three 5 five 7 seven 49 } 50 51 do_execsql_eqp_test 1.2 { 52 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c=t1.a); 53 } { 54 SEARCH TABLE t1 USING INTEGER PRIMARY KEY 55 } { 56 1 one 3 three 5 five 7 seven 57 } 58 59 do_execsql_eqp_test 1.3 { 60 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a); 61 } { 62 SEARCH TABLE t1 USING INTEGER PRIMARY KEY 63 } { 64 2 two 4 four 6 six 65 } 66 67 do_execsql_eqp_test 1.4 { 68 SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a+1); 69 } { 70 SCAN TABLE t1 71 } { 72 1 one 3 three 5 five 7 seven 73 } 74 75 do_execsql_eqp_test 1.5 { 76 SELECT t1.* FROM t1 WHERE EXISTS( 77 SELECT * FROM t2 WHERE t1.a=t2.c AND d IN (1, 2, 3) 78 ); 79 } { 80 SEARCH TABLE t1 USING INTEGER PRIMARY KEY 81 } { 82 1 one 3 three 5 five 83 } 84 85 do_execsql_eqp_test 1.6 { 86 SELECT t1.* FROM t1 WHERE EXISTS( 87 SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c 88 ); 89 } { 90 SEARCH TABLE t1 USING INTEGER PRIMARY KEY 91 } { 92 1 one 3 three 5 five 93 } 94 95 do_execsql_eqp_test 1.7 { 96 SELECT t1.* FROM t1 WHERE EXISTS( 97 SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c 98 ); 99 } { 100 SEARCH TABLE t1 USING INTEGER PRIMARY KEY 101 } { 102 1 one 3 three 5 five 103 } 104 105 #------------------------------------------------------------------------- 106 # 107 reset_db 108 do_execsql_test 2.0 { 109 CREATE TABLE t3(a TEXT PRIMARY KEY, b TEXT, x INT) WITHOUT ROWID; 110 CREATE TABLE t4(c TEXT COLLATE nocase, y INT); 111 112 INSERT INTO t3 VALUES('one', 'i', 1); 113 INSERT INTO t3 VALUES('two', 'ii', 2); 114 INSERT INTO t3 VALUES('three', 'iii', 3); 115 INSERT INTO t3 VALUES('four', 'iv', 4); 116 INSERT INTO t3 VALUES('five', 'v', 5); 117 118 INSERT INTO t4 VALUES('FIVE',5), ('four',4), ('TWO',2), ('one',1); 119 } 120 121 do_execsql_test 2.1 { SELECT a FROM t3, t4 WHERE a=c } {four one} 122 do_execsql_test 2.2 { SELECT a FROM t3, t4 WHERE c=a } {five four one two} 123 124 do_execsql_eqp_test 2.3 { 125 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c) 126 } { 127 SEARCH TABLE t3 USING PRIMARY KEY 128 } { 129 four one 130 } 131 132 do_execsql_eqp_test 2.4 { 133 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a) 134 } { 135 SCAN TABLE t3 136 } { 137 five four one two 138 } 139 140 do_execsql_test 2.5 { 141 CREATE INDEX t3anc ON t3(a COLLATE nocase, x); 142 } 143 144 do_execsql_eqp_test 2.6 { 145 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a) 146 } { 147 SEARCH TABLE t3 USING COVERING INDEX t3anc 148 } { 149 five four one two 150 } 151 do_execsql_test 2.6a { 152 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (c,y)=(a,x)) 153 } {five four one two} 154 155 do_execsql_eqp_test 2.7 { 156 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c) 157 } { 158 SEARCH TABLE t3 USING PRIMARY KEY 159 } { 160 four one 161 } 162 do_execsql_test 2.7a { 163 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (a,x)=(c,y)) 164 } { 165 four one 166 } 167 168 do_execsql_test 2.7b { 169 SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (a,x)=(c,y) LIMIT 1) 170 } { 171 four one 172 } 173 174 # EXISTS clauses using vector expressions in the WHERE clause. 175 # 176 reset_db 177 do_execsql_test 3.0 { 178 CREATE TABLE t1(a,b); 179 INSERT INTO t1(a,b) VALUES(1,111),(2,222),(8,888); 180 CREATE TABLE t2(x INTEGER PRIMARY KEY, y); 181 INSERT INTO t2(x,y) VALUES(2,222),(3,333),(7,333); 182 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,y)=(a,b)); 183 } {222} 184 do_execsql_test 3.1 { 185 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (a,b)=(x,y)); 186 } {222} 187 do_execsql_test 3.2 { 188 SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,b)=(a,y)); 189 } {222} 190 191 192 193 194 195 finish_test