xref: /sqlite-3.40.0/test/analyze.test (revision 4dcbdbff)
1# 2005 July 22
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.
13#
14# $Id: analyze.test,v 1.2 2005/07/23 14:52:12 drh Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# There is nothing to test if ANALYZE is disable for this build.
20#
21ifcapable {!analyze} {
22  finish_test
23  return
24}
25
26# Basic sanity checks.
27#
28do_test analyze-1.1 {
29  catchsql {
30    ANALYZE no_such_table
31  }
32} {1 {no such table: no_such_table}}
33do_test analyze-1.2 {
34  execsql {
35    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
36  }
37} {0}
38do_test analyze-1.3 {
39  catchsql {
40    ANALYZE no_such_db.no_such_table
41  }
42} {1 {unknown database no_such_db}}
43do_test analyze-1.4 {
44  execsql {
45    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
46  }
47} {0}
48do_test analyze-1.5 {
49  catchsql {
50    ANALYZE
51  }
52} {0 {}}
53do_test analyze-1.6 {
54  execsql {
55    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
56  }
57} {1}
58do_test analyze-1.7 {
59  execsql {
60    SELECT * FROM sqlite_stat1
61  }
62} {}
63do_test analyze-1.8 {
64  catchsql {
65    ANALYZE main
66  }
67} {0 {}}
68do_test analyze-1.9 {
69  execsql {
70    SELECT * FROM sqlite_stat1
71  }
72} {}
73do_test analyze-1.10 {
74  catchsql {
75    CREATE TABLE t1(a,b);
76    ANALYZE main.t1;
77  }
78} {0 {}}
79do_test analyze-1.11 {
80  execsql {
81    SELECT * FROM sqlite_stat1
82  }
83} {}
84do_test analyze-1.12 {
85  catchsql {
86    ANALYZE t1;
87  }
88} {0 {}}
89do_test analyze-1.13 {
90  execsql {
91    SELECT * FROM sqlite_stat1
92  }
93} {}
94
95# Create some indices that can be analyzed.  But do not yet add
96# data.  Without data in the tables, no analysis is done.
97#
98do_test analyze-2.1 {
99  execsql {
100    CREATE INDEX t1i1 ON t1(a);
101    ANALYZE main.t1;
102    SELECT * FROM sqlite_stat1 ORDER BY idx;
103  }
104} {}
105do_test analyze-2.2 {
106  execsql {
107    CREATE INDEX t1i2 ON t1(b);
108    ANALYZE t1;
109    SELECT * FROM sqlite_stat1 ORDER BY idx;
110  }
111} {}
112do_test analyze-2.3 {
113  execsql {
114    CREATE INDEX t1i3 ON t1(a,b);
115    ANALYZE main;
116    SELECT * FROM sqlite_stat1 ORDER BY idx;
117  }
118} {}
119
120# Start adding data to the table.  Verify that the analysis
121# is done correctly.
122#
123do_test analyze-3.1 {
124  execsql {
125    INSERT INTO t1 VALUES(1,2);
126    INSERT INTO t1 VALUES(1,3);
127    ANALYZE main.t1;
128    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
129  }
130} {t1i1 {2 2} t1i2 {2 1} t1i3 {2 2 1}}
131do_test analyze-3.2 {
132  execsql {
133    INSERT INTO t1 VALUES(1,4);
134    INSERT INTO t1 VALUES(1,5);
135    ANALYZE t1;
136    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
137  }
138} {t1i1 {4 4} t1i2 {4 1} t1i3 {4 4 1}}
139do_test analyze-3.3 {
140  execsql {
141    INSERT INTO t1 VALUES(2,5);
142    ANALYZE main;
143    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
144  }
145} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1}}
146do_test analyze-3.4 {
147  execsql {
148    CREATE TABLE t2 AS SELECT * FROM t1;
149    CREATE INDEX t2i1 ON t2(a);
150    CREATE INDEX t2i2 ON t2(b);
151    CREATE INDEX t2i3 ON t2(a,b);
152    ANALYZE;
153    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
154  }
155} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2} t2i3 {5 3 1}}
156do_test analyze-3.5 {
157  execsql {
158    DROP INDEX t2i3;
159    ANALYZE t1;
160    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
161  }
162} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2} t2i3 {5 3 1}}
163do_test analyze-3.6 {
164  execsql {
165    ANALYZE t2;
166    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
167  }
168} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2}}
169do_test analyze-3.7 {
170  execsql {
171    DROP INDEX t2i2;
172    ANALYZE t2;
173    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
174  }
175} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1}}
176do_test analyze-3.8 {
177  execsql {
178    CREATE TABLE t3 AS SELECT a, b, rowid AS c, 'hi' AS d FROM t1;
179    CREATE INDEX t3i1 ON t3(a);
180    CREATE INDEX t3i2 ON t3(a,b,c,d);
181    CREATE INDEX t3i3 ON t3(d,b,c,a);
182    DROP TABLE t1;
183    DROP TABLE t2;
184    ANALYZE;
185    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
186  }
187} {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
188
189
190finish_test
191