os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/analyze.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200 (2012-06-15)
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
# 2005 July 22
sl@0
     2
#
sl@0
     3
# The author disclaims copyright to this source code.  In place of
sl@0
     4
# a legal notice, here is a blessing:
sl@0
     5
#
sl@0
     6
#    May you do good and not evil.
sl@0
     7
#    May you find forgiveness for yourself and forgive others.
sl@0
     8
#    May you share freely, never taking more than you give.
sl@0
     9
#
sl@0
    10
#***********************************************************************
sl@0
    11
# This file implements regression tests for SQLite library.
sl@0
    12
# This file implements tests for the ANALYZE command.
sl@0
    13
#
sl@0
    14
# $Id: analyze.test,v 1.9 2008/08/11 18:44:58 drh Exp $
sl@0
    15
sl@0
    16
set testdir [file dirname $argv0]
sl@0
    17
source $testdir/tester.tcl
sl@0
    18
sl@0
    19
# There is nothing to test if ANALYZE is disable for this build.
sl@0
    20
#
sl@0
    21
ifcapable {!analyze} {
sl@0
    22
  finish_test
sl@0
    23
  return
sl@0
    24
}
sl@0
    25
sl@0
    26
# Basic sanity checks.
sl@0
    27
#
sl@0
    28
do_test analyze-1.1 {
sl@0
    29
  catchsql {
sl@0
    30
    ANALYZE no_such_table
sl@0
    31
  }
sl@0
    32
} {1 {no such table: no_such_table}}
sl@0
    33
do_test analyze-1.2 {
sl@0
    34
  execsql {
sl@0
    35
    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
sl@0
    36
  }
sl@0
    37
} {0}
sl@0
    38
do_test analyze-1.3 {
sl@0
    39
  catchsql {
sl@0
    40
    ANALYZE no_such_db.no_such_table
sl@0
    41
  }
sl@0
    42
} {1 {unknown database no_such_db}}
sl@0
    43
do_test analyze-1.4 {
sl@0
    44
  execsql {
sl@0
    45
    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
sl@0
    46
  }
sl@0
    47
} {0}
sl@0
    48
do_test analyze-1.5.1 {
sl@0
    49
  catchsql {
sl@0
    50
    ANALYZE
sl@0
    51
  }
sl@0
    52
} {0 {}}
sl@0
    53
do_test analyze-1.5.2 {
sl@0
    54
  catchsql {
sl@0
    55
    PRAGMA empty_result_callbacks=1;
sl@0
    56
    ANALYZE
sl@0
    57
  }
sl@0
    58
} {0 {}}
sl@0
    59
do_test analyze-1.6 {
sl@0
    60
  execsql {
sl@0
    61
    SELECT count(*) FROM sqlite_master WHERE name='sqlite_stat1'
sl@0
    62
  }
sl@0
    63
} {1}
sl@0
    64
do_test analyze-1.6.2 {
sl@0
    65
  catchsql {
sl@0
    66
    CREATE INDEX stat1idx ON sqlite_stat1(idx);
sl@0
    67
  }
sl@0
    68
} {1 {table sqlite_stat1 may not be indexed}}
sl@0
    69
do_test analyze-1.6.3 {
sl@0
    70
  catchsql {
sl@0
    71
    CREATE INDEX main.stat1idx ON SQLite_stat1(idx);
sl@0
    72
  }
sl@0
    73
} {1 {table sqlite_stat1 may not be indexed}}
sl@0
    74
do_test analyze-1.7 {
sl@0
    75
  execsql {
sl@0
    76
    SELECT * FROM sqlite_stat1
sl@0
    77
  }
sl@0
    78
} {}
sl@0
    79
do_test analyze-1.8 {
sl@0
    80
  catchsql {
sl@0
    81
    ANALYZE main
sl@0
    82
  }
sl@0
    83
} {0 {}}
sl@0
    84
do_test analyze-1.9 {
sl@0
    85
  execsql {
sl@0
    86
    SELECT * FROM sqlite_stat1
sl@0
    87
  }
sl@0
    88
} {}
sl@0
    89
do_test analyze-1.10 {
sl@0
    90
  catchsql {
sl@0
    91
    CREATE TABLE t1(a,b);
sl@0
    92
    ANALYZE main.t1;
sl@0
    93
  }
sl@0
    94
} {0 {}}
sl@0
    95
do_test analyze-1.11 {
sl@0
    96
  execsql {
sl@0
    97
    SELECT * FROM sqlite_stat1
sl@0
    98
  }
sl@0
    99
} {}
sl@0
   100
do_test analyze-1.12 {
sl@0
   101
  catchsql {
sl@0
   102
    ANALYZE t1;
sl@0
   103
  }
sl@0
   104
} {0 {}}
sl@0
   105
do_test analyze-1.13 {
sl@0
   106
  execsql {
sl@0
   107
    SELECT * FROM sqlite_stat1
sl@0
   108
  }
sl@0
   109
} {}
sl@0
   110
