Fixed a few more crashes when dealing with corrupt db files. (CVS 5888)

FossilOrigin-Name: f8bb34e40917e55696376d2def932a41ad43d0ae
This commit is contained in:
shane
2008-11-12 04:55:34 +00:00
parent 34ac18daf5
commit 0af3f8935f
4 changed files with 87 additions and 28 deletions
+50 -7
View File
@@ -15,7 +15,7 @@
# data base file, then tests that single byte corruptions in
# increasingly larger quantities are handled gracefully.
#
# $Id: corruptC.test,v 1.4 2008/11/11 22:18:20 shane Exp $
# $Id: corruptC.test,v 1.5 2008/11/12 04:55:34 shane Exp $
catch {file delete -force test.db test.db-journal test.bu}
@@ -39,7 +39,7 @@ do_test corruptC-1.1 {
INSERT OR IGNORE INTO t1 SELECT x*11,y FROM t1;
INSERT OR IGNORE INTO t1 SELECT x*13,y FROM t1;
CREATE INDEX t1i1 ON t1(x);
CREATE TABLE t2 AS SELECT x,2 FROM t1 WHERE rowid%5!=0;
CREATE TABLE t2 AS SELECT x,2 as y FROM t1 WHERE rowid%5!=0;
COMMIT;
}
} {}
@@ -88,8 +88,7 @@ do_test corruptC-2.1 {
sqlite3 db test.db
catchsql {PRAGMA integrity_check}
} {0 {{*** in database main ***
Corruption detected in header on page 3
Multiple uses for byte 604 of page 3}}}
Corruption detected in header on page 3}}}
# test that a corrupt content offset size is handled (seed 5649)
do_test corruptC-2.2 {
@@ -110,7 +109,7 @@ do_test corruptC-2.2 {
sqlite3 db test.db
catchsql {UPDATE t1 SET y=1}
} {0 {}}
} {1 {database disk image is malformed}}
# test that a corrupt free cell size is handled (seed 13329)
do_test corruptC-2.3 {
@@ -122,7 +121,51 @@ do_test corruptC-2.3 {
sqlite3 db test.db
catchsql {UPDATE t1 SET y=1}
} {0 {database disk image is malformed}}
} {1 {database disk image is malformed}}
# test that a corrupt free cell size is handled (seed 169571)
do_test corruptC-2.4 {
db close
copy_file test.bu test.db
# insert corrupt byte(s)
hexio_write test.db 3119 [format %02x 0xdf]
sqlite3 db test.db
catchsql {UPDATE t2 SET y='abcdef-uvwxyz'}
} {1 {database disk image is malformed}}
# test that a corrupt free cell size is handled (seed 169571)
do_test corruptC-2.5 {
db close
copy_file test.bu test.db
# insert corrupt byte(s)
hexio_write test.db 3119 [format %02x 0xdf]
hexio_write test.db 4073 [format %02x 0xbf]
sqlite3 db test.db
catchsql {BEGIN; UPDATE t2 SET y='abcdef-uvwxyz'; ROLLBACK;}
catchsql {PRAGMA integrity_check}
} {0 {{*** in database main ***
On tree page 4 cell 49: invalid page number 1006653561
Corruption detected in cell 49 on page 4
Corruption detected in cell 710 on page 4
Multiple uses for byte 116 of page 4
Fragmented space is 0 byte reported as 21 on page 4}}}
# test that a corrupt free cell size is handled (seed 169595)
do_test corruptC-2.6 {
db close
copy_file test.bu test.db
# insert corrupt byte(s)
hexio_write test.db 619 [format %02x 0xe2]
hexio_write test.db 3150 [format %02x 0xa8]
sqlite3 db test.db
catchsql {BEGIN; UPDATE t2 SET y='abcdef-uvwxyz'; ROLLBACK;}
} {1 {database disk image is malformed}}
#
# now test for a series of quasi-random seeds
@@ -176,7 +219,7 @@ for {set tn 0} {$tn<=1024} {incr tn 1} {
set x {}
} {}
do_test corruptC-3.$tn.$i.7 {
catchsql {BEGIN; UPDATE t2 SET y=2; ROLLBACK;}
catchsql {BEGIN; UPDATE t2 SET y='abcdef-uvwxyz'; ROLLBACK;}
set x {}
} {}