xref: /sqlite-3.40.0/test/corrupt6.test (revision af3906a7)
1# 2008 May 6
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#
13# This file implements tests to make sure SQLite does not crash or
14# segfault if it sees a corrupt database file.  It specifically focuses
15# on corrupt SerialTypeLen values.
16#
17# $Id: corrupt6.test,v 1.2 2008/05/19 15:37:10 shane Exp $
18
19set testdir [file dirname $argv0]
20source $testdir/tester.tcl
21
22# This module uses hard-coded offsets which do not work if the reserved_bytes
23# value is nonzero.
24if {[nonzero_reserved_bytes]} {finish_test; return;}
25
26# These tests deal with corrupt database files
27#
28database_may_be_corrupt
29
30# We must have the page_size pragma for these tests to work.
31#
32ifcapable !pager_pragmas {
33  finish_test
34  return
35}
36
37# Create a simple, small database.
38#
39do_test corrupt6-1.1 {
40  execsql {
41    PRAGMA auto_vacuum=OFF;
42    PRAGMA page_size=1024;
43    CREATE TABLE t1(x);
44    INSERT INTO t1(x) VALUES('varint32-01234567890123456789012345678901234567890123456789');
45    INSERT INTO t1(x) VALUES('varint32-01234567890123456789012345678901234567890123456789');
46  }
47  file size test.db
48} [expr {1024*2}]
49
50# Verify that the file format is as we expect.  The page size
51# should be 1024 bytes.
52#
53do_test corrupt6-1.2 {
54  hexio_get_int [hexio_read test.db 16 2]
55} 1024   ;# The page size is 1024
56do_test corrupt6-1.3 {
57  hexio_get_int [hexio_read test.db 20 1]
58} 0      ;# Unused bytes per page is 0
59
60integrity_check corrupt6-1.4
61
62# Verify SerialTypeLen for first field of two records as we expect.
63# SerialTypeLen = (len*2+12) = 60*2+12 = 132
64do_test corrupt6-1.5.1 {
65  hexio_read test.db 1923 2
66} 8103      ;# First text field size is 81 03 == 131
67do_test corrupt6-1.5.2 {
68  hexio_read test.db 1987 2
69} 8103      ;# Second text field size is 81 03 == 131
70
71# Verify simple query results as expected.
72do_test corrupt6-1.6 {
73  db close
74  sqlite3 db test.db
75  catchsql {
76    SELECT substr(x,1,8) FROM t1
77  }
78} [list 0 {varint32 varint32} ]
79integrity_check corrupt6-1.7
80
81# Adjust value of record 1 / field 1 SerialTypeLen and see if the
82# corruption is detected.
83# Increase SerialTypeLen by 2.
84do_test corrupt6-1.8.1 {
85  db close
86  hexio_write test.db 1923 8105
87  sqlite3 db test.db
88  catchsql {
89    SELECT substr(x,1,8) FROM t1
90  }
91} [list 1 {database disk image is malformed}]
92
93# Adjust value of record 1 / field 1 SerialTypeLen and see if the
94# corruption is detected.
95# Decrease SerialTypeLen by 2.
96do_test corrupt6-1.8.2 {
97  db close
98  hexio_write test.db 1923 8101
99  sqlite3 db test.db
100  catchsql {
101    SELECT substr(x,1,8) FROM t1
102  }
103} [list 1 {database disk image is malformed}]
104
105# Put value of record 1 / field 1 SerialTypeLen back.
106do_test corrupt6-1.8.3 {
107  db close
108  hexio_write test.db 1923 8103
109  sqlite3 db test.db
110  catchsql {
111    SELECT substr(x,1,8) FROM t1
112  }
113} [list 0 {varint32 varint32} ]
114integrity_check corrupt6-1.8.4
115
116# Adjust value of record 2 / field 1 SerialTypeLen and see if the
117# corruption is detected.
118# Increase SerialTypeLen by 2.
119do_test corrupt6-1.9.1 {
120  db close
121  hexio_write test.db 1987 8105
122  sqlite3 db test.db
123  catchsql {
124    SELECT substr(x,1,8) FROM t1
125  }
126} [list 1 {database disk image is malformed}]
127
128# Adjust value of record 2 / field 2 SerialTypeLen and see if the
129# corruption is detected.
130# Decrease SerialTypeLen by 2.
131do_test corrupt6-1.9.2 {
132  db close
133  hexio_write test.db 1987 8101
134  sqlite3 db test.db
135  catchsql {
136    SELECT substr(x,1,8) FROM t1
137  }
138} [list 1 {database disk image is malformed}]
139
140# Put value of record 1 / field 2 SerialTypeLen back.
141do_test corrupt6-1.9.3 {
142  db close
143  hexio_write test.db 1987 8103
144  sqlite3 db test.db
145  catchsql {
146    SELECT substr(x,1,8) FROM t1
147  }
148} [list 0 {varint32 varint32} ]
149integrity_check corrupt6-1.9.4
150
151# Adjust value of record 1 / field 1 SerialTypeLen and see if the
152# corruption is detected.
153# Set SerialTypeLen to FF 7F (2 bytes)
154do_test corrupt6-1.10.1 {
155  db close
156  hexio_write test.db 1923 FF7F
157  sqlite3 db test.db
158  catchsql {
159    SELECT substr(x,1,8) FROM t1
160  }
161} [list 1 {database disk image is malformed}]
162
163# Adjust value of record 1 / field 1 SerialTypeLen and see if the
164# corruption is detected.
165# Set SerialTypeLen to FF FF 7F (3 bytes)
166do_test corrupt6-1.10.2 {
167  db close
168  hexio_write test.db 1923 FFFF7F
169  sqlite3 db test.db
170  catchsql {
171    SELECT substr(x,1,8) FROM t1
172  }
173} [list 1 {database disk image is malformed}]
174
175# Adjust value of record 1 / field 1 SerialTypeLen and see if the
176# corruption is detected.
177# Set SerialTypeLen to FF FF FF 7F (4 bytes)
178do_test corrupt6-1.10.3 {
179  db close
180  hexio_write test.db 1923 FFFFFF7F
181  sqlite3 db test.db
182  catchsql {
183    SELECT substr(x,1,8) FROM t1
184  }
185} [list 1 {database disk image is malformed}]
186
187# Adjust value of record 1 / field 1 SerialTypeLen and see if the
188# corruption is detected.
189# Set SerialTypeLen to FF FF FF FF 7F (5 bytes)
190do_test corrupt6-1.10.4 {
191  db close
192  hexio_write test.db 1923 FFFFFFFF7F
193  sqlite3 db test.db
194  catchsql {
195    SELECT substr(x,1,8) FROM t1
196  }
197} [list 1 {database disk image is malformed}]
198
199# Adjust value of record 1 / field 1 SerialTypeLen and see if the
200# corruption is detected.
201# Set SerialTypeLen to FF FF FF FF FF 7F (6 bytes, and overflows).
202do_test corrupt6-1.10.5 {
203  db close
204  hexio_write test.db 1923 FFFFFFFFFF7F
205  sqlite3 db test.db
206  catchsql {
207    SELECT substr(x,1,8) FROM t1
208  }
209} [list 1 {database disk image is malformed}]
210
211# Adjust value of record 1 / field 1 SerialTypeLen and see if the
212# corruption is detected.
213# Set SerialTypeLen to FF FF FF FF FF FF 7F (7 bytes, and overflows).
214do_test corrupt6-1.10.6 {
215  db close
216  hexio_write test.db 1923 FFFFFFFFFFFF7F
217  sqlite3 db test.db
218  catchsql {
219    SELECT substr(x,1,8) FROM t1
220  }
221} [list 1 {database disk image is malformed}]
222
223# Adjust value of record 1 / field 1 SerialTypeLen and see if the
224# corruption is detected.
225# Set SerialTypeLen to FF FF FF FF FF FF FF 7F (8 bytes, and overflows).
226do_test corrupt6-1.10.7 {
227  db close
228  hexio_write test.db 1923 FFFFFFFFFFFFFF7F
229  sqlite3 db test.db
230  catchsql {
231    SELECT substr(x,1,8) FROM t1
232  }
233} [list 1 {database disk image is malformed}]
234
235# Adjust value of record 1 / field 1 SerialTypeLen and see if the
236# corruption is detected.
237# Set SerialTypeLen to FF FF FF FF FF FF FF FF 7F (9 bytes, and overflows).
238do_test corrupt6-1.10.8 {
239  db close
240  hexio_write test.db 1923 FFFFFFFFFFFFFFFF7F
241  sqlite3 db test.db
242  catchsql {
243    SELECT substr(x,1,8) FROM t1
244  }
245} [list 1 {database disk image is malformed}]
246
247# Adjust value of record 1 / field 1 SerialTypeLen and see if the
248# corruption is detected.
249# Set SerialTypeLen to FFFF FF FF FF FF FF FF FF 7F (10 bytes, and overflows).
250do_test corrupt6-1.10.9 {
251  db close
252  hexio_write test.db 1923 FFFFFFFFFFFFFFFFFF7F
253  sqlite3 db test.db
254  catchsql {
255    SELECT substr(x,1,8) FROM t1
256  }
257} [list 1 {database disk image is malformed}]
258
259finish_test
260