sl@0
   111
# Create some indices that can be analyzed.  But do not yet add
sl@0
   112
# data.  Without data in the tables, no analysis is done.
sl@0
   113
#
sl@0
   114
do_test analyze-2.1 {
sl@0
   115
  execsql {
sl@0
   116
    CREATE INDEX t1i1 ON t1(a);
sl@0
   117
    ANALYZE main.t1;
sl@0
   118
    SELECT * FROM sqlite_stat1 ORDER BY idx;
sl@0
   119
  }
sl@0
   120
} {}
sl@0
   121
do_test analyze-2.2 {
sl@0
   122
  execsql {
sl@0
   123
    CREATE INDEX t1i2 ON t1(b);
sl@0
   124
    ANALYZE t1;
sl@0
   125
    SELECT * FROM sqlite_stat1 ORDER BY idx;
sl@0
   126
  }
sl@0
   127
} {}
sl@0
   128
do_test analyze-2.3 {
sl@0
   129
  execsql {
sl@0
   130
    CREATE INDEX t1i3 ON t1(a,b);
sl@0
   131
    ANALYZE main;
sl@0
   132
    SELECT * FROM sqlite_stat1 ORDER BY idx;
sl@0
   133
  }
sl@0
   134
} {}
sl@0
   135
sl@0
   136
# Start adding data to the table.  Verify that the analysis
sl@0
   137
# is done correctly.
sl@0
   138
#
sl@0
   139
do_test analyze-3.1 {
sl@0
   140
  execsql {
sl@0
   141
    INSERT INTO t1 VALUES(1,2);
sl@0
   142
    INSERT INTO t1 VALUES(1,3);
sl@0
   143
    ANALYZE main.t1;
sl@0
   144
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   145
  }
sl@0
   146
} {t1i1 {2 2} t1i2 {2 1} t1i3 {2 2 1}}
sl@0
   147
do_test analyze-3.2 {
sl@0
   148
  execsql {
sl@0
   149
    INSERT INTO t1 VALUES(1,4);
sl@0
   150
    INSERT INTO t1 VALUES(1,5);
sl@0
   151
    ANALYZE t1;
sl@0
   152
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   153
  }
sl@0
   154
} {t1i1 {4 4} t1i2 {4 1} t1i3 {4 4 1}}
sl@0
   155
do_test analyze-3.3 {
sl@0
   156
  execsql {
sl@0
   157
    INSERT INTO t1 VALUES(2,5);
sl@0
   158
    ANALYZE main;
sl@0
   159
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   160
  }
sl@0
   161
} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1}}
sl@0
   162
do_test analyze-3.4 {
sl@0
   163
  execsql {
sl@0
   164
    CREATE TABLE t2 AS SELECT * FROM t1;
sl@0
   165
    CREATE INDEX t2i1 ON t2(a);
sl@0
   166
    CREATE INDEX t2i2 ON t2(b);
sl@0
   167
    CREATE INDEX t2i3 ON t2(a,b);
sl@0
   168
    ANALYZE;
sl@0
   169
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   170
  }
sl@0
   171
} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2} t2i3 {5 3 1}}
sl@0
   172
do_test analyze-3.5 {
sl@0
   173
  execsql {
sl@0
   174
    DROP INDEX t2i3;
sl@0
   175
    ANALYZE t1;
sl@0
   176
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   177
  }
sl@0
   178
} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2}}
sl@0
   179
do_test analyze-3.6 {
sl@0
   180
  execsql {
sl@0
   181
    ANALYZE t2;
sl@0
   182
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   183
  }
sl@0
   184
} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3} t2i2 {5 2}}
sl@0
   185
do_test analyze-3.7 {
sl@0
   186
  execsql {
sl@0
   187
    DROP INDEX t2i2;
sl@0
   188
    ANALYZE t2;
sl@0
   189
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   190
  }
sl@0
   191
} {t1i1 {5 3} t1i2 {5 2} t1i3 {5 3 1} t2i1 {5 3}}
sl@0
   192
do_test analyze-3.8 {
sl@0
   193
  execsql {
sl@0
   194
    CREATE TABLE t3 AS SELECT a, b, rowid AS c, 'hi' AS d FROM t1;
sl@0
   195
    CREATE INDEX t3i1 ON t3(a);
sl@0
   196
    CREATE INDEX t3i2 ON t3(a,b,c,d);
sl@0
   197
    CREATE INDEX t3i3 ON t3(d,b,c,a);
sl@0
   198
    DROP TABLE t1;
sl@0
   199
    DROP TABLE t2;
sl@0
   200
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   201
  }
sl@0
   202
} {}
sl@0
   203
