Annotation of embedaddon/sqlite3/test/analyze.test, revision 1.1
1.1 ! misho 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.9 2008/08/11 18:44:58 drh Exp $
! 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} {
! 22: finish_test
! 23: return
! 24: }
! 25:
! 26: # Basic sanity checks.
! 27: #
! 28: do_test analyze-1.1 {
! 29: catchsql {
! 30: ANALYZE no_such_table
! 31: }
! 32: } {1 {no such table: no_such_table}}
! 33: do_test analyze-1.2 {
! 34: execsql {
! 35: SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
! 36: }
! 37: } {0}
! 38: do_test analyze-1.3 {
! 39: catchsql {
! 40: ANALYZE no_such_db.no_such_table
! 41: }
! 42: } {1 {unknown database no_such_db}}
! 43: do_test analyze-1.4 {
! 44: execsql {
! 45: SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
! 46: }
! 47: } {0}
! 48: do_test analyze-1.5.1 {
! 49: catchsql {
! 50: ANALYZE
! 51: }
! 52: } {0 {}}
! 53: do_test analyze-1.5.2 {
! 54: catchsql {
! 55: PRAGMA empty_result_callbacks=1;
! 56: ANALYZE
! 57: }
! 58: } {0 {}}
! 59: do_test analyze-1.6 {
! 60: execsql {
! 61: SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
! 62: }
! 63: } {1}
! 64: do_test analyze-1.6.2 {
! 65: catchsql {
! 66: CREATE INDEX stat1idx ON sqlite_stat1(idx);
! 67: }
! 68: } {1 {table sqlite_stat1 may not be indexed}}
! 69: do_test analyze-1.6.3 {
! 70: catchsql {
! 71: CREATE INDEX main.stat1idx ON SQLite_stat1(idx);
! 72: }
! 73: } {1 {table sqlite_stat1 may not be indexed}}
! 74: do_test analyze-1.7 {
! 75: execsql {
! 76: SELECT * FROM sqlite_stat1 WHERE idx NOT NULL
! 77: }
! 78: } {}
! 79: do_test analyze-1.8 {
! 80: catchsql {
! 81: ANALYZE main
! 82: }
! 83: } {0 {}}
! 84: do_test analyze-1.9 {
! 85: execsql {
! 86: SELECT * FROM sqlite_stat1 WHERE idx NOT NULL
! 87: }
! 88: } {}
! 89: do_test analyze-1.10 {
! 90: catchsql {
! 91: CREATE TABLE t1(a,b);
! 92: ANALYZE main.t1;
! 93: }
! 94: } {0 {}}
! 95: do_test analyze-1.11 {
! 96: execsql {
! 97: SELECT * FROM sqlite_stat1
! 98: }
! 99: } {}
! 100: do_test analyze-1.12 {
! 101: catchsql {
! 102: ANALYZE t1;
! 103: }
! 104: } {0 {}}
! 105: do_test analyze-1.13 {
! 106: execsql {
! 107: SELECT * FROM sqlite_stat1
! 108: }
! 109: } {}
! 110:
! 111: # Create some indices that can be analyzed. But do not yet add
! 112: # data. Without data in the tables, no analysis is done.
! 113: #
! 114: do_test analyze-2.1 {
! 115: execsql {
! 116: CREATE INDEX t1i1 ON t1(a);
! 117: ANALYZE main.t1;
! 118: SELECT * FROM sqlite_stat1 ORDER BY idx;
! 119: }
! 120: } {}
! 121: do_test analyze-2.2 {
! 122: execsql {
! 123: CREATE INDEX t1i2 ON t1(b);
! 124: ANALYZE t1;
! 125: SELECT * FROM sqlite_stat1 ORDER BY idx;
! 126: }
! 127: } {}
! 128: do_test analyze-2.3 {
! 129: execsql {
! 130: CREATE INDEX t1i3 ON t1(a,b);
! 131: ANALYZE main;
! 132: SELECT * FROM sqlite_stat1 ORDER BY idx;
! 133: }
! 134: } {}
! 135:
! 136: # Start adding data to the table. Verify that the analysis
! 137: # is done correctly.
! 138: #
! 139: do_test analyze-3.1 {
! 140: execsql {
! 141: INSERT INTO t1 VALUES(1,2);
! 142: INSERT INTO t1 VALUES(1,3);
! 143: ANALYZE main.t1;
! 144: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 145: }
! 146: } {t1i1 {2 2} t1i2 {2 1} t1i3 {2 2 1}}
! 147: do_test analyze-3.2 {
! 148: execsql {
! 149: INSERT INTO t1 VALUES(1,4);
! 150: INSERT INTO t1 VALUES(1,5);
! 151: ANALYZE t1;
! 152: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 153: }
! 154: } {t1i1 {4 4} t1i2 {4 1} t1i3 {4 4 1}}
! 155: do_test analyze-3.3 {
! 156: execsql {
! 157: INSERT INTO t1 VALUES(2,5);
! 158: ANALYZE main;
! 159: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 160: }
! 161: } {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1}}
! 162: do_test analyze-3.4 {
! 163: execsql {
! 164: CREATE TABLE t2 AS SELECT * FROM t1;
! 165: CREATE INDEX t2i1 ON t2(a);
! 166: CREATE INDEX t2i2 ON t2(b);
! 167: CREATE INDEX t2i3 ON t2(a,b);
! 168: ANALYZE;
! 169: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 170: }
! 171: } {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2} t2i3 {5 3 1}}
! 172: do_test analyze-3.5 {
! 173: execsql {
! 174: DROP INDEX t2i3;
! 175: ANALYZE t1;
! 176: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 177: }
! 178: } {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2}}
! 179: do_test analyze-3.6 {
! 180: execsql {
! 181: ANALYZE t2;
! 182: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 183: }
! 184: } {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2}}
! 185: do_test analyze-3.7 {
! 186: execsql {
! 187: DROP INDEX t2i2;
! 188: ANALYZE t2;
! 189: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 190: }
! 191: } {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3}}
! 192: do_test analyze-3.8 {
! 193: execsql {
! 194: CREATE TABLE t3 AS SELECT a, b, rowid AS c, 'hi' AS d FROM t1;
! 195: CREATE INDEX t3i1 ON t3(a);
! 196: CREATE INDEX t3i2 ON t3(a,b,c,d);
! 197: CREATE INDEX t3i3 ON t3(d,b,c,a);
! 198: DROP TABLE t1;
! 199: DROP TABLE t2;
! 200: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 201: }
! 202: } {}
! 203: do_test analyze-3.9 {
! 204: execsql {
! 205: ANALYZE;
! 206: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 207: }
! 208: } {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
! 209:
! 210: do_test analyze-3.10 {
! 211: execsql {
! 212: CREATE TABLE [silly " name](a, b, c);
! 213: CREATE INDEX 'foolish '' name' ON [silly " name](a, b);
! 214: CREATE INDEX 'another foolish '' name' ON [silly " name](c);
! 215: INSERT INTO [silly " name] VALUES(1, 2, 3);
! 216: INSERT INTO [silly " name] VALUES(4, 5, 6);
! 217: ANALYZE;
! 218: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 219: }
! 220: } {{another foolish ' name} {2 1} {foolish ' name} {2 1 1} t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
! 221: do_test analyze-3.11 {
! 222: execsql {
! 223: DROP INDEX "foolish ' name";
! 224: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 225: }
! 226: } {{another foolish ' name} {2 1} t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
! 227: do_test analyze-3.11 {
! 228: execsql {
! 229: DROP TABLE "silly "" name";
! 230: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 231: }
! 232: } {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
! 233:
! 234: # Try corrupting the sqlite_stat1 table and make sure the
! 235: # database is still able to function.
! 236: #
! 237: do_test analyze-4.0 {
! 238: sqlite3 db2 test.db
! 239: db2 eval {
! 240: CREATE TABLE t4(x,y,z);
! 241: CREATE INDEX t4i1 ON t4(x);
! 242: CREATE INDEX t4i2 ON t4(y);
! 243: INSERT INTO t4 SELECT a,b,c FROM t3;
! 244: }
! 245: db2 close
! 246: db close
! 247: sqlite3 db test.db
! 248: execsql {
! 249: ANALYZE;
! 250: SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
! 251: }
! 252: } {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1} t4i1 {5 3} t4i2 {5 2}}
! 253: do_test analyze-4.1 {
! 254: execsql {
! 255: PRAGMA writable_schema=on;
! 256: INSERT INTO sqlite_stat1 VALUES(null,null,null);
! 257: PRAGMA writable_schema=off;
! 258: }
! 259: db close
! 260: sqlite3 db test.db
! 261: execsql {
! 262: SELECT * FROM t4 WHERE x=1234;
! 263: }
! 264: } {}
! 265: do_test analyze-4.2 {
! 266: execsql {
! 267: PRAGMA writable_schema=on;
! 268: DELETE FROM sqlite_stat1;
! 269: INSERT INTO sqlite_stat1 VALUES('t4','t4i1','nonsense');
! 270: INSERT INTO sqlite_stat1 VALUES('t4','t4i2','120897349817238741092873198273409187234918720394817209384710928374109827172901827349871928741910');
! 271: PRAGMA writable_schema=off;
! 272: }
! 273: db close
! 274: sqlite3 db test.db
! 275: execsql {
! 276: SELECT * FROM t4 WHERE x=1234;
! 277: }
! 278: } {}
! 279: do_test analyze-4.3 {
! 280: execsql {
! 281: INSERT INTO sqlite_stat1 VALUES('t4','xyzzy','0 1 2 3');
! 282: }
! 283: db close
! 284: sqlite3 db test.db
! 285: execsql {
! 286: SELECT * FROM t4 WHERE x=1234;
! 287: }
! 288: } {}
! 289:
! 290: # Verify that DROP TABLE and DROP INDEX remove entries from the
! 291: # sqlite_stat1 and sqlite_stat3 tables.
! 292: #
! 293: do_test analyze-5.0 {
! 294: execsql {
! 295: DELETE FROM t3;
! 296: DELETE FROM t4;
! 297: INSERT INTO t3 VALUES(1,2,3,4);
! 298: INSERT INTO t3 VALUES(5,6,7,8);
! 299: INSERT INTO t3 SELECT a+8, b+8, c+8, d+8 FROM t3;
! 300: INSERT INTO t3 SELECT a+16, b+16, c+16, d+16 FROM t3;
! 301: INSERT INTO t3 SELECT a+32, b+32, c+32, d+32 FROM t3;
! 302: INSERT INTO t3 SELECT a+64, b+64, c+64, d+64 FROM t3;
! 303: INSERT INTO t4 SELECT a, b, c FROM t3;
! 304: ANALYZE;
! 305: SELECT DISTINCT idx FROM sqlite_stat1 ORDER BY 1;
! 306: SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
! 307: }
! 308: } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4}
! 309: ifcapable stat3 {
! 310: do_test analyze-5.1 {
! 311: execsql {
! 312: SELECT DISTINCT idx FROM sqlite_stat3 ORDER BY 1;
! 313: SELECT DISTINCT tbl FROM sqlite_stat3 ORDER BY 1;
! 314: }
! 315: } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4}
! 316: }
! 317: do_test analyze-5.2 {
! 318: execsql {
! 319: DROP INDEX t3i2;
! 320: SELECT DISTINCT idx FROM sqlite_stat1 ORDER BY 1;
! 321: SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
! 322: }
! 323: } {t3i1 t3i3 t4i1 t4i2 t3 t4}
! 324: ifcapable stat3 {
! 325: do_test analyze-5.3 {
! 326: execsql {
! 327: SELECT DISTINCT idx FROM sqlite_stat3 ORDER BY 1;
! 328: SELECT DISTINCT tbl FROM sqlite_stat3 ORDER BY 1;
! 329: }
! 330: } {t3i1 t3i3 t4i1 t4i2 t3 t4}
! 331: }
! 332: do_test analyze-5.4 {
! 333: execsql {
! 334: DROP TABLE t3;
! 335: SELECT DISTINCT idx FROM sqlite_stat1 ORDER BY 1;
! 336: SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
! 337: }
! 338: } {t4i1 t4i2 t4}
! 339: ifcapable stat3 {
! 340: do_test analyze-5.5 {
! 341: execsql {
! 342: SELECT DISTINCT idx FROM sqlite_stat3 ORDER BY 1;
! 343: SELECT DISTINCT tbl FROM sqlite_stat3 ORDER BY 1;
! 344: }
! 345: } {t4i1 t4i2 t4}
! 346: }
! 347:
! 348: # This test corrupts the database file so it must be the last test
! 349: # in the series.
! 350: #
! 351: do_test analyze-99.1 {
! 352: execsql {
! 353: PRAGMA writable_schema=on;
! 354: UPDATE sqlite_master SET sql='nonsense' WHERE name='sqlite_stat1';
! 355: }
! 356: db close
! 357: catch { sqlite3 db test.db }
! 358: catchsql {
! 359: ANALYZE
! 360: }
! 361: } {1 {malformed database schema (sqlite_stat1) - near "nonsense": syntax error}}
! 362:
! 363:
! 364: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>