diff options
Diffstat (limited to 'testdata/tcl/corruptJ.test')
| -rw-r--r-- | testdata/tcl/corruptJ.test | 80 | 
1 files changed, 80 insertions, 0 deletions
diff --git a/testdata/tcl/corruptJ.test b/testdata/tcl/corruptJ.test new file mode 100644 index 0000000..732adb0 --- /dev/null +++ b/testdata/tcl/corruptJ.test @@ -0,0 +1,80 @@ +# 2015-03-30 +# +# The author disclaims copyright to this source code.  In place of +# a legal notice, here is a blessing: +# +#    May you do good and not evil. +#    May you find forgiveness for yourself and forgive others. +#    May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Corruption consisting of a database page that thinks it is a child +# of itself. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix corruptJ + +if {[permutation]=="mmap"} { +  finish_test +  return +} + +# This module uses hard-coded offsets which do not work if the reserved_bytes +# value is nonzero. +if {[nonzero_reserved_bytes]} {finish_test; return;} + +database_may_be_corrupt + +# Initialize the database. +# +do_execsql_test 1.1 { +  PRAGMA page_size=1024; +  PRAGMA auto_vacuum=0; +  CREATE TABLE t1(a,b); +  WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<10) +    INSERT INTO t1(a,b) SELECT i, zeroblob(700) FROM c; +} {} +db close + +# Corrupt the root page of the t1 table such that the left-child pointer +# for the very first cell points back to the root.  Then try to DROP the +# table.  The clearDatabasePage() routine should not loop. +# +do_test 1.2 { +  hexio_write test.db [expr {2*1024-2}] 02 +  sqlite3 db test.db +  catchsql { DROP TABLE t1 } +} {1 {database disk image is malformed}} + +# Similar test using a WITHOUT ROWID table +# +do_test 2.1 { +  db close +  forcedelete test.db +  sqlite3 db test.db +  db eval { +    PRAGMA page_size=1024; +    PRAGMA auto_vacuum=0; +    CREATE TABLE t1(a,b,PRIMARY KEY(a,b)) WITHOUT ROWID; +    WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<100) +      INSERT INTO t1(a,b) SELECT i, zeroblob(200) FROM c; +  } +} {} + +# The table is three levels deep.  Corrupt the left child of an intermediate +# page so that it points back to the root page. +# +do_test 2.2 { +  db close +  hexio_read test.db [expr {9*1024+391}] 8 +} {00000008814D0401} +do_test 2.2b { +  hexio_write test.db [expr {9*1024+391}] 00000002 +  sqlite3 db test.db +  catchsql { PRAGMA secure_delete=ON; DROP TABLE t1; } +} {1 {database disk image is malformed}} + +finish_test  | 
