Annotation of embedaddon/sqlite3/test/corruptB.test, revision 1.1.1.1
1.1 misho 1: # 2008 Sep 10
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 loops in the B-Tree structure. A loop is formed in a B-Tree structure
16: # when there exists a page that is both an a descendent or ancestor of
17: # itself.
18: #
19: # Also test that an SQLITE_CORRUPT error is returned if a B-Tree page
20: # contains a (corrupt) reference to a page greater than the configured
21: # maximum page number.
22: #
23: # $Id: corruptB.test,v 1.4 2009/07/21 19:25:24 danielk1977 Exp $
24:
25: set testdir [file dirname $argv0]
26: source $testdir/tester.tcl
27:
28: # Do not use a codec for tests in this file, as the database file is
29: # manipulated directly using tcl scripts (using the [hexio_write] command).
30: #
31: do_not_use_codec
32:
33:
34: do_test corruptB-1.1 {
35: execsql {
36: PRAGMA auto_vacuum = 1;
37: CREATE TABLE t1(x);
38: INSERT INTO t1 VALUES(randomblob(200));
39: INSERT INTO t1 SELECT randomblob(200) FROM t1;
40: INSERT INTO t1 SELECT randomblob(200) FROM t1;
41: INSERT INTO t1 SELECT randomblob(200) FROM t1;
42: INSERT INTO t1 SELECT randomblob(200) FROM t1;
43: INSERT INTO t1 SELECT randomblob(200) FROM t1;
44: }
45: expr {[file size test.db] > (1024*9)}
46: } {1}
47: integrity_check corruptB-1.2
48:
49: forcecopy test.db bak.db
50:
51: # Set the right-child of a B-Tree rootpage to refer to the root-page itself.
52: #
53: do_test corruptB-1.3.1 {
54: set ::root [execsql {SELECT rootpage FROM sqlite_master}]
55: set ::offset [expr {($::root-1)*1024}]
56: hexio_write test.db [expr $offset+8] [hexio_render_int32 $::root]
57: } {4}
58: do_test corruptB-1.3.2 {
59: sqlite3 db test.db
60: catchsql { SELECT * FROM t1 }
61: } {1 {database disk image is malformed}}
62:
63: # Set the left-child of a cell in a B-Tree rootpage to refer to the
64: # root-page itself.
65: #
66: do_test corruptB-1.4.1 {
67: db close
68: forcecopy bak.db test.db
69: set cell_offset [hexio_get_int [hexio_read test.db [expr $offset+12] 2]]
70: hexio_write test.db [expr $offset+$cell_offset] [hexio_render_int32 $::root]
71: } {4}
72: do_test corruptB-1.4.2 {
73: sqlite3 db test.db
74: catchsql { SELECT * FROM t1 }
75: } {1 {database disk image is malformed}}
76:
77: # Now grow the table B-Tree so that it is more than 2 levels high.
78: #
79: do_test corruptB-1.5.1 {
80: db close
81: forcecopy bak.db test.db
82: sqlite3 db test.db
83: execsql {
84: INSERT INTO t1 SELECT randomblob(200) FROM t1;
85: INSERT INTO t1 SELECT randomblob(200) FROM t1;
86: INSERT INTO t1 SELECT randomblob(200) FROM t1;
87: INSERT INTO t1 SELECT randomblob(200) FROM t1;
88: INSERT INTO t1 SELECT randomblob(200) FROM t1;
89: INSERT INTO t1 SELECT randomblob(200) FROM t1;
90: INSERT INTO t1 SELECT randomblob(200) FROM t1;
91: }
92: } {}
93:
94: forcecopy test.db bak.db
95:
96: # Set the right-child pointer of the right-child of the root page to point
97: # back to the root page.
98: #
99: do_test corruptB-1.6.1 {
100: db close
101: set iRightChild [hexio_get_int [hexio_read test.db [expr $offset+8] 4]]
102: set c_offset [expr ($iRightChild-1)*1024]
103: hexio_write test.db [expr $c_offset+8] [hexio_render_int32 $::root]
104: } {4}
105: do_test corruptB-1.6.2 {
106: sqlite3 db test.db
107: catchsql { SELECT * FROM t1 }
108: } {1 {database disk image is malformed}}
109:
110: # Set the left-child pointer of a cell of the right-child of the root page to
111: # point back to the root page.
112: #
113: do_test corruptB-1.7.1 {
114: db close
115: forcecopy bak.db test.db
116: set cell_offset [hexio_get_int [hexio_read test.db [expr $c_offset+12] 2]]
117: hexio_write test.db [expr $c_offset+$cell_offset] [hexio_render_int32 $::root]
118: } {4}
119: do_test corruptB-1.7.2 {
120: sqlite3 db test.db
121: catchsql { SELECT * FROM t1 }
122: } {1 {database disk image is malformed}}
123:
124: do_test corruptB-1.8.1 {
125: db close
126: set cell_offset [hexio_get_int [hexio_read test.db [expr $offset+12] 2]]
127: set iLeftChild [
128: hexio_get_int [hexio_read test.db [expr $offset+$cell_offset] 4]
129: ]
130: set c_offset [expr ($iLeftChild-1)*1024]
131: hexio_write test.db [expr $c_offset+8] [hexio_render_int32 $::root]
132: } {4}
133: do_test corruptB-1.8.2 {
134: sqlite3 db test.db
135: catchsql { SELECT * FROM t1 }
136: } {1 {database disk image is malformed}}
137:
138: # Set the left-child pointer of a cell of the right-child of the root page to
139: # point back to the root page.
140: #
141: do_test corruptB-1.9.1 {
142: db close
143: forcecopy bak.db test.db
144: set cell_offset [hexio_get_int [hexio_read test.db [expr $c_offset+12] 2]]
145: hexio_write test.db [expr $c_offset+$cell_offset] [hexio_render_int32 $::root]
146: } {4}
147: do_test corruptB-1.9.2 {
148: sqlite3 db test.db
149: catchsql { SELECT * FROM t1 }
150: } {1 {database disk image is malformed}}
151:
152: #---------------------------------------------------------------------------
153:
154: do_test corruptB-2.1.1 {
155: db close
156: forcecopy bak.db test.db
157: hexio_write test.db [expr $offset+8] [hexio_render_int32 0x6FFFFFFF]
158: } {4}
159: do_test corruptB-2.1.2 {
160: sqlite3 db test.db
161: catchsql { SELECT * FROM t1 }
162: } {1 {database disk image is malformed}}
163:
164: #---------------------------------------------------------------------------
165:
166: # Corrupt the header-size field of a database record.
167: #
168: do_test corruptB-3.1.1 {
169: db close
170: forcecopy bak.db test.db
171: sqlite3 db test.db
172: set v [string repeat abcdefghij 200]
173: execsql {
174: CREATE TABLE t2(a);
175: INSERT INTO t2 VALUES($v);
176: }
177: set t2_root [execsql {SELECT rootpage FROM sqlite_master WHERE name = 't2'}]
178: set iPage [expr ($t2_root-1)*1024]
179: set iCellarray [expr $iPage + 8]
180: set iRecord [hexio_get_int [hexio_read test.db $iCellarray 2]]
181: db close
182: hexio_write test.db [expr $iPage+$iRecord+3] FF00
183: } {2}
184: do_test corruptB-3.1.2 {
185: sqlite3 db test.db
186: catchsql { SELECT * FROM t2 }
187: } {1 {database disk image is malformed}}
188:
189: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>