Annotation of embedaddon/sqlite3/test/corrupt2.test, revision 1.1.1.1

1.1       misho       1: # 2004 August 30
                      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.
                     15: #
                     16: # $Id: corrupt2.test,v 1.20 2009/04/06 17:50:03 danielk1977 Exp $
                     17: 
                     18: set testdir [file dirname $argv0]
                     19: source $testdir/tester.tcl
                     20: 
                     21: # Do not use a codec for tests in this file, as the database file is
                     22: # manipulated directly using tcl scripts (using the [hexio_write] command).
                     23: #
                     24: do_not_use_codec
                     25: 
                     26: set presql ""
                     27: catch { set presql "$::G(perm:presql);" }
                     28: unset -nocomplain ::G(perm:presql)
                     29: 
                     30: # The following tests - corrupt2-1.* - create some databases corrupted in
                     31: # specific ways and ensure that SQLite detects them as corrupt.
                     32: #
                     33: do_test corrupt2-1.1 {
                     34:   execsql {
                     35:     PRAGMA auto_vacuum=0;
                     36:     PRAGMA page_size=1024;
                     37:     CREATE TABLE abc(a, b, c);
                     38:   }
                     39: } {}
                     40: 
                     41: do_test corrupt2-1.2 {
                     42: 
                     43:   # Corrupt the 16 byte magic string at the start of the file
                     44:   forcedelete corrupt.db
                     45:   forcedelete corrupt.db-journal
                     46:   forcecopy test.db corrupt.db
                     47:   set f [open corrupt.db RDWR]
                     48:   seek $f 8 start
                     49:   puts $f blah
                     50:   close $f
                     51: 
                     52:   sqlite3 db2 corrupt.db
                     53:   catchsql "
                     54:     $::presql
                     55:     SELECT * FROM sqlite_master;
                     56:   " db2
                     57: } {1 {file is encrypted or is not a database}}
                     58: 
                     59: do_test corrupt2-1.3 {
                     60:   db2 close
                     61: 
                     62:   # Corrupt the page-size (bytes 16 and 17 of page 1).
                     63:   forcedelete corrupt.db
                     64:   forcedelete corrupt.db-journal
                     65:   forcecopy test.db corrupt.db
                     66:   set f [open corrupt.db RDWR]
                     67:   fconfigure $f -encoding binary
                     68:   seek $f 16 start
                     69:   puts -nonewline $f "\x00\xFF"
                     70:   close $f
                     71: 
                     72:   sqlite3 db2 corrupt.db
                     73:   catchsql "
                     74:     $::presql
                     75:     SELECT * FROM sqlite_master;
                     76:   " db2
                     77: } {1 {file is encrypted or is not a database}}
                     78: 
                     79: do_test corrupt2-1.4 {
                     80:   db2 close
                     81: 
                     82:   # Corrupt the free-block list on page 1.
                     83:   forcedelete corrupt.db
                     84:   forcedelete corrupt.db-journal
                     85:   forcecopy test.db corrupt.db
                     86:   set f [open corrupt.db RDWR]
                     87:   fconfigure $f -encoding binary
                     88:   seek $f 101 start
                     89:   puts -nonewline $f "\xFF\xFF"
                     90:   close $f
                     91: 
                     92:   sqlite3 db2 corrupt.db
                     93:   catchsql "
                     94:     $::presql
                     95:     SELECT * FROM sqlite_master;
                     96:   " db2
                     97: } {1 {database disk image is malformed}}
                     98: 
                     99: do_test corrupt2-1.5 {
                    100:   db2 close
                    101: 
                    102:   # Corrupt the free-block list on page 1.
                    103:   forcedelete corrupt.db
                    104:   forcedelete corrupt.db-journal
                    105:   forcecopy test.db corrupt.db
                    106:   set f [open corrupt.db RDWR]
                    107:   fconfigure $f -encoding binary
                    108:   seek $f 101 start
                    109:   puts -nonewline $f "\x00\xC8"
                    110:   seek $f 200 start
                    111:   puts -nonewline $f "\x00\x00"
                    112:   puts -nonewline $f "\x10\x00"
                    113:   close $f
                    114: 
                    115:   sqlite3 db2 corrupt.db
                    116:   catchsql "
                    117:     $::presql
                    118:     SELECT * FROM sqlite_master;
                    119:   " db2
                    120: } {1 {database disk image is malformed}}
                    121: db2 close
                    122: 
                    123: # Corrupt a database by having 2 indices of the same name:
                    124: do_test corrupt2-2.1 {
                    125: 
                    126:   forcedelete corrupt.db
                    127:   forcedelete corrupt.db-journal
                    128:   forcecopy test.db corrupt.db
                    129: 
                    130:   sqlite3 db2 corrupt.db 
                    131:   execsql "
                    132:     $::presql
                    133:     CREATE INDEX a1 ON abc(a);
                    134:     CREATE INDEX a2 ON abc(b);
                    135:     PRAGMA writable_schema = 1;
                    136:     UPDATE sqlite_master 
                    137:       SET name = 'a3', sql = 'CREATE INDEX a3' || substr(sql, 16, 10000)
                    138:       WHERE type = 'index';
                    139:     PRAGMA writable_schema = 0;
                    140:   " db2
                    141: 
                    142:   db2 close
                    143:   sqlite3 db2 corrupt.db 
                    144:   catchsql "
                    145:     $::presql
                    146:     SELECT * FROM sqlite_master;
                    147:   " db2
                    148: } {1 {malformed database schema (a3) - index a3 already exists}}
                    149: 
                    150: db2 close
                    151: 
                    152: do_test corrupt2-3.1 {
                    153:   forcedelete corrupt.db
                    154:   forcedelete corrupt.db-journal
                    155:   sqlite3 db2 corrupt.db 
                    156: 
                    157:   execsql "
                    158:     $::presql
                    159:     PRAGMA auto_vacuum = 1;
                    160:     PRAGMA page_size = 1024;
                    161:     CREATE TABLE t1(a, b, c);
                    162:     CREATE TABLE t2(a, b, c);
                    163:     INSERT INTO t2 VALUES(randomblob(100), randomblob(100), randomblob(100));
                    164:     INSERT INTO t2 SELECT * FROM t2;
                    165:     INSERT INTO t2 SELECT * FROM t2;
                    166:     INSERT INTO t2 SELECT * FROM t2;
                    167:     INSERT INTO t2 SELECT * FROM t2;
                    168:   " db2
                    169: 
                    170:   db2 close
                    171: 
                    172:   # On the root page of table t2 (page 4), set one of the child page-numbers
                    173:   # to 0. This corruption will be detected when SQLite attempts to update
                    174:   # the pointer-map after moving the content of page 4 to page 3 as part
                    175:   # of the DROP TABLE operation below.
                    176:   #
                    177:   set fd [open corrupt.db r+]
                    178:   fconfigure $fd -encoding binary -translation binary
                    179:   seek $fd [expr 1024*3 + 12]
                    180:   set zCelloffset [read $fd 2]
                    181:   binary scan $zCelloffset S iCelloffset
                    182:   seek $fd [expr 1024*3 + $iCelloffset]
                    183:   puts -nonewline $fd "\00\00\00\00" 
                    184:   close $fd
                    185: 
                    186:   sqlite3 db2 corrupt.db 
                    187:   catchsql "
                    188:     $::presql
                    189:     DROP TABLE t1;
                    190:   " db2
                    191: } {1 {database disk image is malformed}}
                    192: 
                    193: do_test corrupt2-4.1 {
                    194:   catchsql {
                    195:     SELECT * FROM t2;
                    196:   } db2
                    197: } {1 {database disk image is malformed}}
                    198: 
                    199: db2 close
                    200: 
                    201: unset -nocomplain result
                    202: do_test corrupt2-5.1 {
                    203:   forcedelete corrupt.db
                    204:   forcedelete corrupt.db-journal
                    205:   sqlite3 db2 corrupt.db 
                    206: 
                    207:   execsql "
                    208:     $::presql
                    209:     PRAGMA auto_vacuum = 0;
                    210:     PRAGMA page_size = 1024;
                    211:     CREATE TABLE t1(a, b, c);
                    212:     CREATE TABLE t2(a, b, c);
                    213:     INSERT INTO t2 VALUES(randomblob(100), randomblob(100), randomblob(100));
                    214:     INSERT INTO t2 SELECT * FROM t2;
                    215:     INSERT INTO t2 SELECT * FROM t2;
                    216:     INSERT INTO t2 SELECT * FROM t2;
                    217:     INSERT INTO t2 SELECT * FROM t2;
                    218:     INSERT INTO t1 SELECT * FROM t2;
                    219:   " db2
                    220: 
                    221:   db2 close
                    222: 
                    223:   # This block links a page from table t2 into the t1 table structure.
                    224:   #
                    225:   set fd [open corrupt.db r+]
                    226:   fconfigure $fd -encoding binary -translation binary
                    227:   seek $fd [expr 1024 + 12]
                    228:   set zCelloffset [read $fd 2]
                    229:   binary scan $zCelloffset S iCelloffset
                    230:   seek $fd [expr 1024 + $iCelloffset]
                    231:   set zChildPage [read $fd 4]
                    232:   seek $fd [expr 2*1024 + 12]
                    233:   set zCelloffset [read $fd 2]
                    234:   binary scan $zCelloffset S iCelloffset
                    235:   seek $fd [expr 2*1024 + $iCelloffset]
                    236:   puts -nonewline $fd $zChildPage
                    237:   close $fd
                    238: 
                    239:   sqlite3 db2 corrupt.db 
                    240:   db2 eval $::presql
                    241:   db2 eval {SELECT rowid FROM t1} {
                    242:     set result [db2 eval {pragma integrity_check}]
                    243:     break
                    244:   }
                    245:   set result
                    246: } {{*** in database main ***
                    247: On tree page 2 cell 0: 2nd reference to page 10
                    248: On tree page 2 cell 1: Child page depth differs
                    249: Page 4 is never used}}
                    250: 
                    251: db2 close
                    252: 
                    253: proc corruption_test {args} {
                    254:   set A(-corrupt) {}
                    255:   set A(-sqlprep) {}
                    256:   set A(-tclprep) {}
                    257:   array set A $args
                    258: 
                    259:   catch {db close}
                    260:   forcedelete corrupt.db
                    261:   forcedelete corrupt.db-journal
                    262: 
                    263:   sqlite3 db corrupt.db 
                    264:   db eval $::presql
                    265:   eval $A(-tclprep)
                    266:   db eval $A(-sqlprep)
                    267:   db close
                    268: 
                    269:   eval $A(-corrupt)
                    270: 
                    271:   sqlite3 db corrupt.db
                    272:   eval $A(-test)
                    273: }
                    274: 
                    275: ifcapable autovacuum {
                    276:   # The tests within this block - corrupt2-6.* - aim to test corruption
                    277:   # detection within an incremental-vacuum. When an incremental-vacuum
                    278:   # step is executed, the last non-free page of the database file is 
                    279:   # moved into a free space in the body of the file. After doing so,
                    280:   # the page reference in the parent page must be updated to refer
                    281:   # to the new location. These tests test the outcome of corrupting
                    282:   # that page reference before performing the incremental vacuum.
                    283:   #
                    284: 
                    285:   # The last page in the database page is the second page 
                    286:   # in an overflow chain.
                    287:   #
                    288:   corruption_test -sqlprep {
                    289:     PRAGMA auto_vacuum = incremental;
                    290:     PRAGMA page_size = 1024;
                    291:     CREATE TABLE t1(a, b);
                    292:     INSERT INTO t1 VALUES(1, randomblob(2500));
                    293:     INSERT INTO t1 VALUES(2, randomblob(2500));
                    294:     DELETE FROM t1 WHERE a = 1;
                    295:   } -corrupt {
                    296:     hexio_write corrupt.db [expr 1024*5] 00000008
                    297:   } -test {
                    298:     do_test corrupt2-6.1 {
                    299:       catchsql " $::presql pragma incremental_vacuum = 1 "
                    300:     } {1 {database disk image is malformed}}
                    301:   }
                    302: 
                    303:   # The last page in the database page is a non-root b-tree page.
                    304:   #
                    305:   corruption_test -sqlprep {
                    306:     PRAGMA auto_vacuum = incremental;
                    307:     PRAGMA page_size = 1024;
                    308:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    309:     INSERT INTO t1 VALUES(1, randomblob(2500));
                    310:     INSERT INTO t1 VALUES(2, randomblob(50));
                    311:     INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    312:     INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    313:     INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    314:     INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    315:     DELETE FROM t1 WHERE a = 1;
                    316:   } -corrupt {
                    317:     hexio_write corrupt.db [expr 1024*2 + 8] 00000009
                    318:   } -test {
                    319:     do_test corrupt2-6.2 {
                    320:       catchsql " $::presql pragma incremental_vacuum = 1 "
                    321:     } {1 {database disk image is malformed}}
                    322:   }
                    323: 
                    324:   # Set up a pointer-map entry so that the last page of the database
                    325:   # file appears to be a b-tree root page. This should be detected
                    326:   # as corruption.
                    327:   #
                    328:   corruption_test -sqlprep {
                    329:     PRAGMA auto_vacuum = incremental;
                    330:     PRAGMA page_size = 1024;
                    331:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    332:     INSERT INTO t1 VALUES(1, randomblob(2500));
                    333:     INSERT INTO t1 VALUES(2, randomblob(2500));
                    334:     INSERT INTO t1 VALUES(3, randomblob(2500));
                    335:     DELETE FROM t1 WHERE a = 1;
                    336:   } -corrupt {
                    337:     set nPage [expr [file size corrupt.db] / 1024]
                    338:     hexio_write corrupt.db [expr 1024 + ($nPage-3)*5] 010000000
                    339:   } -test {
                    340:     do_test corrupt2-6.3 {
                    341:       catchsql " $::presql pragma incremental_vacuum = 1 "
                    342:     } {1 {database disk image is malformed}}
                    343:   }
                    344: 
                    345:   corruption_test -sqlprep {
                    346:     PRAGMA auto_vacuum = 1;
                    347:     PRAGMA page_size = 1024;
                    348:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    349:     INSERT INTO t1 VALUES(1, randomblob(2500));
                    350:     DELETE FROM t1 WHERE a = 1;
                    351:   } -corrupt {
                    352:     set nAppend [expr 1024*207 - [file size corrupt.db]]
                    353:     set fd [open corrupt.db r+]
                    354:     seek $fd 0 end
                    355:     puts -nonewline $fd [string repeat x $nAppend]
                    356:     close $fd
                    357:     hexio_write corrupt.db 28 00000000
                    358:   } -test {
                    359:     do_test corrupt2-6.4 {
                    360:       catchsql " 
                    361:         $::presql 
                    362:         BEGIN EXCLUSIVE;
                    363:         COMMIT;
                    364:       "
                    365:     } {1 {database disk image is malformed}}
                    366:   }
                    367: }
                    368: 
                    369: 
                    370: set sqlprep {
                    371:   PRAGMA auto_vacuum = 0;
                    372:   PRAGMA page_size = 1024;
                    373:   CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    374:   CREATE INDEX i1 ON t1(b);
                    375:   INSERT INTO t1 VALUES(1, randomblob(50));
                    376:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    377:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    378:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    379:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    380:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    381:   INSERT INTO t1 SELECT NULL, randomblob(50) FROM t1;
                    382: }
                    383: 
                    384: corruption_test -sqlprep $sqlprep -corrupt {
                    385:   # Set the page-flags of one of the leaf pages of the index B-Tree to
                    386:   # 0x0D (interpreted by SQLite as "leaf page of a table B-Tree").
                    387:   #
                    388:   set fd [open corrupt.db r+]
                    389:   fconfigure $fd -translation binary -encoding binary
                    390:   seek $fd [expr 1024*2 + 8] 
                    391:   set zRightChild [read $fd 4]
                    392:   binary scan $zRightChild I iRightChild
                    393:   seek $fd [expr 1024*($iRightChild-1)]
                    394:   puts -nonewline $fd "\x0D"
                    395:   close $fd
                    396: } -test {
                    397:   do_test corrupt2-7.1 {
                    398:     catchsql " $::presql SELECT b FROM t1 ORDER BY b ASC "
                    399:   } {1 {database disk image is malformed}}
                    400: }
                    401: 
                    402: corruption_test -sqlprep $sqlprep -corrupt {
                    403:   # Mess up the page-header of one of the leaf pages of the index B-Tree.
                    404:   # The corruption is detected as part of an OP_Prev opcode.
                    405:   #
                    406:   set fd [open corrupt.db r+]
                    407:   fconfigure $fd -translation binary -encoding binary
                    408:   seek $fd [expr 1024*2 + 12] 
                    409:   set zCellOffset [read $fd 2]
                    410:   binary scan $zCellOffset S iCellOffset
                    411:   seek $fd [expr 1024*2 + $iCellOffset]
                    412:   set zChild [read $fd 4]
                    413:   binary scan $zChild I iChild
                    414:   seek $fd [expr 1024*($iChild-1)+3]
                    415:   puts -nonewline $fd "\xFFFF"
                    416:   close $fd
                    417: } -test {
                    418:   do_test corrupt2-7.1 {
                    419:     catchsql " $::presql SELECT b FROM t1 ORDER BY b DESC "
                    420:   } {1 {database disk image is malformed}}
                    421: }
                    422: 
                    423: corruption_test -sqlprep $sqlprep -corrupt {
                    424:   # Set the page-flags of one of the leaf pages of the table B-Tree to
                    425:   # 0x0A (interpreted by SQLite as "leaf page of an index B-Tree").
                    426:   #
                    427:   set fd [open corrupt.db r+]
                    428:   fconfigure $fd -translation binary -encoding binary
                    429:   seek $fd [expr 1024*1 + 8] 
                    430:   set zRightChild [read $fd 4]
                    431:   binary scan $zRightChild I iRightChild
                    432:   seek $fd [expr 1024*($iRightChild-1)]
                    433:   puts -nonewline $fd "\x0A"
                    434:   close $fd
                    435: } -test {
                    436:   do_test corrupt2-8.1 {
                    437:     catchsql " $::presql SELECT * FROM t1 WHERE rowid=1000 "
                    438:   } {1 {database disk image is malformed}}
                    439: }
                    440: 
                    441: corruption_test -sqlprep {
                    442:   CREATE TABLE t1(a, b, c); CREATE TABLE t8(a, b, c); CREATE TABLE tE(a, b, c);
                    443:   CREATE TABLE t2(a, b, c); CREATE TABLE t9(a, b, c); CREATE TABLE tF(a, b, c);
                    444:   CREATE TABLE t3(a, b, c); CREATE TABLE tA(a, b, c); CREATE TABLE tG(a, b, c);
                    445:   CREATE TABLE t4(a, b, c); CREATE TABLE tB(a, b, c); CREATE TABLE tH(a, b, c);
                    446:   CREATE TABLE t5(a, b, c); CREATE TABLE tC(a, b, c); CREATE TABLE tI(a, b, c);
                    447:   CREATE TABLE t6(a, b, c); CREATE TABLE tD(a, b, c); CREATE TABLE tJ(a, b, c);
                    448:   CREATE TABLE x1(a, b, c); CREATE TABLE x8(a, b, c); CREATE TABLE xE(a, b, c);
                    449:   CREATE TABLE x2(a, b, c); CREATE TABLE x9(a, b, c); CREATE TABLE xF(a, b, c);
                    450:   CREATE TABLE x3(a, b, c); CREATE TABLE xA(a, b, c); CREATE TABLE xG(a, b, c);
                    451:   CREATE TABLE x4(a, b, c); CREATE TABLE xB(a, b, c); CREATE TABLE xH(a, b, c);
                    452:   CREATE TABLE x5(a, b, c); CREATE TABLE xC(a, b, c); CREATE TABLE xI(a, b, c);
                    453:   CREATE TABLE x6(a, b, c); CREATE TABLE xD(a, b, c); CREATE TABLE xJ(a, b, c);
                    454: } -corrupt {
                    455:   set fd [open corrupt.db r+]
                    456:   fconfigure $fd -translation binary -encoding binary
                    457:   seek $fd 108
                    458:   set zRightChild [read $fd 4]
                    459:   binary scan $zRightChild I iRightChild
                    460:   seek $fd [expr 1024*($iRightChild-1)+3]
                    461:   puts -nonewline $fd "\x00\x00"
                    462:   close $fd
                    463: } -test {
                    464:   do_test corrupt2-9.1 {
                    465:     catchsql " $::presql SELECT sql FROM sqlite_master "
                    466:   } {1 {database disk image is malformed}}
                    467: }
                    468: 
                    469: corruption_test -sqlprep {
                    470:   CREATE TABLE t1(a, b, c);
                    471:   CREATE TABLE t2(a, b, c);
                    472:   PRAGMA writable_schema = 1;
                    473:   UPDATE sqlite_master SET rootpage = NULL WHERE name = 't2';
                    474: } -test {
                    475:   do_test corrupt2-10.1 {
                    476:     catchsql " $::presql SELECT * FROM t2 "
                    477:   } {1 {malformed database schema (t2)}}
                    478:   do_test corrupt2-10.2 {
                    479:     sqlite3_errcode db
                    480:   } {SQLITE_CORRUPT}
                    481: }
                    482: 
                    483: corruption_test -sqlprep {
                    484:   PRAGMA auto_vacuum = incremental;
                    485:   CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    486:   CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
                    487:   INSERT INTO t1 VALUES(1, randstr(100,100));
                    488:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    489:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    490:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    491:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    492:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    493:   INSERT INTO t2 SELECT * FROM t1;
                    494:   DELETE FROM t1;
                    495: } -corrupt {
                    496:   set offset [expr [file size corrupt.db] - 1024]
                    497:   hexio_write corrupt.db $offset FF 
                    498:   hexio_write corrupt.db 24   12345678
                    499: } -test {
                    500:   do_test corrupt2-11.1 {
                    501:     catchsql " $::presql PRAGMA incremental_vacuum "
                    502:   } {1 {database disk image is malformed}}
                    503: }
                    504: corruption_test -sqlprep {
                    505:   PRAGMA auto_vacuum = incremental;
                    506:   CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    507:   CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
                    508:   INSERT INTO t1 VALUES(1, randstr(100,100));
                    509:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    510:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    511:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    512:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    513:   INSERT INTO t1 SELECT NULL, randstr(100,100) FROM t1;
                    514:   INSERT INTO t2 SELECT * FROM t1;
                    515:   DELETE FROM t1;
                    516: } -corrupt {
                    517:   set pgno [expr [file size corrupt.db] / 1024]
                    518:   hexio_write corrupt.db [expr 1024+5*($pgno-3)] 03 
                    519:   hexio_write corrupt.db 24   12345678
                    520: } -test {
                    521:   do_test corrupt2-12.1 {
                    522:     catchsql " $::presql PRAGMA incremental_vacuum "
                    523:   } {1 {database disk image is malformed}}
                    524: }
                    525: 
                    526: ifcapable autovacuum {
                    527:   # It is not possible for the last page in a database file to be the
                    528:   # pending-byte page (AKA the locking page). This test verifies that if
                    529:   # an attempt is made to commit a transaction to such an auto-vacuum 
                    530:   # database SQLITE_CORRUPT is returned.
                    531:   #
                    532:   corruption_test -tclprep {
                    533:     db eval { 
                    534:       PRAGMA auto_vacuum = full;
                    535:       PRAGMA page_size = 1024;
                    536:       CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
                    537:       INSERT INTO t1 VALUES(NULL, randstr(50,50));
                    538:     }
                    539:     for {set ii 0} {$ii < 10} {incr ii} {
                    540:       db eval " $::presql INSERT INTO t1 SELECT NULL, randstr(50,50) FROM t1 "
                    541:     }
                    542:   } -corrupt {
                    543:     do_test corrupt2-13.1 {
                    544:       file size corrupt.db
                    545:     } $::sqlite_pending_byte
                    546:     hexio_write corrupt.db [expr $::sqlite_pending_byte+1023] 00
                    547:     hexio_write corrupt.db 28 00000000
                    548:   } -test {
                    549:     do_test corrupt2-13.2 {
                    550:       file size corrupt.db
                    551:     } [expr $::sqlite_pending_byte + 1024]
                    552:     do_test corrupt2-13.3 {
                    553:       catchsql { DELETE FROM t1 WHERE rowid < 30; }
                    554:     } {1 {database disk image is malformed}}
                    555:   }
                    556: }
                    557: 
                    558: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>