modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/whereG.test (about) 1 # 2013-09-05 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 # 12 # Test cases for query planning decisions and the likely(), unlikely(), and 13 # likelihood() functions. 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 set testprefix whereG 18 19 do_execsql_test whereG-1.0 { 20 CREATE TABLE composer( 21 cid INTEGER PRIMARY KEY, 22 cname TEXT 23 ); 24 CREATE TABLE album( 25 aid INTEGER PRIMARY KEY, 26 aname TEXT 27 ); 28 CREATE TABLE track( 29 tid INTEGER PRIMARY KEY, 30 cid INTEGER REFERENCES composer, 31 aid INTEGER REFERENCES album, 32 title TEXT 33 ); 34 CREATE INDEX track_i1 ON track(cid); 35 CREATE INDEX track_i2 ON track(aid); 36 INSERT INTO composer VALUES(1, 'W. A. Mozart'); 37 INSERT INTO composer VALUES(2, 'Beethoven'); 38 INSERT INTO composer VALUES(3, 'Thomas Tallis'); 39 INSERT INTO composer VALUES(4, 'Joseph Hayden'); 40 INSERT INTO composer VALUES(5, 'Thomas Weelkes'); 41 INSERT INTO composer VALUES(6, 'J. S. Bach'); 42 INSERT INTO composer VALUES(7, 'Orlando Gibbons'); 43 INSERT INTO composer VALUES(8, 'Josquin des Prés'); 44 INSERT INTO composer VALUES(9, 'Byrd'); 45 INSERT INTO composer VALUES(10, 'Francis Poulenc'); 46 INSERT INTO composer VALUES(11, 'Mendelsshon'); 47 INSERT INTO composer VALUES(12, 'Zoltán Kodály'); 48 INSERT INTO composer VALUES(13, 'Handel'); 49 INSERT INTO album VALUES(100, 'Kodály: Missa Brevis'); 50 INSERT INTO album VALUES(101, 'Messiah'); 51 INSERT INTO album VALUES(102, 'Missa Brevis in D-, K.65'); 52 INSERT INTO album VALUES(103, 'The complete English anthems'); 53 INSERT INTO album VALUES(104, 'Mass in B Minor, BWV 232'); 54 INSERT INTO track VALUES(10005, 12, 100, 'Sanctus'); 55 INSERT INTO track VALUES(10007, 12, 100, 'Agnus Dei'); 56 INSERT INTO track VALUES(10115, 13, 101, 'Surely He Hath Borne Our Griefs'); 57 INSERT INTO track VALUES(10129, 13, 101, 'Since By Man Came Death'); 58 INSERT INTO track VALUES(10206, 1, 102, 'Agnus Dei'); 59 INSERT INTO track VALUES(10301, 3, 103, 'If Ye Love Me'); 60 INSERT INTO track VALUES(10402, 6, 104, 'Domine Deus'); 61 INSERT INTO track VALUES(10403, 6, 104, 'Qui tollis'); 62 } {} 63 do_eqp_test whereG-1.1 { 64 SELECT DISTINCT aname 65 FROM album, composer, track 66 WHERE unlikely(cname LIKE '%bach%') 67 AND composer.cid=track.cid 68 AND album.aid=track.aid; 69 } {/.*composer.*track.*album.*/} 70 do_execsql_test whereG-1.2 { 71 SELECT DISTINCT aname 72 FROM album, composer, track 73 WHERE unlikely(cname LIKE '%bach%') 74 AND composer.cid=track.cid 75 AND album.aid=track.aid; 76 } {{Mass in B Minor, BWV 232}} 77 78 do_eqp_test whereG-1.3 { 79 SELECT DISTINCT aname 80 FROM album, composer, track 81 WHERE likelihood(cname LIKE '%bach%', 0.5) 82 AND composer.cid=track.cid 83 AND album.aid=track.aid; 84 } {/.*track.*composer.*album.*/} 85 do_execsql_test whereG-1.4 { 86 SELECT DISTINCT aname 87 FROM album, composer, track 88 WHERE likelihood(cname LIKE '%bach%', 0.5) 89 AND composer.cid=track.cid 90 AND album.aid=track.aid; 91 } {{Mass in B Minor, BWV 232}} 92 93 do_eqp_test whereG-1.5 { 94 SELECT DISTINCT aname 95 FROM album, composer, track 96 WHERE cname LIKE '%bach%' 97 AND composer.cid=track.cid 98 AND album.aid=track.aid; 99 } {/.*track.*(composer.*album|album.*composer).*/} 100 do_execsql_test whereG-1.6 { 101 SELECT DISTINCT aname 102 FROM album, composer, track 103 WHERE cname LIKE '%bach%' 104 AND composer.cid=track.cid 105 AND album.aid=track.aid; 106 } {{Mass in B Minor, BWV 232}} 107 108 do_eqp_test whereG-1.7 { 109 SELECT DISTINCT aname 110 FROM album, composer, track 111 WHERE cname LIKE '%bach%' 112 AND unlikely(composer.cid=track.cid) 113 AND unlikely(album.aid=track.aid); 114 } {/.*track.*(composer.*album|album.*composer).*/} 115 do_execsql_test whereG-1.8 { 116 SELECT DISTINCT aname 117 FROM album, composer, track 118 WHERE cname LIKE '%bach%' 119 AND unlikely(composer.cid=track.cid) 120 AND unlikely(album.aid=track.aid); 121 } {{Mass in B Minor, BWV 232}} 122 123 do_test whereG-2.1 { 124 catchsql { 125 SELECT DISTINCT aname 126 FROM album, composer, track 127 WHERE likelihood(cname LIKE '%bach%', -0.01) 128 AND composer.cid=track.cid 129 AND album.aid=track.aid; 130 } 131 } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 132 do_test whereG-2.2 { 133 catchsql { 134 SELECT DISTINCT aname 135 FROM album, composer, track 136 WHERE likelihood(cname LIKE '%bach%', 1.01) 137 AND composer.cid=track.cid 138 AND album.aid=track.aid; 139 } 140 } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 141 do_test whereG-2.3 { 142 catchsql { 143 SELECT DISTINCT aname 144 FROM album, composer, track 145 WHERE likelihood(cname LIKE '%bach%', track.cid) 146 AND composer.cid=track.cid 147 AND album.aid=track.aid; 148 } 149 } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 150 151 # Commuting a term of the WHERE clause should not change the query plan 152 # 153 do_execsql_test whereG-3.0 { 154 CREATE TABLE a(a1 PRIMARY KEY, a2); 155 CREATE TABLE b(b1 PRIMARY KEY, b2); 156 } {} 157 do_eqp_test whereG-3.1 { 158 SELECT * FROM a, b WHERE b1=a1 AND a2=5; 159 } {/.*SCAN TABLE a.*SEARCH TABLE b USING INDEX .*b_1 .b1=..*/} 160 do_eqp_test whereG-3.2 { 161 SELECT * FROM a, b WHERE a1=b1 AND a2=5; 162 } {/.*SCAN TABLE a.*SEARCH TABLE b USING INDEX .*b_1 .b1=..*/} 163 do_eqp_test whereG-3.3 { 164 SELECT * FROM a, b WHERE a2=5 AND b1=a1; 165 } {/.*SCAN TABLE a.*SEARCH TABLE b USING INDEX .*b_1 .b1=..*/} 166 do_eqp_test whereG-3.4 { 167 SELECT * FROM a, b WHERE a2=5 AND a1=b1; 168 } {/.*SCAN TABLE a.*SEARCH TABLE b USING INDEX .*b_1 .b1=..*/} 169 170 # Ticket [1e64dd782a126f48d78c43a664844a41d0e6334e]: 171 # Incorrect result in a nested GROUP BY/DISTINCT due to the use of an OP_SCopy 172 # where an OP_Copy was needed. 173 # 174 do_execsql_test whereG-4.0 { 175 CREATE TABLE t4(x); 176 INSERT INTO t4 VALUES('right'),('wrong'); 177 SELECT DISTINCT x 178 FROM (SELECT x FROM t4 GROUP BY x) 179 WHERE x='right' 180 ORDER BY x; 181 } {right} 182 183 #------------------------------------------------------------------------- 184 # Test that likelihood() specifications on indexed terms are taken into 185 # account by various forms of loops. 186 # 187 # 5.1.*: open ended range scans 188 # 5.2.*: skip-scans 189 # 190 reset_db 191 192 do_execsql_test 5.1 { 193 CREATE TABLE t1(a, b, c); 194 CREATE INDEX i1 ON t1(a, b); 195 } 196 do_eqp_test 5.1.2 { 197 SELECT * FROM t1 WHERE a>? 198 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a>?)}} 199 do_eqp_test 5.1.3 { 200 SELECT * FROM t1 WHERE likelihood(a>?, 0.9) 201 } {0 0 0 {SCAN TABLE t1}} 202 do_eqp_test 5.1.4 { 203 SELECT * FROM t1 WHERE likely(a>?) 204 } {0 0 0 {SCAN TABLE t1}} 205 206 do_test 5.2 { 207 for {set i 0} {$i < 100} {incr i} { 208 execsql { INSERT INTO t1 VALUES('abc', $i, $i); } 209 } 210 execsql { INSERT INTO t1 SELECT 'def', b, c FROM t1; } 211 execsql { ANALYZE } 212 } {} 213 do_eqp_test 5.2.2 { 214 SELECT * FROM t1 WHERE likelihood(b>?, 0.01) 215 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (ANY(a) AND b>?)}} 216 do_eqp_test 5.2.3 { 217 SELECT * FROM t1 WHERE likelihood(b>?, 0.9) 218 } {0 0 0 {SCAN TABLE t1}} 219 do_eqp_test 5.2.4 { 220 SELECT * FROM t1 WHERE likely(b>?) 221 } {0 0 0 {SCAN TABLE t1}} 222 223 do_eqp_test 5.3.1 { 224 SELECT * FROM t1 WHERE a=? 225 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?)}} 226 do_eqp_test 5.3.2 { 227 SELECT * FROM t1 WHERE likelihood(a=?, 0.9) 228 } {0 0 0 {SCAN TABLE t1}} 229 do_eqp_test 5.3.3 { 230 SELECT * FROM t1 WHERE likely(a=?) 231 } {0 0 0 {SCAN TABLE t1}} 232 233 # 2015-06-18 234 # Ticket [https://www.sqlite.org/see/tktview/472f0742a1868fb58862bc588ed70] 235 # 236 do_execsql_test 6.0 { 237 DROP TABLE IF EXISTS t1; 238 CREATE TABLE t1(i int, x, y, z); 239 INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4); 240 DROP TABLE IF EXISTS t2; 241 CREATE TABLE t2(i int, bool char); 242 INSERT INTO t2 VALUES(1,'T'), (2,'F'); 243 SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.i=t2.i AND bool='T'; 244 SELECT count(*) FROM t1 LEFT JOIN t2 ON likely(t1.i=t2.i) AND bool='T'; 245 } {4 4} 246 247 # 2015-06-20 248 # Crash discovered by AFL 249 # 250 do_execsql_test 7.0 { 251 DROP TABLE IF EXISTS t1; 252 CREATE TABLE t1(a, b, PRIMARY KEY(a,b)); 253 INSERT INTO t1 VALUES(9,1),(1,2); 254 DROP TABLE IF EXISTS t2; 255 CREATE TABLE t2(x, y, PRIMARY KEY(x,y)); 256 INSERT INTO t2 VALUES(3,3),(4,4); 257 SELECT likely(a), x FROM t1, t2 ORDER BY 1, 2; 258 } {1 3 1 4 9 3 9 4} 259 do_execsql_test 7.1 { 260 SELECT unlikely(a), x FROM t1, t2 ORDER BY 1, 2; 261 } {1 3 1 4 9 3 9 4} 262 do_execsql_test 7.2 { 263 SELECT likelihood(a,0.5), x FROM t1, t2 ORDER BY 1, 2; 264 } {1 3 1 4 9 3 9 4} 265 do_execsql_test 7.3 { 266 SELECT coalesce(a,a), x FROM t1, t2 ORDER BY 1, 2; 267 } {1 3 1 4 9 3 9 4} 268 269 270 finish_test