CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
corruptB.test194 linesDownload Raw Back to test
1# 2008 Sep 102#3# The author disclaims copyright to this source code.  In place of4# 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 or14# segfault if it sees a corrupt database file.  It specifically focuses15# on loops in the B-Tree structure. A loop is formed in a B-Tree structure16# when there exists a page that is both an a descendent or ancestor of17# itself.18#19# Also test that an SQLITE_CORRUPT error is returned if a B-Tree page20# contains a (corrupt) reference to a page greater than the configured21# maximum page number.22#23# $Id: corruptB.test,v 1.4 2009/07/21 19:25:24 danielk1977 Exp $24 25set testdir [file dirname $argv0]26source $testdir/tester.tcl27 28# Do not use a codec for tests in this file, as the database file is29# manipulated directly using tcl scripts (using the [hexio_write] command).30#31do_not_use_codec32 33# These tests deal with corrupt database files34#35database_may_be_corrupt36 37 38do_test corruptB-1.1 {39  execsql {40    PRAGMA auto_vacuum = 1;41    CREATE TABLE t1(x);42    INSERT INTO t1 VALUES(randomblob(200));43    INSERT INTO t1 SELECT randomblob(200) FROM t1;44    INSERT INTO t1 SELECT randomblob(200) FROM t1;45    INSERT INTO t1 SELECT randomblob(200) FROM t1;46    INSERT INTO t1 SELECT randomblob(200) FROM t1;47    INSERT INTO t1 SELECT randomblob(200) FROM t1;48  }49  expr {[file size test.db] > (1024*9)}50} {1}51integrity_check corruptB-1.252 53forcecopy test.db bak.db54 55# Set the right-child of a B-Tree rootpage to refer to the root-page itself.56#57do_test corruptB-1.3.1 {58  set ::root [execsql {SELECT rootpage FROM sqlite_master}]59  set ::offset [expr {($::root-1)*1024}]60  hexio_write test.db [expr $offset+8] [hexio_render_int32 $::root]61} {4}62do_test corruptB-1.3.2 {63  sqlite3 db test.db64  catchsql { SELECT * FROM t1 }65} {1 {database disk image is malformed}}66 67# Set the left-child of a cell in a B-Tree rootpage to refer to the 68# root-page itself.69#70do_test corruptB-1.4.1 {71  db close72  forcecopy bak.db test.db73  set cell_offset [hexio_get_int [hexio_read test.db [expr $offset+12] 2]]74  hexio_write test.db [expr $offset+$cell_offset] [hexio_render_int32 $::root]75} {4}76do_test corruptB-1.4.2 {77  sqlite3 db test.db78  catchsql { SELECT * FROM t1 }79} {1 {database disk image is malformed}}80 81# Now grow the table B-Tree so that it is more than 2 levels high.82#83do_test corruptB-1.5.1 {84  db close85  forcecopy bak.db test.db86  sqlite3 db test.db87  execsql {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    INSERT INTO t1 SELECT randomblob(200) FROM t1;92    INSERT INTO t1 SELECT randomblob(200) FROM t1;93    INSERT INTO t1 SELECT randomblob(200) FROM t1;94    INSERT INTO t1 SELECT randomblob(200) FROM t1;95  }96} {}97 98forcecopy test.db bak.db99 100# Set the right-child pointer of the right-child of the root page to point101# back to the root page.102#103do_test corruptB-1.6.1 {104  db close105  set iRightChild [hexio_get_int [hexio_read test.db [expr $offset+8] 4]]106  set c_offset [expr ($iRightChild-1)*1024]107  hexio_write test.db [expr $c_offset+8] [hexio_render_int32 $::root]108} {4}109do_test corruptB-1.6.2 {110  sqlite3 db test.db111  catchsql { SELECT * FROM t1 }112} {1 {database disk image is malformed}}113 114# Set the left-child pointer of a cell of the right-child of the root page to115# point back to the root page.116#117do_test corruptB-1.7.1 {118  db close119  forcecopy bak.db test.db120  set cell_offset [hexio_get_int [hexio_read test.db [expr $c_offset+12] 2]]121  hexio_write test.db [expr $c_offset+$cell_offset] [hexio_render_int32 $::root]122} {4}123do_test corruptB-1.7.2 {124  sqlite3 db test.db125  catchsql { SELECT * FROM t1 }126} {1 {database disk image is malformed}}127 128do_test corruptB-1.8.1 {129  db close130  set cell_offset [hexio_get_int [hexio_read test.db [expr $offset+12] 2]]131  set iLeftChild [132      hexio_get_int [hexio_read test.db [expr $offset+$cell_offset] 4]133  ]134  set c_offset [expr ($iLeftChild-1)*1024]135  hexio_write test.db [expr $c_offset+8] [hexio_render_int32 $::root]136} {4}137do_test corruptB-1.8.2 {138  sqlite3 db test.db139  catchsql { SELECT * FROM t1 }140} {1 {database disk image is malformed}}141 142# Set the left-child pointer of a cell of the right-child of the root page to143# point back to the root page.144#145do_test corruptB-1.9.1 {146  db close147  forcecopy bak.db test.db148  set cell_offset [hexio_get_int [hexio_read test.db [expr $c_offset+12] 2]]149  hexio_write test.db [expr $c_offset+$cell_offset] [hexio_render_int32 $::root]150} {4}151do_test corruptB-1.9.2 {152  sqlite3 db test.db153  catchsql { SELECT * FROM t1 }154} {1 {database disk image is malformed}}155 156#---------------------------------------------------------------------------157 158do_test corruptB-2.1.1 {159  db close160  forcecopy bak.db test.db161  hexio_write test.db [expr $offset+8] [hexio_render_int32 0x6FFFFFFF]162} {4}163do_test corruptB-2.1.2 {164  sqlite3 db test.db165  catchsql { SELECT * FROM t1 }166} {1 {database disk image is malformed}}167 168#---------------------------------------------------------------------------169 170# Corrupt the header-size field of a database record.171#172do_test corruptB-3.1.1 {173  db close174  forcecopy bak.db test.db175  sqlite3 db test.db176  set v [string repeat abcdefghij 200]177  execsql {178    CREATE TABLE t2(a);179    INSERT INTO t2 VALUES($v);180  }181  set t2_root [execsql {SELECT rootpage FROM sqlite_master WHERE name = 't2'}]182  set iPage [expr ($t2_root-1)*1024]183  set iCellarray [expr $iPage + 8]184  set iRecord [hexio_get_int [hexio_read test.db $iCellarray 2]]185  db close186  hexio_write test.db [expr $iPage+$iRecord+3] FF00187} {2}188do_test corruptB-3.1.2 {189  sqlite3 db test.db190  catchsql { SELECT * FROM t2 }191} {1 {database disk image is malformed}}192 193finish_test194