xref: /sqlite-3.40.0/test/incrcorrupt.test (revision a23bc8a3)
1# 2001 October 12
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# Test that "PRAGMA incremental_vacuum" detects and reports database
12# corruption properly. And that "PRAGMA auto_vacuum = INCREMENTAL"
13# does as well.
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18set testprefix incrcorrupt
19
20# If this build of the library does not support auto-vacuum, omit this
21# whole file.
22ifcapable {!autovacuum} {
23  finish_test
24  return
25}
26
27do_execsql_test 1.0 {
28  PRAGMA auto_vacuum = 2;
29  CREATE TABLE t1(a PRIMARY KEY, b);
30
31  WITH data(i) AS (
32    SELECT 1 UNION ALL SELECT i+1 FROM data
33  )
34  INSERT INTO t1 SELECT i, randomblob(600) FROM data LIMIT 20;
35  PRAGMA page_count;
36} {24}
37
38do_execsql_test 1.1 {
39  PRAGMA incremental_vacuum;
40} {}
41
42do_test 1.2 {
43  db_save
44  hexio_write test.db 36 00000019
45  catchsql { PRAGMA incremental_vacuum; }
46} {1 {database disk image is malformed}}
47
48do_test 1.3 {
49  set stmt [sqlite3_prepare_v2 db "PRAGMA incremental_vacuum" -1 dummy]
50  sqlite3_step $stmt
51} {SQLITE_CORRUPT}
52do_test 1.4 { sqlite3_errcode db } {SQLITE_CORRUPT}
53do_test 1.5 { sqlite3_errmsg db } {database disk image is malformed}
54do_test 1.6 { sqlite3_finalize $stmt } {SQLITE_CORRUPT}
55do_test 1.7 { sqlite3_errcode db } {SQLITE_CORRUPT}
56do_test 1.8 { sqlite3_errmsg db } {database disk image is malformed}
57
58do_test 1.9 {
59  set stmt [sqlite3_prepare_v2 db "PRAGMA incremental_vacuum" -1 dummy]
60  sqlite3_step $stmt
61} {SQLITE_CORRUPT}
62do_test 1.10 { sqlite3_errcode db } {SQLITE_CORRUPT}
63do_test 1.11 { sqlite3_errmsg db } {database disk image is malformed}
64
65do_test 1.12 {
66  set stmt2 [sqlite3_prepare_v2 db "SELECT 1" -1 dummy]
67  sqlite3_finalize $stmt2
68} {SQLITE_OK}
69do_test 1.13 { sqlite3_errcode db } {SQLITE_OK}
70do_test 1.14 { sqlite3_errmsg db } {not an error}
71
72do_test 1.15 { sqlite3_finalize $stmt } {SQLITE_CORRUPT}
73do_test 1.16 { sqlite3_errcode db } {SQLITE_CORRUPT}
74do_test 1.17 { sqlite3_errmsg db } {database disk image is malformed}
75
76#-------------------------------------------------------------------------
77#
78reset_db
79
80do_execsql_test 2.1 {
81  PRAGMA auto_vacuum = 1;
82  CREATE TABLE t1(a PRIMARY KEY, b);
83  WITH data(i) AS (
84    SELECT 1 UNION ALL SELECT i+1 FROM data
85  )
86  INSERT INTO t1 SELECT i, randomblob(600) FROM data LIMIT 20;
87  PRAGMA page_count;
88} {24}
89
90do_test 2.2 {
91  db_save
92  set fd [open test.db r+]
93  chan truncate $fd [expr 22*1024]
94  close $fd
95  catchsql { PRAGMA incremental_vacuum; }
96} {1 {database disk image is malformed}}
97
98do_test 2.3 {
99  set stmt [sqlite3_prepare_v2 db "PRAGMA auto_vacuum = INCREMENTAL" -1 dummy]
100  sqlite3_step $stmt
101} {SQLITE_CORRUPT}
102do_test 2.4 { sqlite3_errcode db } {SQLITE_CORRUPT}
103do_test 2.5 { sqlite3_errmsg db } {database disk image is malformed}
104do_test 2.6 { sqlite3_finalize $stmt } {SQLITE_CORRUPT}
105do_test 2.7 { sqlite3_errcode db } {SQLITE_CORRUPT}
106do_test 2.8 { sqlite3_errmsg db } {database disk image is malformed}
107
108do_test 2.9 {
109  set stmt [sqlite3_prepare_v2 db "PRAGMA auto_vacuum = INCREMENTAL" -1 dummy]
110  sqlite3_step $stmt
111} {SQLITE_CORRUPT}
112do_test 2.10 { sqlite3_errcode db } {SQLITE_CORRUPT}
113do_test 2.11 { sqlite3_errmsg db } {database disk image is malformed}
114
115do_test 2.12 {
116  set stmt2 [sqlite3_prepare_v2 db "SELECT 1" -1 dummy]
117  sqlite3_finalize $stmt2
118} {SQLITE_OK}
119do_test 2.13 { sqlite3_errcode db } {SQLITE_OK}
120do_test 2.14 { sqlite3_errmsg db } {not an error}
121
122do_test 2.15 { sqlite3_finalize $stmt } {SQLITE_CORRUPT}
123do_test 2.16 { sqlite3_errcode db } {SQLITE_CORRUPT}
124do_test 2.17 { sqlite3_errmsg db } {database disk image is malformed}
125
126finish_test
127