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