11fe0537eSdrh# 2013-07-31 21fe0537eSdrh# 31fe0537eSdrh# The author disclaims copyright to this source code. In place of 41fe0537eSdrh# a legal notice, here is a blessing: 51fe0537eSdrh# 61fe0537eSdrh# May you do good and not evil. 71fe0537eSdrh# May you find forgiveness for yourself and forgive others. 81fe0537eSdrh# May you share freely, never taking more than you give. 91fe0537eSdrh# 101fe0537eSdrh#*********************************************************************** 111fe0537eSdrh# 121fe0537eSdrh# Test cases for partial indices 131fe0537eSdrh# 141fe0537eSdrh 151fe0537eSdrh 161fe0537eSdrhset testdir [file dirname $argv0] 171fe0537eSdrhsource $testdir/tester.tcl 181fe0537eSdrh 19c3c16cbdSdanifcapable !vtab { 20c3c16cbdSdan finish_test 21c3c16cbdSdan return 22c3c16cbdSdan} 23c3c16cbdSdan 241fe0537eSdrhload_static_extension db wholenumber; 251fe0537eSdrhdo_test index6-1.1 { 2666518ca7Sdrh # Able to parse and manage partial indices 271fe0537eSdrh execsql { 28721dfcf5Sdrh CREATE TABLE t1(a,b,c); 291fe0537eSdrh CREATE INDEX t1a ON t1(a) WHERE a IS NOT NULL; 301fe0537eSdrh CREATE INDEX t1b ON t1(b) WHERE b>10; 311fe0537eSdrh CREATE VIRTUAL TABLE nums USING wholenumber; 32721dfcf5Sdrh INSERT INTO t1(a,b,c) 33721dfcf5Sdrh SELECT CASE WHEN value%3!=0 THEN value END, value, value 341fe0537eSdrh FROM nums WHERE value<=20; 351fe0537eSdrh SELECT count(a), count(b) FROM t1; 3666518ca7Sdrh PRAGMA integrity_check; 371fe0537eSdrh } 3866518ca7Sdrh} {14 20 ok} 391fe0537eSdrh 405f33f375Sdrh# Make sure the count(*) optimization works correctly with 415f33f375Sdrh# partial indices. Ticket [a5c8ed66cae16243be6] 2013-10-03. 425f33f375Sdrh# 435f33f375Sdrhdo_execsql_test index6-1.1.1 { 445f33f375Sdrh SELECT count(*) FROM t1; 455f33f375Sdrh} {20} 465f33f375Sdrh 4766518ca7Sdrh# Error conditions during parsing... 4866518ca7Sdrh# 493780be11Sdrhdo_test index6-1.2 { 503780be11Sdrh catchsql { 51721dfcf5Sdrh CREATE INDEX bad1 ON t1(a,b) WHERE x IS NOT NULL; 523780be11Sdrh } 53721dfcf5Sdrh} {1 {no such column: x}} 543780be11Sdrhdo_test index6-1.3 { 553780be11Sdrh catchsql { 563780be11Sdrh CREATE INDEX bad1 ON t1(a,b) WHERE EXISTS(SELECT * FROM t1); 573780be11Sdrh } 583780be11Sdrh} {1 {subqueries prohibited in partial index WHERE clauses}} 593780be11Sdrhdo_test index6-1.4 { 603780be11Sdrh catchsql { 613780be11Sdrh CREATE INDEX bad1 ON t1(a,b) WHERE a!=?1; 623780be11Sdrh } 633780be11Sdrh} {1 {parameters prohibited in partial index WHERE clauses}} 643780be11Sdrhdo_test index6-1.5 { 653780be11Sdrh catchsql { 663780be11Sdrh CREATE INDEX bad1 ON t1(a,b) WHERE a!=random(); 673780be11Sdrh } 68a71c743aSdrh} {1 {non-deterministic functions prohibited in partial index WHERE clauses}} 693780be11Sdrhdo_test index6-1.6 { 703780be11Sdrh catchsql { 713780be11Sdrh CREATE INDEX bad1 ON t1(a,b) WHERE a NOT LIKE 'abc%'; 723780be11Sdrh } 73a71c743aSdrh} {0 {}} 74a71c743aSdrhdo_execsql_test index6-1.7 { 75a71c743aSdrh DROP INDEX IF EXISTS bad1; 76a71c743aSdrh} 773780be11Sdrh 788a9789b6Sdrhdo_test index6-1.10 { 798a9789b6Sdrh execsql { 808a9789b6Sdrh ANALYZE; 818a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 828a9789b6Sdrh PRAGMA integrity_check; 838a9789b6Sdrh } 84721dfcf5Sdrh} {{} 20 t1a {14 1} t1b {10 1} ok} 858a9789b6Sdrh 8666518ca7Sdrh# STAT1 shows the partial indices have a reduced number of 8766518ca7Sdrh# rows. 8866518ca7Sdrh# 898a9789b6Sdrhdo_test index6-1.11 { 908a9789b6Sdrh execsql { 918a9789b6Sdrh UPDATE t1 SET a=b; 928a9789b6Sdrh ANALYZE; 938a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 948a9789b6Sdrh PRAGMA integrity_check; 958a9789b6Sdrh } 96721dfcf5Sdrh} {{} 20 t1a {20 1} t1b {10 1} ok} 978a9789b6Sdrh 988a9789b6Sdrhdo_test index6-1.11 { 998a9789b6Sdrh execsql { 1008a9789b6Sdrh UPDATE t1 SET a=NULL WHERE b%3!=0; 1018a9789b6Sdrh UPDATE t1 SET b=b+100; 1028a9789b6Sdrh ANALYZE; 1038a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 1048a9789b6Sdrh PRAGMA integrity_check; 1058a9789b6Sdrh } 106721dfcf5Sdrh} {{} 20 t1a {6 1} t1b {20 1} ok} 1078a9789b6Sdrh 1088a9789b6Sdrhdo_test index6-1.12 { 1098a9789b6Sdrh execsql { 1108a9789b6Sdrh UPDATE t1 SET a=CASE WHEN b%3!=0 THEN b END; 1118a9789b6Sdrh UPDATE t1 SET b=b-100; 1128a9789b6Sdrh ANALYZE; 1138a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 1148a9789b6Sdrh PRAGMA integrity_check; 1158a9789b6Sdrh } 116721dfcf5Sdrh} {{} 20 t1a {13 1} t1b {10 1} ok} 1178a9789b6Sdrh 1188a9789b6Sdrhdo_test index6-1.13 { 1198a9789b6Sdrh execsql { 1208a9789b6Sdrh DELETE FROM t1 WHERE b BETWEEN 8 AND 12; 1218a9789b6Sdrh ANALYZE; 1228a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 1238a9789b6Sdrh PRAGMA integrity_check; 1248a9789b6Sdrh } 125721dfcf5Sdrh} {{} 15 t1a {10 1} t1b {8 1} ok} 1268a9789b6Sdrh 1278a9789b6Sdrhdo_test index6-1.14 { 1288a9789b6Sdrh execsql { 1298a9789b6Sdrh REINDEX; 1308a9789b6Sdrh ANALYZE; 1318a9789b6Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 1328a9789b6Sdrh PRAGMA integrity_check; 1338a9789b6Sdrh } 134721dfcf5Sdrh} {{} 15 t1a {10 1} t1b {8 1} ok} 135721dfcf5Sdrh 136721dfcf5Sdrhdo_test index6-1.15 { 137721dfcf5Sdrh execsql { 138721dfcf5Sdrh CREATE INDEX t1c ON t1(c); 139721dfcf5Sdrh ANALYZE; 140721dfcf5Sdrh SELECT idx, stat FROM sqlite_stat1 ORDER BY idx; 141721dfcf5Sdrh PRAGMA integrity_check; 142721dfcf5Sdrh } 143721dfcf5Sdrh} {t1a {10 1} t1b {8 1} t1c {15 1} ok} 1443780be11Sdrh 14566518ca7Sdrh# Queries use partial indices as appropriate times. 14666518ca7Sdrh# 14766518ca7Sdrhdo_test index6-2.1 { 14866518ca7Sdrh execsql { 14966518ca7Sdrh CREATE TABLE t2(a,b); 15066518ca7Sdrh INSERT INTO t2(a,b) SELECT value, value FROM nums WHERE value<1000; 1517de2a1faSdan UPDATE t2 SET a=NULL WHERE b%2==0; 15266518ca7Sdrh CREATE INDEX t2a1 ON t2(a) WHERE a IS NOT NULL; 15366518ca7Sdrh SELECT count(*) FROM t2 WHERE a IS NOT NULL; 15466518ca7Sdrh } 1557de2a1faSdan} {500} 15666518ca7Sdrhdo_test index6-2.2 { 15766518ca7Sdrh execsql { 15866518ca7Sdrh EXPLAIN QUERY PLAN 15966518ca7Sdrh SELECT * FROM t2 WHERE a=5; 16066518ca7Sdrh } 16166518ca7Sdrh} {/.* TABLE t2 USING INDEX t2a1 .*/} 162175b8f06Sdrhifcapable stat4 { 1637de2a1faSdan execsql ANALYZE 1643d407598Sdan do_test index6-2.3stat4 { 16566518ca7Sdrh execsql { 16666518ca7Sdrh EXPLAIN QUERY PLAN 16766518ca7Sdrh SELECT * FROM t2 WHERE a IS NOT NULL; 16866518ca7Sdrh } 16966518ca7Sdrh } {/.* TABLE t2 USING INDEX t2a1 .*/} 1709fe809c5Sdrh} else { 1713d407598Sdan do_test index6-2.3stat4 { 1729fe809c5Sdrh execsql { 1739fe809c5Sdrh EXPLAIN QUERY PLAN 1749fe809c5Sdrh SELECT * FROM t2 WHERE a IS NOT NULL AND a>0; 1759fe809c5Sdrh } 1769fe809c5Sdrh } {/.* TABLE t2 USING INDEX t2a1 .*/} 1779fe809c5Sdrh} 17866518ca7Sdrhdo_test index6-2.4 { 17966518ca7Sdrh execsql { 18066518ca7Sdrh EXPLAIN QUERY PLAN 18166518ca7Sdrh SELECT * FROM t2 WHERE a IS NULL; 18266518ca7Sdrh } 18366518ca7Sdrh} {~/.*INDEX t2a1.*/} 18466518ca7Sdrh 18566518ca7Sdrhdo_execsql_test index6-2.101 { 18666518ca7Sdrh DROP INDEX t2a1; 18766518ca7Sdrh UPDATE t2 SET a=b, b=b+10000; 18866518ca7Sdrh SELECT b FROM t2 WHERE a=15; 18966518ca7Sdrh} {10015} 19066518ca7Sdrhdo_execsql_test index6-2.102 { 19166518ca7Sdrh CREATE INDEX t2a2 ON t2(a) WHERE a<100 OR a>200; 19266518ca7Sdrh SELECT b FROM t2 WHERE a=15; 19366518ca7Sdrh PRAGMA integrity_check; 19466518ca7Sdrh} {10015 ok} 19566518ca7Sdrhdo_execsql_test index6-2.102eqp { 19666518ca7Sdrh EXPLAIN QUERY PLAN 19766518ca7Sdrh SELECT b FROM t2 WHERE a=15; 19866518ca7Sdrh} {~/.*INDEX t2a2.*/} 19966518ca7Sdrhdo_execsql_test index6-2.103 { 20066518ca7Sdrh SELECT b FROM t2 WHERE a=15 AND a<100; 20166518ca7Sdrh} {10015} 20266518ca7Sdrhdo_execsql_test index6-2.103eqp { 20366518ca7Sdrh EXPLAIN QUERY PLAN 20466518ca7Sdrh SELECT b FROM t2 WHERE a=15 AND a<100; 20566518ca7Sdrh} {/.*INDEX t2a2.*/} 20666518ca7Sdrhdo_execsql_test index6-2.104 { 20766518ca7Sdrh SELECT b FROM t2 WHERE a=515 AND a>200; 20866518ca7Sdrh} {10515} 20966518ca7Sdrhdo_execsql_test index6-2.104eqp { 21066518ca7Sdrh EXPLAIN QUERY PLAN 21166518ca7Sdrh SELECT b FROM t2 WHERE a=515 AND a>200; 21266518ca7Sdrh} {/.*INDEX t2a2.*/} 21366518ca7Sdrh 21466518ca7Sdrh# Partial UNIQUE indices 21566518ca7Sdrh# 21666518ca7Sdrhdo_execsql_test index6-3.1 { 21766518ca7Sdrh CREATE TABLE t3(a,b); 21866518ca7Sdrh INSERT INTO t3 SELECT value, value FROM nums WHERE value<200; 21966518ca7Sdrh UPDATE t3 SET a=999 WHERE b%5!=0; 22066518ca7Sdrh CREATE UNIQUE INDEX t3a ON t3(a) WHERE a<>999; 22166518ca7Sdrh} {} 22266518ca7Sdrhdo_test index6-3.2 { 22366518ca7Sdrh # unable to insert a duplicate row a-value that is not 999. 22466518ca7Sdrh catchsql { 22566518ca7Sdrh INSERT INTO t3(a,b) VALUES(150, 'test1'); 22666518ca7Sdrh } 227f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t3.a}} 22866518ca7Sdrhdo_test index6-3.3 { 22966518ca7Sdrh # can insert multiple rows with a==999 because such rows are not 23066518ca7Sdrh # part of the unique index. 23166518ca7Sdrh catchsql { 23266518ca7Sdrh INSERT INTO t3(a,b) VALUES(999, 'test1'), (999, 'test2'); 23366518ca7Sdrh } 23466518ca7Sdrh} {0 {}} 23566518ca7Sdrhdo_execsql_test index6-3.4 { 23666518ca7Sdrh SELECT count(*) FROM t3 WHERE a=999; 23766518ca7Sdrh} {162} 23866518ca7Sdrhintegrity_check index6-3.5 23966518ca7Sdrh 2403bf0ac17Sdrhdo_execsql_test index6-4.0 { 2413bf0ac17Sdrh VACUUM; 2423bf0ac17Sdrh PRAGMA integrity_check; 2433bf0ac17Sdrh} {ok} 2443bf0ac17Sdrh 2451e7d43c9Sdrh# Silently ignore database name qualifiers in partial indices. 2461e7d43c9Sdrh# 2471e7d43c9Sdrhdo_execsql_test index6-5.0 { 2481e7d43c9Sdrh CREATE INDEX t3b ON t3(b) WHERE xyzzy.t3.b BETWEEN 5 AND 10; 2491e7d43c9Sdrh /* ^^^^^-- ignored */ 2501e7d43c9Sdrh ANALYZE; 2511e7d43c9Sdrh SELECT count(*) FROM t3 WHERE t3.b BETWEEN 5 AND 10; 2521e7d43c9Sdrh SELECT stat+0 FROM sqlite_stat1 WHERE idx='t3b'; 2531e7d43c9Sdrh} {6 6} 2541e7d43c9Sdrh 25587744513Sdrh# Test case for ticket [2ea3e9fe6379fc3f6ce7e090ce483c1a3a80d6c9] from 25687744513Sdrh# 2014-04-13: Partial index causes assertion fault on UPDATE OR REPLACE. 25787744513Sdrh# 25887744513Sdrhdo_execsql_test index6-6.0 { 25987744513Sdrh CREATE TABLE t6(a,b); 26087744513Sdrh CREATE UNIQUE INDEX t6ab ON t1(a,b); 26187744513Sdrh CREATE INDEX t6b ON t6(b) WHERE b=1; 26287744513Sdrh INSERT INTO t6(a,b) VALUES(123,456); 26387744513Sdrh SELECT * FROM t6; 26487744513Sdrh} {123 456} 26587744513Sdrhdo_execsql_test index6-6.1 { 26687744513Sdrh UPDATE OR REPLACE t6 SET b=789; 26787744513Sdrh SELECT * FROM t6; 26887744513Sdrh} {123 789} 26987744513Sdrhdo_execsql_test index6-6.2 { 27087744513Sdrh PRAGMA integrity_check; 27187744513Sdrh} {ok} 27287744513Sdrh 273e006a866Sdrh# Test case for ticket [2326c258d02ead33d69faa63de8f4686b9b1b9d9] on 274e006a866Sdrh# 2015-02-24. Any use of a partial index qualifying constraint inside 275e006a866Sdrh# the ON clause of a LEFT JOIN was causing incorrect results for all 276e006a866Sdrh# versions of SQLite 3.8.0 through 3.8.8. 277e006a866Sdrh# 278e006a866Sdrhdo_execsql_test index6-7.0 { 279e006a866Sdrh CREATE TABLE t7a(x); 280e006a866Sdrh CREATE TABLE t7b(y); 281e006a866Sdrh INSERT INTO t7a(x) VALUES(1); 282e006a866Sdrh CREATE INDEX t7ax ON t7a(x) WHERE x=99; 283e006a866Sdrh PRAGMA automatic_index=OFF; 284e006a866Sdrh SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x; 285e006a866Sdrh} {1 {}} 286e006a866Sdrhdo_execsql_test index6-7.1 { 287e006a866Sdrh INSERT INTO t7b(y) VALUES(2); 288e006a866Sdrh SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; 289e006a866Sdrh} {} 290e006a866Sdrhdo_execsql_test index6-7.2 { 291e006a866Sdrh INSERT INTO t7a(x) VALUES(99); 292e006a866Sdrh SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x; 293e006a866Sdrh} {1 {} 99 2} 294e006a866Sdrhdo_execsql_test index6-7.3 { 295e006a866Sdrh SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; 296e006a866Sdrh} {99 2} 297e006a866Sdrhdo_execsql_test index6-7.4 { 298e006a866Sdrh EXPLAIN QUERY PLAN 299e006a866Sdrh SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; 300e006a866Sdrh} {/USING COVERING INDEX t7ax/} 30187744513Sdrh 3022a45cb5cSdan 3032a45cb5cSdando_execsql_test index6-8.0 { 3042a45cb5cSdan CREATE TABLE t8a(a,b); 3052a45cb5cSdan CREATE TABLE t8b(x,y); 3062a45cb5cSdan CREATE INDEX i8c ON t8b(y) WHERE x = 'value'; 3072a45cb5cSdan 3082a45cb5cSdan INSERT INTO t8a VALUES(1, 'one'); 3092a45cb5cSdan INSERT INTO t8a VALUES(2, 'two'); 3102a45cb5cSdan INSERT INTO t8a VALUES(3, 'three'); 3112a45cb5cSdan 3122a45cb5cSdan INSERT INTO t8b VALUES('value', 1); 3132a45cb5cSdan INSERT INTO t8b VALUES('dummy', 2); 3142a45cb5cSdan INSERT INTO t8b VALUES('value', 3); 3152a45cb5cSdan INSERT INTO t8b VALUES('dummy', 4); 3162a45cb5cSdan} {} 3172a45cb5cSdan 3182a45cb5cSdando_eqp_test index6-8.1 { 3192a45cb5cSdan SELECT * FROM t8a LEFT JOIN t8b ON (x = 'value' AND y = a) 3202a45cb5cSdan} { 321b3f0276bSdrh QUERY PLAN 322b3f0276bSdrh |--SCAN TABLE t8a 323b3f0276bSdrh `--SEARCH TABLE t8b USING INDEX i8c (y=?) 3242a45cb5cSdan} 3252a45cb5cSdan 3262a45cb5cSdando_execsql_test index6-8.2 { 3272a45cb5cSdan SELECT * FROM t8a LEFT JOIN t8b ON (x = 'value' AND y = a) 3282a45cb5cSdan} { 3292a45cb5cSdan 1 one value 1 3302a45cb5cSdan 2 two {} {} 3312a45cb5cSdan 3 three value 3 3322a45cb5cSdan} 3332a45cb5cSdan 33472bc8208Sdrh# 2015-06-11. Assertion fault found by AFL 33572bc8208Sdrh# 33672bc8208Sdrhdo_execsql_test index6-9.1 { 33772bc8208Sdrh CREATE TABLE t9(a int, b int, c int); 33872bc8208Sdrh CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); 33972bc8208Sdrh INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3); 34072bc8208Sdrh UPDATE t9 SET b=c WHERE a in (10,12,20); 34172bc8208Sdrh SELECT a,b,c,'|' FROM t9 ORDER BY a; 34272bc8208Sdrh} {{} 7 3 | 1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |} 34372bc8208Sdrhdo_execsql_test index6-9.2 { 34472bc8208Sdrh DROP TABLE t9; 34572bc8208Sdrh CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a)) WITHOUT ROWID; 34672bc8208Sdrh CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); 34772bc8208Sdrh INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5); 34872bc8208Sdrh UPDATE t9 SET b=c WHERE a in (10,12,20); 34972bc8208Sdrh SELECT a,b,c,'|' FROM t9 ORDER BY a; 35072bc8208Sdrh} {1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |} 35172bc8208Sdrh 352cf599b6aSdrh# AND-connected terms in the WHERE clause of a partial index 353cf599b6aSdrh# 354cf599b6aSdrhdo_execsql_test index6-10.1 { 355cf599b6aSdrh CREATE TABLE t10(a,b,c,d,e INTEGER PRIMARY KEY); 356cf599b6aSdrh INSERT INTO t10 VALUES 357cf599b6aSdrh (1,2,3,4,5), 358cf599b6aSdrh (2,3,4,5,6), 359cf599b6aSdrh (3,4,5,6,7), 360cf599b6aSdrh (1,2,3,8,9); 361cf599b6aSdrh CREATE INDEX t10x ON t10(d) WHERE a=1 AND b=2 AND c=3; 362cf599b6aSdrh SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d; 363cf599b6aSdrh} {5 9} 364cf599b6aSdrhdo_execsql_test index6-10.1eqp { 365cf599b6aSdrh EXPLAIN QUERY PLAN 366cf599b6aSdrh SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d; 367cf599b6aSdrh} {/USING INDEX t10x/} 368cf599b6aSdrhdo_execsql_test index6-10.2 { 369cf599b6aSdrh SELECT e FROM t10 WHERE c=3 AND 2=b AND a=1 ORDER BY d DESC; 370cf599b6aSdrh} {9 5} 371cf599b6aSdrhdo_execsql_test index6-10.2eqp { 372cf599b6aSdrh EXPLAIN QUERY PLAN 373cf599b6aSdrh SELECT e FROM t10 WHERE c=3 AND 2=b AND a=1 ORDER BY d DESC; 374cf599b6aSdrh} {/USING INDEX t10x/} 375cf599b6aSdrhdo_execsql_test index6-10.3 { 376cf599b6aSdrh SELECT e FROM t10 WHERE a=1 AND b=2 ORDER BY d DESC; 377cf599b6aSdrh} {9 5} 378cf599b6aSdrhdo_execsql_test index6-10.3eqp { 379cf599b6aSdrh EXPLAIN QUERY PLAN 380cf599b6aSdrh SELECT e FROM t10 WHERE a=1 AND b=2 ORDER BY d DESC; 381cf599b6aSdrh} {~/USING INDEX t10x/} 38272bc8208Sdrh 3838dc570b6Sdrh# A partial index will be used for a full table scan, where possible 3848dc570b6Sdrhdo_execsql_test index6-11.1 { 3858dc570b6Sdrh CREATE TABLE t11(a,b,c); 3868dc570b6Sdrh CREATE INDEX t11x ON t11(a) WHERE b<>99; 3878dc570b6Sdrh EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99; 3888dc570b6Sdrh} {/USING INDEX t11x/} 3898dc570b6Sdrhdo_execsql_test index6-11.2 { 3908dc570b6Sdrh EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99 AND c<>98; 3918dc570b6Sdrh} {/USING INDEX t11x/} 3928dc570b6Sdrh 393d4a4a361Sdrh# 2018-12-08 394d4a4a361Sdrh# Ticket https://www.sqlite.org/src/info/1d958d90596593a7 395d4a4a361Sdrh# NOT IN operator fails when using a partial index. 396d4a4a361Sdrh# 397d4a4a361Sdrhdo_execsql_test index6-12.1 { 398d4a4a361Sdrh DROP TABLE IF EXISTS t1; 399d4a4a361Sdrh DROP TABLE IF EXISTS t2; 400d4a4a361Sdrh CREATE TABLE t1(a,b); 401d4a4a361Sdrh INSERT INTO t1 VALUES(1,1); 402d4a4a361Sdrh INSERT INTO t1 VALUES(2,2); 403d4a4a361Sdrh CREATE TABLE t2(x); 404d4a4a361Sdrh INSERT INTO t2 VALUES(1); 405d4a4a361Sdrh INSERT INTO t2 VALUES(2); 406d4a4a361Sdrh SELECT 'one', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); 407d4a4a361Sdrh CREATE INDEX t1a ON t1(a) WHERE b=1; 408d4a4a361Sdrh SELECT 'two', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); 409d4a4a361Sdrh} {} 410ce706c2cSdrhdo_execsql_test index6-12.2 { 411ce706c2cSdrh SELECT x FROM t2 WHERE x IN (SELECT a FROM t1) ORDER BY +x; 412ce706c2cSdrh} {1 2} 413664d6d13Sdrh 414664d6d13Sdrh# 2019-05-04 415664d6d13Sdrh# Ticket https://www.sqlite.org/src/tktview/5c6955204c392ae763a95 416664d6d13Sdrh# Theorem prover error 417664d6d13Sdrh# 418664d6d13Sdrhdo_execsql_test index6-13.1 { 419664d6d13Sdrh DROP TABLE IF EXISTS t0; 420664d6d13Sdrh CREATE TABLE t0(c0); 421664d6d13Sdrh CREATE INDEX index_0 ON t0(c0) WHERE c0 NOT NULL; 422664d6d13Sdrh INSERT INTO t0(c0) VALUES (NULL); 423664d6d13Sdrh SELECT * FROM t0 WHERE c0 OR 1; 424664d6d13Sdrh} {{}} 425664d6d13Sdrh 4268f2b1e4cSdan# 2019-05-11 4278f2b1e4cSdan# Ticket https://sqlite.org/src/tktview/8025674847 4288f2b1e4cSdanreset_db 4298f2b1e4cSdando_execsql_test index6-14.1 { 4308f2b1e4cSdan CREATE TABLE IF NOT EXISTS t0 (c0, c1); 4318f2b1e4cSdan CREATE INDEX IF NOT EXISTS i0 ON t0(c0, c1) WHERE c0 NOT NULL; 4328f2b1e4cSdan INSERT INTO t0(c0, c1) VALUES(NULL, 'row'); 4338f2b1e4cSdan SELECT * FROM t0 WHERE t0.c0 IS NOT 1; 4348f2b1e4cSdan} {{} row} 4358f2b1e4cSdan 436c6824c8dSdando_execsql_test index6-14.2 { 437c6824c8dSdan SELECT * FROM t0 WHERE CASE c0 WHEN 0 THEN 0 ELSE 1 END; 438c6824c8dSdan} {{} row} 439c6824c8dSdan 44038cefc83Sdrh# 2019-08-30 44138cefc83Sdrh# Ticket https://www.sqlite.org/src/info/a6408d42b9f44462 4427a231b49Sdrh# Ticket https://www.sqlite.org/src/info/fba33c8b1df6a915 443ae144a1cSdrh# https://sqlite.org/src/info/bac716244fddac1fe841 44438cefc83Sdrh# 44538cefc83Sdrhdo_execsql_test index6-15.1 { 44638cefc83Sdrh DROP TABLE t0; 44738cefc83Sdrh CREATE TABLE t0(c0); 44838cefc83Sdrh INSERT INTO t0(c0) VALUES (NULL); 44938cefc83Sdrh CREATE INDEX i0 ON t0(1) WHERE c0 NOT NULL; 45038cefc83Sdrh SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) IS FALSE; 45138cefc83Sdrh} {1} 4527a231b49Sdrhdo_execsql_test index6-15.2 { 4537a231b49Sdrh SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) BETWEEN FALSE AND TRUE; 4547a231b49Sdrh} {1} 4557a231b49Sdrhdo_execsql_test index6-15.3 { 4567a231b49Sdrh SELECT 1 FROM t0 WHERE TRUE BETWEEN (t0.c0 IS FALSE) AND TRUE; 4577a231b49Sdrh} {1} 4587a231b49Sdrhdo_execsql_test index6-15.4 { 4597a231b49Sdrh SELECT 1 FROM t0 WHERE FALSE BETWEEN FALSE AND (t0.c0 IS FALSE); 4607a231b49Sdrh} {1} 461ae144a1cSdrhdo_execsql_test index6-15.5 { 462ae144a1cSdrh SELECT 1 FROM t0 WHERE (c0 IS FALSE) IN (FALSE); 463ae144a1cSdrh} {1} 464ae144a1cSdrh 465*c7d12f4aSdrh# 2019-09-03 466*c7d12f4aSdrh# Ticket https://sqlite.org/src/info/767a8cbc6d20bd68 467*c7d12f4aSdrhdo_execsql_test index6-16.1 { 468*c7d12f4aSdrh DROP TABLE t0; 469*c7d12f4aSdrh CREATE TABLE t0(c0 COLLATE NOCASE, c1); 470*c7d12f4aSdrh CREATE INDEX i0 ON t0(0) WHERE c0 >= c1; 471*c7d12f4aSdrh INSERT INTO t0 VALUES('a', 'B'); 472*c7d12f4aSdrh SELECT c1 <= c0, c0 >= c1 FROM t0; 473*c7d12f4aSdrh} {1 0} 474*c7d12f4aSdrhdo_execsql_test index6-16.2 { 475*c7d12f4aSdrh SELECT 2 FROM t0 WHERE c0 >= c1; 476*c7d12f4aSdrh} {} 477*c7d12f4aSdrhdo_execsql_test index6-16.3 { 478*c7d12f4aSdrh SELECT 3 FROM t0 WHERE c1 <= c0; 479*c7d12f4aSdrh} {3} 480*c7d12f4aSdrh 481*c7d12f4aSdrh 482*c7d12f4aSdrh 48338cefc83Sdrh 4841fe0537eSdrhfinish_test 485