1*3fb183d2Sdrh# 2014-03-31 2*3fb183d2Sdrh# 3*3fb183d2Sdrh# The author disclaims copyright to this source code. In place of 4*3fb183d2Sdrh# a legal notice, here is a blessing: 5*3fb183d2Sdrh# 6*3fb183d2Sdrh# May you do good and not evil. 7*3fb183d2Sdrh# May you find forgiveness for yourself and forgive others. 8*3fb183d2Sdrh# May you share freely, never taking more than you give. 9*3fb183d2Sdrh# 10*3fb183d2Sdrh#*********************************************************************** 11*3fb183d2Sdrh# 12*3fb183d2Sdrh# Test cases for query planning decisions where one candidate index 13*3fb183d2Sdrh# covers a proper superset of the WHERE clause terms of another 14*3fb183d2Sdrh# candidate index. 15*3fb183d2Sdrh# 16*3fb183d2Sdrh 17*3fb183d2Sdrhset testdir [file dirname $argv0] 18*3fb183d2Sdrhsource $testdir/tester.tcl 19*3fb183d2Sdrh 20*3fb183d2Sdrhdo_execsql_test whereH-1.1 { 21*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d); 22*3fb183d2Sdrh CREATE INDEX t1abc ON t1(a,b,c); 23*3fb183d2Sdrh CREATE INDEX t1bc ON t1(b,c); 24*3fb183d2Sdrh 25*3fb183d2Sdrh EXPLAIN QUERY PLAN 26*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c>=? ORDER BY c; 27*3fb183d2Sdrh} {/INDEX t1abc /} 28*3fb183d2Sdrhdo_execsql_test whereH-1.2 { 29*3fb183d2Sdrh EXPLAIN QUERY PLAN 30*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c>=? ORDER BY c; 31*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 32*3fb183d2Sdrh 33*3fb183d2Sdrhdo_execsql_test whereH-2.1 { 34*3fb183d2Sdrh DROP TABLE t1; 35*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d); 36*3fb183d2Sdrh CREATE INDEX t1bc ON t1(b,c); 37*3fb183d2Sdrh CREATE INDEX t1abc ON t1(a,b,c); 38*3fb183d2Sdrh 39*3fb183d2Sdrh EXPLAIN QUERY PLAN 40*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c>=? ORDER BY c; 41*3fb183d2Sdrh} {/INDEX t1abc /} 42*3fb183d2Sdrhdo_execsql_test whereH-2.2 { 43*3fb183d2Sdrh EXPLAIN QUERY PLAN 44*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c>=? ORDER BY c; 45*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 46*3fb183d2Sdrh 47*3fb183d2Sdrhdo_execsql_test whereH-3.1 { 48*3fb183d2Sdrh DROP TABLE t1; 49*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 50*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 51*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 52*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 53*3fb183d2Sdrh 54*3fb183d2Sdrh EXPLAIN QUERY PLAN 55*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 56*3fb183d2Sdrh} {/INDEX t1abcd /} 57*3fb183d2Sdrhdo_execsql_test whereH-3.2 { 58*3fb183d2Sdrh EXPLAIN QUERY PLAN 59*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 60*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 61*3fb183d2Sdrh 62*3fb183d2Sdrhdo_execsql_test whereH-4.1 { 63*3fb183d2Sdrh DROP TABLE t1; 64*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 65*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 66*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 67*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 68*3fb183d2Sdrh 69*3fb183d2Sdrh EXPLAIN QUERY PLAN 70*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 71*3fb183d2Sdrh} {/INDEX t1abcd /} 72*3fb183d2Sdrhdo_execsql_test whereH-4.2 { 73*3fb183d2Sdrh EXPLAIN QUERY PLAN 74*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 75*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 76*3fb183d2Sdrh 77*3fb183d2Sdrhdo_execsql_test whereH-5.1 { 78*3fb183d2Sdrh DROP TABLE t1; 79*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 80*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 81*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 82*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 83*3fb183d2Sdrh 84*3fb183d2Sdrh EXPLAIN QUERY PLAN 85*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 86*3fb183d2Sdrh} {/INDEX t1abcd /} 87*3fb183d2Sdrhdo_execsql_test whereH-5.2 { 88*3fb183d2Sdrh EXPLAIN QUERY PLAN 89*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 90*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 91*3fb183d2Sdrh 92*3fb183d2Sdrhdo_execsql_test whereH-6.1 { 93*3fb183d2Sdrh DROP TABLE t1; 94*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 95*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 96*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 97*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 98*3fb183d2Sdrh 99*3fb183d2Sdrh EXPLAIN QUERY PLAN 100*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 101*3fb183d2Sdrh} {/INDEX t1abcd /} 102*3fb183d2Sdrhdo_execsql_test whereH-6.2 { 103*3fb183d2Sdrh EXPLAIN QUERY PLAN 104*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 105*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 106*3fb183d2Sdrh 107*3fb183d2Sdrhdo_execsql_test whereH-7.1 { 108*3fb183d2Sdrh DROP TABLE t1; 109*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 110*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 111*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 112*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 113*3fb183d2Sdrh 114*3fb183d2Sdrh EXPLAIN QUERY PLAN 115*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 116*3fb183d2Sdrh} {/INDEX t1abcd /} 117*3fb183d2Sdrhdo_execsql_test whereH-7.2 { 118*3fb183d2Sdrh EXPLAIN QUERY PLAN 119*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 120*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 121*3fb183d2Sdrh 122*3fb183d2Sdrhdo_execsql_test whereH-8.1 { 123*3fb183d2Sdrh DROP TABLE t1; 124*3fb183d2Sdrh CREATE TABLE t1(a,b,c,d,e); 125*3fb183d2Sdrh CREATE INDEX t1abcd ON t1(a,b,c,d); 126*3fb183d2Sdrh CREATE INDEX t1cd ON t1(c,d); 127*3fb183d2Sdrh CREATE INDEX t1bcd ON t1(b,c,d); 128*3fb183d2Sdrh 129*3fb183d2Sdrh EXPLAIN QUERY PLAN 130*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 131*3fb183d2Sdrh} {/INDEX t1abcd /} 132*3fb183d2Sdrhdo_execsql_test whereH-8.2 { 133*3fb183d2Sdrh EXPLAIN QUERY PLAN 134*3fb183d2Sdrh SELECT d FROM t1 WHERE a=? AND b=? AND c=? AND d>=? ORDER BY d; 135*3fb183d2Sdrh} {~/TEMP B-TREE FOR ORDER BY/} 136*3fb183d2Sdrh 137*3fb183d2Sdrh 138*3fb183d2Sdrh 139*3fb183d2Sdrhfinish_test 140