xref: /sqlite-3.40.0/test/index6.test (revision 38cefc83)
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
440*38cefc83Sdrh# 2019-08-30
441*38cefc83Sdrh# Ticket https://www.sqlite.org/src/info/a6408d42b9f44462
442*38cefc83Sdrh#
443*38cefc83Sdrhdo_execsql_test index6-15.1 {
444*38cefc83Sdrh  DROP TABLE t0;
445*38cefc83Sdrh  CREATE TABLE t0(c0);
446*38cefc83Sdrh  INSERT INTO t0(c0) VALUES (NULL);
447*38cefc83Sdrh  CREATE INDEX i0 ON t0(1) WHERE c0 NOT NULL;
448*38cefc83Sdrh  SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) IS FALSE;
449*38cefc83Sdrh} {1}
450*38cefc83Sdrh
4511fe0537eSdrhfinish_test
452