Annotation of embedaddon/sqlite3/test/analyze7.test, revision 1.1.1.1
1.1 misho 1: # 2011 April 1
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: # This file implements regression tests for SQLite library.
12: # This file implements tests for the ANALYZE command when an idnex
13: # name is given as the argument.
14: #
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18:
19: # There is nothing to test if ANALYZE is disable for this build.
20: #
21: ifcapable {!analyze||!vtab} {
22: finish_test
23: return
24: }
25:
26: # Generate some test data
27: #
28: do_test analyze7-1.0 {
29: register_wholenumber_module db
30: execsql {
31: CREATE TABLE t1(a,b,c,d);
32: CREATE INDEX t1a ON t1(a);
33: CREATE INDEX t1b ON t1(b);
34: CREATE INDEX t1cd ON t1(c,d);
35: CREATE VIRTUAL TABLE nums USING wholenumber;
36: INSERT INTO t1 SELECT value, value, value/100, value FROM nums
37: WHERE value BETWEEN 1 AND 256;
38: EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;
39: }
40: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~10 rows)}}
41: do_test analyze7-1.1 {
42: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
43: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
44: do_test analyze7-1.2 {
45: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
46: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~10 rows)}}
47:
48: # Run an analyze on one of the three indices. Verify that this
49: # effects the row-count estimate on the one query that uses that
50: # one index.
51: #
52: do_test analyze7-2.0 {
53: execsql {ANALYZE t1a;}
54: db cache flush
55: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;}
56: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
57: do_test analyze7-2.1 {
58: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
59: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
60: do_test analyze7-2.2 {
61: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
62: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~10 rows)}}
63:
64: # Verify that since the query planner now things that t1a is more
65: # selective than t1b, it prefers to use t1a.
66: #
67: do_test analyze7-2.3 {
68: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123}
69: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
70:
71: # Run an analysis on another of the three indices. Verify that this
72: # new analysis works and does not disrupt the previous analysis.
73: #
74: do_test analyze7-3.0 {
75: execsql {ANALYZE t1cd;}
76: db cache flush;
77: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;}
78: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
79: do_test analyze7-3.1 {
80: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
81: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
82: do_test analyze7-3.2.1 {
83: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=?;}
84: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~86 rows)}}
85: ifcapable stat3 {
86: # If ENABLE_STAT3 is defined, SQLite comes up with a different estimated
87: # row count for (c=2) than it does for (c=?).
88: do_test analyze7-3.2.2 {
89: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
90: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~57 rows)}}
91: } else {
92: # If ENABLE_STAT3 is not defined, the expected row count for (c=2) is the
93: # same as that for (c=?).
94: do_test analyze7-3.2.3 {
95: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
96: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~86 rows)}}
97: }
98: do_test analyze7-3.3 {
99: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123}
100: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
101: ifcapable {!stat3} {
102: do_test analyze7-3.4 {
103: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND b=123}
104: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~2 rows)}}
105: do_test analyze7-3.5 {
106: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND c=123}
107: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
108: }
109: do_test analyze7-3.6 {
110: execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND d=123 AND b=123}
111: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=? AND d=?) (~1 rows)}}
112:
113: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>