243 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 2014-10-08
 | |
| #
 | |
| # The author disclaims copyright to this source code.  In place of
 | |
| # a legal notice, here is a blessing:
 | |
| #
 | |
| #    May you do good and not evil.
 | |
| #    May you find forgiveness for yourself and forgive others.
 | |
| #    May you share freely, never taking more than you give.
 | |
| #
 | |
| #***********************************************************************
 | |
| # This file implements tests for using STAT4 information
 | |
| # on a descending index in a range query.
 | |
| #
 | |
| 
 | |
| set testdir [file dirname $argv0]
 | |
| source $testdir/tester.tcl
 | |
| set ::testprefix analyzeE
 | |
| 
 | |
| ifcapable {!stat4} {
 | |
|   finish_test
 | |
|   return
 | |
| }
 | |
| 
 | |
| # Verify that range queries on an ASCENDING index will use the
 | |
| # index only if the range covers only a small fraction of the
 | |
| # entries.
 | |
| #
 | |
| do_execsql_test analyzeE-1.0 {
 | |
|   CREATE TABLE t1(a,b);
 | |
|   WITH RECURSIVE
 | |
|     cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000)
 | |
|   INSERT INTO t1(a,b) SELECT x, x FROM cnt;
 | |
|   CREATE INDEX t1a ON t1(a);
 | |
|   ANALYZE;
 | |
| } {}
 | |
| do_execsql_test analyzeE-1.1 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500;
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-1.2 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.3 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.4 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1 AND 500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.5 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.6 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.7 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>2500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.8 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1900
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.9 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1100
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-1.10 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1100
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-1.11 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1900
 | |
| } {/SCAN TABLE t1/}
 | |
| 
 | |
| # Verify that everything works the same on a DESCENDING index.
 | |
| #
 | |
| do_execsql_test analyzeE-2.0 {
 | |
|   DROP INDEX t1a;
 | |
|   CREATE INDEX t1a ON t1(a DESC);
 | |
|   ANALYZE;
 | |
| } {}
 | |
| do_execsql_test analyzeE-2.1 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500;
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-2.2 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.3 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.4 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1 AND 500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.5 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.6 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.7 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>2500
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.8 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1900
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.9 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1100
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-2.10 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1100
 | |
| } {/SEARCH TABLE t1 USING INDEX t1a/}
 | |
| do_execsql_test analyzeE-2.11 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1900
 | |
| } {/SCAN TABLE t1/}
 | |
| 
 | |
| # Now do a range query on the second term of an ASCENDING index
 | |
| # where the first term is constrained by equality.
 | |
| #
 | |
| do_execsql_test analyzeE-3.0 {
 | |
|   DROP TABLE t1;
 | |
|   CREATE TABLE t1(a,b,c);
 | |
|   WITH RECURSIVE
 | |
|     cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000)
 | |
|   INSERT INTO t1(a,b,c) SELECT x, x, 123 FROM cnt;
 | |
|   CREATE INDEX t1ca ON t1(c,a);
 | |
|   ANALYZE;
 | |
| } {}
 | |
| do_execsql_test analyzeE-3.1 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123;
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-3.2 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.3 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.4 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.5 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.6 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.7 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>2500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.8 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1900 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.9 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1100 AND c=123
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-3.10 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1100 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-3.11 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1900 AND c=123
 | |
| } {/SCAN TABLE t1/}
 | |
| 
 | |
| # Repeat the 3.x tests using a DESCENDING index
 | |
| #
 | |
| do_execsql_test analyzeE-4.0 {
 | |
|   DROP INDEX t1ca;
 | |
|   CREATE INDEX t1ca ON t1(c ASC,a DESC);
 | |
|   ANALYZE;
 | |
| } {}
 | |
| do_execsql_test analyzeE-4.1 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123;
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-4.2 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.3 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123;
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.4 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.5 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.6 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.7 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>2500 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.8 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1900 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.9 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a>1100 AND c=123
 | |
| } {/SCAN TABLE t1/}
 | |
| do_execsql_test analyzeE-4.10 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1100 AND c=123
 | |
| } {/SEARCH TABLE t1 USING INDEX t1ca/}
 | |
| do_execsql_test analyzeE-4.11 {
 | |
|   EXPLAIN QUERY PLAN
 | |
|   SELECT * FROM t1 WHERE a<1900 AND c=123
 | |
| } {/SCAN TABLE t1/}
 | |
| 
 | |
| finish_test
 | 
