blob: 7b3c0b0be9942aa898a9dd483797ded8c12948e6 [file] [log] [blame]
drhde9a7b82012-09-17 20:44:46 +00001# 2012 September 17
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# Tests for the optimization which attempts to use a covering index
13# for a full-table scan (under the theory that the index will be smaller
14# and require less I/O and hence will run faster.)
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20set testprefix coveridxscan
21
22do_test 1.1 {
23 db eval {
24 CREATE TABLE t1(a,b,c);
25 INSERT INTO t1 VALUES(5,4,3), (4,8,2), (3,2,1);
26 CREATE INDEX t1ab ON t1(a,b);
27 CREATE INDEX t1b ON t1(b);
28 SELECT a FROM t1;
29 }
30 # covering index used for the scan, hence values are increasing
31} {3 4 5}
32
33do_test 1.2 {
34 db eval {
35 SELECT a, c FROM t1;
36 }
37 # There is no covering index, hence the values are in rowid order
38} {5 3 4 2 3 1}
39
40do_test 1.3 {
41 db eval {
42 SELECT b FROM t1;
43 }
44 # Choice of two indices: use the one with fewest columns
45} {2 4 8}
46
47do_test 2.1 {
48 optimization_control db cover-idx-scan 0
49 db eval {SELECT a FROM t1}
50 # With the optimization turned off, output in rowid order
51} {5 4 3}
52do_test 2.2 {
53 db eval {SELECT a, c FROM t1}
54} {5 3 4 2 3 1}
55do_test 2.3 {
56 db eval {SELECT b FROM t1}
57} {4 8 2}
58
59db close
60sqlite3_shutdown
61sqlite3_config_cis 0
62sqlite3 db test.db
63
64do_test 3.1 {
65 db eval {SELECT a FROM t1}
66 # With the optimization configured off, output in rowid order
67} {5 4 3}
68do_test 3.2 {
69 db eval {SELECT a, c FROM t1}
70} {5 3 4 2 3 1}
71do_test 3.3 {
72 db eval {SELECT b FROM t1}
73} {4 8 2}
74
75db close
76sqlite3_shutdown
77sqlite3_config_cis 1
78sqlite3 db test.db
79
80# The CIS optimization is enabled again. Covering indices are once again
81# used for all table scans.
82do_test 4.1 {
83 db eval {SELECT a FROM t1}
84} {3 4 5}
85do_test 4.2 {
86 db eval {SELECT a, c FROM t1}
87} {5 3 4 2 3 1}
88do_test 4.3 {
89 db eval {SELECT b FROM t1}
90} {2 4 8}
91
92
93finish_test