169afd998Sdrh# 2014-10-08 269afd998Sdrh# 369afd998Sdrh# The author disclaims copyright to this source code. In place of 469afd998Sdrh# a legal notice, here is a blessing: 569afd998Sdrh# 669afd998Sdrh# May you do good and not evil. 769afd998Sdrh# May you find forgiveness for yourself and forgive others. 869afd998Sdrh# May you share freely, never taking more than you give. 969afd998Sdrh# 1069afd998Sdrh#*********************************************************************** 1169afd998Sdrh# This file implements tests for using STAT4 information 1269afd998Sdrh# on a descending index in a range query. 1369afd998Sdrh# 1469afd998Sdrh 1569afd998Sdrhset testdir [file dirname $argv0] 1669afd998Sdrhsource $testdir/tester.tcl 1769afd998Sdrhset ::testprefix analyzeE 1869afd998Sdrh 1969afd998Sdrhifcapable {!stat4} { 2069afd998Sdrh finish_test 2169afd998Sdrh return 2269afd998Sdrh} 2369afd998Sdrh 2469afd998Sdrh# Verify that range queries on an ASCENDING index will use the 2569afd998Sdrh# index only if the range covers only a small fraction of the 2669afd998Sdrh# entries. 2769afd998Sdrh# 2869afd998Sdrhdo_execsql_test analyzeE-1.0 { 2969afd998Sdrh CREATE TABLE t1(a,b); 3069afd998Sdrh WITH RECURSIVE 3169afd998Sdrh cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000) 3269afd998Sdrh INSERT INTO t1(a,b) SELECT x, x FROM cnt; 3369afd998Sdrh CREATE INDEX t1a ON t1(a); 3469afd998Sdrh ANALYZE; 3569afd998Sdrh} {} 3669afd998Sdrhdo_execsql_test analyzeE-1.1 { 3769afd998Sdrh EXPLAIN QUERY PLAN 3869afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500; 39*8210233cSdrh} {/SCAN t1/} 4069afd998Sdrhdo_execsql_test analyzeE-1.2 { 4169afd998Sdrh EXPLAIN QUERY PLAN 4269afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000; 43*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 4469afd998Sdrhdo_execsql_test analyzeE-1.3 { 4569afd998Sdrh EXPLAIN QUERY PLAN 4669afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750; 47*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 4869afd998Sdrhdo_execsql_test analyzeE-1.4 { 4969afd998Sdrh EXPLAIN QUERY PLAN 5069afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 51*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 5269afd998Sdrhdo_execsql_test analyzeE-1.5 { 5369afd998Sdrh EXPLAIN QUERY PLAN 5469afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 55*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 5669afd998Sdrhdo_execsql_test analyzeE-1.6 { 5769afd998Sdrh EXPLAIN QUERY PLAN 5869afd998Sdrh SELECT * FROM t1 WHERE a<500 59*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 6069afd998Sdrhdo_execsql_test analyzeE-1.7 { 6169afd998Sdrh EXPLAIN QUERY PLAN 6269afd998Sdrh SELECT * FROM t1 WHERE a>2500 63*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 6469afd998Sdrhdo_execsql_test analyzeE-1.8 { 6569afd998Sdrh EXPLAIN QUERY PLAN 6669afd998Sdrh SELECT * FROM t1 WHERE a>1900 67*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 6869afd998Sdrhdo_execsql_test analyzeE-1.9 { 6969afd998Sdrh EXPLAIN QUERY PLAN 7069afd998Sdrh SELECT * FROM t1 WHERE a>1100 71*8210233cSdrh} {/SCAN t1/} 7269afd998Sdrhdo_execsql_test analyzeE-1.10 { 7369afd998Sdrh EXPLAIN QUERY PLAN 7469afd998Sdrh SELECT * FROM t1 WHERE a<1100 75*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 7669afd998Sdrhdo_execsql_test analyzeE-1.11 { 7769afd998Sdrh EXPLAIN QUERY PLAN 7869afd998Sdrh SELECT * FROM t1 WHERE a<1900 79*8210233cSdrh} {/SCAN t1/} 8069afd998Sdrh 8169afd998Sdrh# Verify that everything works the same on a DESCENDING index. 8269afd998Sdrh# 8369afd998Sdrhdo_execsql_test analyzeE-2.0 { 8469afd998Sdrh DROP INDEX t1a; 8569afd998Sdrh CREATE INDEX t1a ON t1(a DESC); 8669afd998Sdrh ANALYZE; 8769afd998Sdrh} {} 8869afd998Sdrhdo_execsql_test analyzeE-2.1 { 8969afd998Sdrh EXPLAIN QUERY PLAN 9069afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500; 91*8210233cSdrh} {/SCAN t1/} 9269afd998Sdrhdo_execsql_test analyzeE-2.2 { 9369afd998Sdrh EXPLAIN QUERY PLAN 9469afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000; 95*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 9669afd998Sdrhdo_execsql_test analyzeE-2.3 { 9769afd998Sdrh EXPLAIN QUERY PLAN 9869afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750; 99*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 10069afd998Sdrhdo_execsql_test analyzeE-2.4 { 10169afd998Sdrh EXPLAIN QUERY PLAN 10269afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 103*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 10469afd998Sdrhdo_execsql_test analyzeE-2.5 { 10569afd998Sdrh EXPLAIN QUERY PLAN 10669afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 107*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 10869afd998Sdrhdo_execsql_test analyzeE-2.6 { 10969afd998Sdrh EXPLAIN QUERY PLAN 11069afd998Sdrh SELECT * FROM t1 WHERE a<500 111*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 11269afd998Sdrhdo_execsql_test analyzeE-2.7 { 11369afd998Sdrh EXPLAIN QUERY PLAN 11469afd998Sdrh SELECT * FROM t1 WHERE a>2500 115*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 11669afd998Sdrhdo_execsql_test analyzeE-2.8 { 11769afd998Sdrh EXPLAIN QUERY PLAN 11869afd998Sdrh SELECT * FROM t1 WHERE a>1900 119*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 12069afd998Sdrhdo_execsql_test analyzeE-2.9 { 12169afd998Sdrh EXPLAIN QUERY PLAN 12269afd998Sdrh SELECT * FROM t1 WHERE a>1100 123*8210233cSdrh} {/SCAN t1/} 12469afd998Sdrhdo_execsql_test analyzeE-2.10 { 12569afd998Sdrh EXPLAIN QUERY PLAN 12669afd998Sdrh SELECT * FROM t1 WHERE a<1100 127*8210233cSdrh} {/SEARCH t1 USING INDEX t1a/} 12869afd998Sdrhdo_execsql_test analyzeE-2.11 { 12969afd998Sdrh EXPLAIN QUERY PLAN 13069afd998Sdrh SELECT * FROM t1 WHERE a<1900 131*8210233cSdrh} {/SCAN t1/} 13269afd998Sdrh 13369afd998Sdrh# Now do a range query on the second term of an ASCENDING index 13469afd998Sdrh# where the first term is constrained by equality. 13569afd998Sdrh# 13669afd998Sdrhdo_execsql_test analyzeE-3.0 { 13769afd998Sdrh DROP TABLE t1; 13869afd998Sdrh CREATE TABLE t1(a,b,c); 13969afd998Sdrh WITH RECURSIVE 14069afd998Sdrh cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000) 14169afd998Sdrh INSERT INTO t1(a,b,c) SELECT x, x, 123 FROM cnt; 14269afd998Sdrh CREATE INDEX t1ca ON t1(c,a); 14369afd998Sdrh ANALYZE; 14469afd998Sdrh} {} 14569afd998Sdrhdo_execsql_test analyzeE-3.1 { 14669afd998Sdrh EXPLAIN QUERY PLAN 14769afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123; 148*8210233cSdrh} {/SCAN t1/} 14969afd998Sdrhdo_execsql_test analyzeE-3.2 { 15069afd998Sdrh EXPLAIN QUERY PLAN 15169afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123; 152*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 15369afd998Sdrhdo_execsql_test analyzeE-3.3 { 15469afd998Sdrh EXPLAIN QUERY PLAN 15569afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123; 156*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 15769afd998Sdrhdo_execsql_test analyzeE-3.4 { 15869afd998Sdrh EXPLAIN QUERY PLAN 15969afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123 160*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 16169afd998Sdrhdo_execsql_test analyzeE-3.5 { 16269afd998Sdrh EXPLAIN QUERY PLAN 16369afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123 164*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 16569afd998Sdrhdo_execsql_test analyzeE-3.6 { 16669afd998Sdrh EXPLAIN QUERY PLAN 16769afd998Sdrh SELECT * FROM t1 WHERE a<500 AND c=123 168*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 16969afd998Sdrhdo_execsql_test analyzeE-3.7 { 17069afd998Sdrh EXPLAIN QUERY PLAN 17169afd998Sdrh SELECT * FROM t1 WHERE a>2500 AND c=123 172*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 17369afd998Sdrhdo_execsql_test analyzeE-3.8 { 17469afd998Sdrh EXPLAIN QUERY PLAN 17569afd998Sdrh SELECT * FROM t1 WHERE a>1900 AND c=123 176*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 17769afd998Sdrhdo_execsql_test analyzeE-3.9 { 17869afd998Sdrh EXPLAIN QUERY PLAN 17969afd998Sdrh SELECT * FROM t1 WHERE a>1100 AND c=123 180*8210233cSdrh} {/SCAN t1/} 18169afd998Sdrhdo_execsql_test analyzeE-3.10 { 18269afd998Sdrh EXPLAIN QUERY PLAN 18369afd998Sdrh SELECT * FROM t1 WHERE a<1100 AND c=123 184*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 18569afd998Sdrhdo_execsql_test analyzeE-3.11 { 18669afd998Sdrh EXPLAIN QUERY PLAN 18769afd998Sdrh SELECT * FROM t1 WHERE a<1900 AND c=123 188*8210233cSdrh} {/SCAN t1/} 18969afd998Sdrh 19069afd998Sdrh# Repeat the 3.x tests using a DESCENDING index 19169afd998Sdrh# 19269afd998Sdrhdo_execsql_test analyzeE-4.0 { 19369afd998Sdrh DROP INDEX t1ca; 19469afd998Sdrh CREATE INDEX t1ca ON t1(c ASC,a DESC); 19569afd998Sdrh ANALYZE; 19669afd998Sdrh} {} 19769afd998Sdrhdo_execsql_test analyzeE-4.1 { 19869afd998Sdrh EXPLAIN QUERY PLAN 19969afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123; 200*8210233cSdrh} {/SCAN t1/} 20169afd998Sdrhdo_execsql_test analyzeE-4.2 { 20269afd998Sdrh EXPLAIN QUERY PLAN 20369afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123; 204*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 20569afd998Sdrhdo_execsql_test analyzeE-4.3 { 20669afd998Sdrh EXPLAIN QUERY PLAN 20769afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123; 208*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 20969afd998Sdrhdo_execsql_test analyzeE-4.4 { 21069afd998Sdrh EXPLAIN QUERY PLAN 21169afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123 212*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 21369afd998Sdrhdo_execsql_test analyzeE-4.5 { 21469afd998Sdrh EXPLAIN QUERY PLAN 21569afd998Sdrh SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123 216*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 21769afd998Sdrhdo_execsql_test analyzeE-4.6 { 21869afd998Sdrh EXPLAIN QUERY PLAN 21969afd998Sdrh SELECT * FROM t1 WHERE a<500 AND c=123 220*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 22169afd998Sdrhdo_execsql_test analyzeE-4.7 { 22269afd998Sdrh EXPLAIN QUERY PLAN 22369afd998Sdrh SELECT * FROM t1 WHERE a>2500 AND c=123 224*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 22569afd998Sdrhdo_execsql_test analyzeE-4.8 { 22669afd998Sdrh EXPLAIN QUERY PLAN 22769afd998Sdrh SELECT * FROM t1 WHERE a>1900 AND c=123 228*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 22969afd998Sdrhdo_execsql_test analyzeE-4.9 { 23069afd998Sdrh EXPLAIN QUERY PLAN 23169afd998Sdrh SELECT * FROM t1 WHERE a>1100 AND c=123 232*8210233cSdrh} {/SCAN t1/} 23369afd998Sdrhdo_execsql_test analyzeE-4.10 { 23469afd998Sdrh EXPLAIN QUERY PLAN 23569afd998Sdrh SELECT * FROM t1 WHERE a<1100 AND c=123 236*8210233cSdrh} {/SEARCH t1 USING INDEX t1ca/} 23769afd998Sdrhdo_execsql_test analyzeE-4.11 { 23869afd998Sdrh EXPLAIN QUERY PLAN 23969afd998Sdrh SELECT * FROM t1 WHERE a<1900 AND c=123 240*8210233cSdrh} {/SCAN t1/} 24169afd998Sdrh 24269afd998Sdrhfinish_test 243