xref: /sqlite-3.40.0/test/analyzeE.test (revision 8210233c)
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