do_test analyze-3.9 {
sl@0
   204
  execsql {
sl@0
   205
    ANALYZE;
sl@0
   206
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   207
  }
sl@0
   208
} {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
sl@0
   209
sl@0
   210
do_test analyze-3.10 {
sl@0
   211
  execsql {
sl@0
   212
    CREATE TABLE [silly " name](a, b, c);
sl@0
   213
    CREATE INDEX 'foolish '' name' ON [silly " name](a, b);
sl@0
   214
    CREATE INDEX 'another foolish '' name' ON [silly " name](c);
sl@0
   215
    INSERT INTO [silly " name] VALUES(1, 2, 3);
sl@0
   216
    INSERT INTO [silly " name] VALUES(4, 5, 6);
sl@0
   217
    ANALYZE;
sl@0
   218
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   219
  }
sl@0
   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}}
sl@0
   221
do_test analyze-3.11 {
sl@0
   222
  execsql {
sl@0
   223
    DROP INDEX "foolish ' name";
sl@0
   224
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   225
  }
sl@0
   226
} {{another foolish ' name} {2 1} t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
sl@0
   227
do_test analyze-3.11 {
sl@0
   228
  execsql {
sl@0
   229
    DROP TABLE "silly "" name";
sl@0
   230
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   231
  }
sl@0
   232
} {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1}}
sl@0
   233
sl@0
   234
# Try corrupting the sqlite_stat1 table and make sure the
sl@0
   235
# database is still able to function.
sl@0
   236
#
sl@0
   237
do_test analyze-4.0 {
sl@0
   238
  sqlite3 db2 test.db
sl@0
   239
  db2 eval {
sl@0
   240
    CREATE TABLE t4(x,y,z);
sl@0
   241
    CREATE INDEX t4i1 ON t4(x);
sl@0
   242
    CREATE INDEX t4i2 ON t4(y);
sl@0
   243
    INSERT INTO t4 SELECT a,b,c FROM t3;
sl@0
   244
  }
sl@0
   245
  db2 close
sl@0
   246
  db close
sl@0
   247
  sqlite3 db test.db
sl@0
   248
  execsql {
sl@0
   249
    ANALYZE;
sl@0
   250
    SELECT idx, stat FROM sqlite_stat1 ORDER BY idx;
sl@0
   251
  }
sl@0
   252
} {t3i1 {5 3} t3i2 {5 3 1 1 1} t3i3 {5 5 2 1 1} t4i1 {5 3} t4i2 {5 2}}
sl@0
   253
do_test analyze-4.1 {
sl@0
   254
  execsql {
sl@0
   255
    PRAGMA writable_schema=on;
sl@0
   256
    INSERT INTO sqlite_stat1 VALUES(null,null,null);
sl@0
   257
    PRAGMA writable_schema=off;
sl@0
   258
  }
sl@0
   259
  db close
sl@0
   260
  sqlite3 db test.db
sl@0
   261
  execsql {
sl@0
   262
    SELECT * FROM t4 WHERE x=1234;
sl@0
   263
  }
sl@0
   264
} {}
sl@0
   265
do_test analyze-4.2 {
sl@0
   266
  execsql {
sl@0
   267
    PRAGMA writable_schema=on;
sl@0
   268
    DELETE FROM sqlite_stat1;
sl@0
   269
    INSERT INTO sqlite_stat1 VALUES('t4','t4i1','nonsense');
sl@0
   270
    INSERT INTO sqlite_stat1 VALUES('t4','t4i2','120897349817238741092873198273409187234918720394817209384710928374109827172901827349871928741910');
sl@0
   271
    PRAGMA writable_schema=off;
sl@0
   272
  }
sl@0
   273
  db close
sl@0
   274
  sqlite3 db test.db
sl@0
   275
  execsql {
sl@0
   276
    SELECT * FROM t4 WHERE x=1234;
sl@0
   277
  }
sl@0
   278
} {}
sl@0
   279
do_test analyze-4.3 {
sl@0
   280
  execsql {
sl@0
   281
    INSERT INTO sqlite_stat1 VALUES('t4','xyzzy','0 1 2 3');
sl@0
   282
  }
sl@0
   283
  db close
sl@0
   284
  sqlite3 db test.db
sl@0
   285
  execsql {
sl@0
   286
    SELECT * FROM t4 WHERE x=1234;
sl@0
   287
  }
sl@0
   288
} {}
sl@0
   289
sl@0
   290
# This test corrupts the database file so it must be the last test
sl@0
   291
# in the series.
sl@0
   292
#
sl@0
   293
do_test analyze-99.1 {
sl@0
   294
  execsql {
sl@0
   295
    PRAGMA writable_schema=on;
sl@0
   296
    UPDATE sqlite_master SET sql='nonsense' WHERE name='sqlite_stat1';
sl@0
   297
  }
sl@0
   298
  db close
sl@0
   299
  sqlite3 db test.db
sl@0
   300
  catchsql {
sl@0
   301
    ANALYZE
sl@0
   302
  }
sl@0
   303
} {1 {malformed database schema (sqlite_stat1) - near "nonsense": syntax error}}
sl@0
   304
sl@0
   305
sl@0
   306
finish_test