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

1.1       misho       1: # 2010 May 03
                      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.  The
                     12: # focus of this file is testing the operation of the library in
                     13: # "PRAGMA journal_mode=WAL" mode.
                     14: #
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: source $testdir/malloc_common.tcl
                     19: source $testdir/lock_common.tcl
                     20: 
                     21: ifcapable !wal {finish_test ; return }
                     22: 
                     23: #-------------------------------------------------------------------------
                     24: # This test case, walfault-1-*, simulates faults while executing a
                     25: #
                     26: #   PRAGMA journal_mode = WAL;
                     27: #
                     28: # statement immediately after creating a new database.
                     29: #
                     30: do_test walfault-1-pre-1 {
                     31:   faultsim_delete_and_reopen
                     32:   faultsim_save_and_close
                     33: } {}
                     34: do_faultsim_test walfault-1 -prep {
                     35:   faultsim_restore_and_reopen
                     36: } -body {
                     37:   db eval { PRAGMA main.journal_mode = WAL }
                     38: } -test {
                     39: 
                     40:   faultsim_test_result {0 wal}
                     41: 
                     42:   # Test that the connection that encountered an error as part of 
                     43:   # "PRAGMA journal_mode = WAL" and a new connection use the same
                     44:   # journal mode when accessing the database.
                     45:   #
                     46:   # If "PRAGMA journal_mode" is executed immediately, connection [db] (the 
                     47:   # one that hit the error in journal_mode="WAL") might return "wal" even 
                     48:   # if it failed to switch the database to WAL mode. This is not considered 
                     49:   # a problem. When it tries to read the database, connection [db] correctly 
                     50:   # recognizes that it is a rollback database and switches back to a 
                     51:   # rollback compatible journal mode.
                     52:   #
                     53:   if {[permutation] != "inmemory_journal"} {
                     54:     set jm  [db one  {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}]
                     55:     sqlite3 db2 test.db
                     56:     set jm2 [db2 one {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}]
                     57:     db2 close
                     58:   
                     59:     if { $jm!=$jm2 } { error "Journal modes do not match: $jm $jm2" }
                     60:     if { $testrc==0 && $jm!="wal" } { error "Journal mode is not WAL" }
                     61:   }
                     62: }
                     63: 
                     64: #--------------------------------------------------------------------------
                     65: # Test case walfault-2-* tests fault injection during recovery of a 
                     66: # short WAL file (a dozen frames or thereabouts).
                     67: #
                     68: do_test walfault-2-pre-1 {
                     69:   sqlite3 db test.db
                     70:   execsql {
                     71:     PRAGMA journal_mode = WAL;
                     72:     BEGIN;
                     73:       CREATE TABLE x(y, z, UNIQUE(y, z));
                     74:       INSERT INTO x VALUES(randomblob(100), randomblob(100));
                     75:     COMMIT;
                     76:     PRAGMA wal_checkpoint;
                     77: 
                     78:     INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
                     79:     INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
                     80:     INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
                     81:   }
                     82:   execsql {
                     83:     SELECT count(*) FROM x
                     84:   }
                     85: } {8}
                     86: do_test walfault-2-pre-2 {
                     87:   faultsim_save_and_close
                     88:   faultsim_restore_and_reopen
                     89:   execsql { SELECT count(*) FROM x }
                     90: } {8}
                     91: do_faultsim_test walfault-2 -prep {
                     92:   faultsim_restore_and_reopen
                     93: } -body {
                     94:   execsql { SELECT count(*) FROM x }
                     95: } -test {
                     96:   faultsim_test_result {0 8}
                     97:   faultsim_integrity_check
                     98: }
                     99: 
                    100: #--------------------------------------------------------------------------
                    101: # Test fault injection while writing and checkpointing a small WAL file.
                    102: #
                    103: do_test walfault-3-pre-1 {
                    104:   sqlite3 db test.db
                    105:   execsql {
                    106:     PRAGMA auto_vacuum = 1;
                    107:     PRAGMA journal_mode = WAL;
                    108:     CREATE TABLE abc(a PRIMARY KEY);
                    109:     INSERT INTO abc VALUES(randomblob(1500));
                    110:   }
                    111:   db close
                    112:   faultsim_save_and_close
                    113: } {}
                    114: do_faultsim_test walfault-3 -prep {
                    115:   faultsim_restore_and_reopen
                    116: } -body {
                    117:   db eval {
                    118:     DELETE FROM abc;
                    119:     PRAGMA wal_checkpoint;
                    120:   }
                    121:   set {} {}
                    122: } -test {
                    123:   faultsim_test_result {0 {}}
                    124: }
                    125: 
                    126: #--------------------------------------------------------------------------
                    127: #
                    128: if {[permutation] != "inmemory_journal"} {
                    129:   faultsim_delete_and_reopen
                    130:   faultsim_save_and_close
                    131:   do_faultsim_test walfault-4 -prep {
                    132:     faultsim_restore_and_reopen
                    133:   } -body {
                    134:     execsql {
                    135:       PRAGMA auto_vacuum = 0;
                    136:       PRAGMA journal_mode = WAL;
                    137:       CREATE TABLE t1(a PRIMARY KEY, b);
                    138:       INSERT INTO t1 VALUES('a', 'b');
                    139:       PRAGMA wal_checkpoint;
                    140:       SELECT * FROM t1;
                    141:     }
                    142:   } -test {
                    143:     # Update: The following changed from {0 {wal 0 7 7 a b}} as a result
                    144:     # of PSOW being set by default.
                    145:     faultsim_test_result {0 {wal 0 5 5 a b}}
                    146:     faultsim_integrity_check
                    147:   } 
                    148: }
                    149: 
                    150: #--------------------------------------------------------------------------
                    151: #
                    152: do_test walfault-5-pre-1 {
                    153:   faultsim_delete_and_reopen
                    154:   execsql {
                    155:     PRAGMA page_size = 512;
                    156:     PRAGMA journal_mode = WAL;
                    157:   }
                    158:   faultsim_save_and_close
                    159: } {}
                    160: do_faultsim_test walfault-5 -faults shmerr* -prep {
                    161:   faultsim_restore_and_reopen
                    162:   execsql { PRAGMA wal_autocheckpoint = 0 }
                    163:   shmfault filter xShmMap
                    164: } -body {
                    165:   execsql {
                    166:     CREATE TABLE t1(x);
                    167:     BEGIN;
                    168:       INSERT INTO t1 VALUES(randomblob(400));           /* 1 */
                    169:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 2 */
                    170:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 4 */
                    171:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 8 */
                    172:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 16 */
                    173:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 32 */
                    174:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 64 */
                    175:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 128 */
                    176:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 256 */
                    177:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 512 */
                    178:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 1024 */
                    179:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 2048 */
                    180:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 4096 */
                    181:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 8192 */
                    182:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 16384 */
                    183:     COMMIT;
                    184:     SELECT count(*) FROM t1;
                    185:   }
                    186: } -test {
                    187:   faultsim_test_result {0 16384}
                    188:   faultsim_integrity_check
                    189: }
                    190: 
                    191: #--------------------------------------------------------------------------
                    192: #
                    193: do_test walfault-6-pre-1 {
                    194:   faultsim_delete_and_reopen
                    195:   execsql {
                    196:     PRAGMA page_size = 512;
                    197:     PRAGMA journal_mode = WAL;
                    198:     PRAGMA wal_autocheckpoint = 0;
                    199:     CREATE TABLE t1(x);
                    200:     BEGIN;
                    201:       INSERT INTO t1 VALUES(randomblob(400));           /* 1 */
                    202:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 2 */
                    203:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 4 */
                    204:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 8 */
                    205:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 16 */
                    206:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 32 */
                    207:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 64 */
                    208:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 128 */
                    209:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 256 */
                    210:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 512 */
                    211:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 1024 */
                    212:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 2048 */
                    213:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 4096 */
                    214:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 8192 */
                    215:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 16384 */
                    216:     COMMIT;
                    217:   }
                    218:   faultsim_save_and_close
                    219: } {}
                    220: do_faultsim_test walfault-6 -faults shmerr* -prep {
                    221:   faultsim_restore_and_reopen
                    222:   shmfault filter xShmMap
                    223: } -body {
                    224:   execsql { SELECT count(*) FROM t1 }
                    225: } -test {
                    226:   faultsim_test_result {0 16384}
                    227:   faultsim_integrity_check
                    228:   set n [db one {SELECT count(*) FROM t1}]
                    229:   if {$n != 16384 && $n != 0} { error "Incorrect number of rows: $n" }
                    230: }
                    231: 
                    232: #--------------------------------------------------------------------------
                    233: #
                    234: do_test walfault-7-pre-1 {
                    235:   faultsim_delete_and_reopen
                    236:   execsql {
                    237:     PRAGMA page_size = 512;
                    238:     PRAGMA journal_mode = WAL;
                    239:     PRAGMA wal_autocheckpoint = 0;
                    240:     CREATE TABLE t1(x);
                    241:     BEGIN;
                    242:       INSERT INTO t1 VALUES(randomblob(400));           /* 1 */
                    243:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 2 */
                    244:       INSERT INTO t1 SELECT randomblob(400) FROM t1;    /* 4 */
                    245:     COMMIT;
                    246:   }
                    247:   faultsim_save_and_close
                    248: } {}
                    249: do_faultsim_test walfault-7 -prep {
                    250:   faultsim_restore_and_reopen
                    251: } -body {
                    252:   execsql { SELECT count(*) FROM t1 }
                    253: } -test {
                    254:   faultsim_test_result {0 4}
                    255:   set n [db one {SELECT count(*) FROM t1}]
                    256:   if {$n != 4 && $n != 0} { error "Incorrect number of rows: $n" }
                    257: }
                    258: 
                    259: #--------------------------------------------------------------------------
                    260: #
                    261: do_test walfault-8-pre-1 {
                    262:   faultsim_delete_and_reopen
                    263:   execsql {
                    264:     PRAGMA journal_mode = WAL;
                    265:     CREATE TABLE abc(a PRIMARY KEY);
                    266:     INSERT INTO abc VALUES(randomblob(900));
                    267:   }
                    268:   faultsim_save_and_close
                    269: } {}
                    270: do_faultsim_test walfault-8 -prep {
                    271:   faultsim_restore_and_reopen
                    272:   execsql { PRAGMA cache_size = 10 }
                    273: } -body {
                    274:   execsql {
                    275:     BEGIN;
                    276:       INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 1 */
                    277:       --INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 2 */
                    278:       --INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 4 */
                    279:       --INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 8 */
                    280:     ROLLBACK;
                    281:     SELECT count(*) FROM abc;
                    282:   }
                    283: } -test {
                    284:   faultsim_test_result {0 1}
                    285: 
                    286:   faultsim_integrity_check
                    287:   catch { db eval ROLLBACK }
                    288:   faultsim_integrity_check
                    289: 
                    290:   set n [db one {SELECT count(*) FROM abc}]
                    291:   if {$n != 1} { error "Incorrect number of rows: $n" }
                    292: }
                    293: 
                    294: #--------------------------------------------------------------------------
                    295: #
                    296: do_test walfault-9-pre-1 {
                    297:   faultsim_delete_and_reopen
                    298:   execsql {
                    299:     PRAGMA journal_mode = WAL;
                    300:     CREATE TABLE abc(a PRIMARY KEY);
                    301:     INSERT INTO abc VALUES(randomblob(900));
                    302:   }
                    303:   faultsim_save_and_close
                    304: } {}
                    305: do_faultsim_test walfault-9 -prep {
                    306:   #if {$iFail<73} { set iFail 73 }
                    307:   #if {$iFail>73} { exit }
                    308:   
                    309:   faultsim_restore_and_reopen
                    310:   execsql { PRAGMA cache_size = 10 }
                    311: } -body {
                    312:   execsql {
                    313:     BEGIN;
                    314:       INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 1 */
                    315:       SAVEPOINT spoint;
                    316:         INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 2 */
                    317:         INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 4 */
                    318:         INSERT INTO abc SELECT randomblob(900) FROM abc;    /* 8 */
                    319:       ROLLBACK TO spoint;
                    320:     COMMIT;
                    321:     SELECT count(*) FROM abc;
                    322:   }
                    323: } -test {
                    324:   faultsim_test_result {0 2}
                    325:   faultsim_integrity_check
                    326: 
                    327:   catch { db eval { ROLLBACK TO spoint } }
                    328:   catch { db eval { COMMIT } }
                    329:   set n [db one {SELECT count(*) FROM abc}]
                    330:   if {$n != 1 && $n != 2} { error "Incorrect number of rows: $n" }
                    331: }
                    332: 
                    333: do_test walfault-10-pre1 {
                    334:   faultsim_delete_and_reopen
                    335:   execsql {
                    336:     PRAGMA journal_mode = WAL;
                    337:     PRAGMA wal_autocheckpoint = 0;
                    338:     CREATE TABLE z(zz INTEGER PRIMARY KEY, zzz BLOB);
                    339:     CREATE INDEX zzzz ON z(zzz);
                    340:     INSERT INTO z VALUES(NULL, randomblob(800));
                    341:     INSERT INTO z VALUES(NULL, randomblob(800));
                    342:     INSERT INTO z SELECT NULL, randomblob(800) FROM z;
                    343:     INSERT INTO z SELECT NULL, randomblob(800) FROM z;
                    344:     INSERT INTO z SELECT NULL, randomblob(800) FROM z;
                    345:     INSERT INTO z SELECT NULL, randomblob(800) FROM z;
                    346:     INSERT INTO z SELECT NULL, randomblob(800) FROM z;
                    347:   }
                    348:   faultsim_save_and_close
                    349: } {}
                    350: do_faultsim_test walfault-10 -prep {
                    351:   faultsim_restore_and_reopen
                    352:   execsql {
                    353:     PRAGMA cache_size = 10;
                    354:     BEGIN;
                    355:       UPDATE z SET zzz = randomblob(799);
                    356:   }
                    357: 
                    358:   set ::stmt [sqlite3_prepare db "SELECT zzz FROM z WHERE zz IN (1, 2, 3)" -1]
                    359:   sqlite3_step $::stmt
                    360: } -body {
                    361:   execsql { INSERT INTO z VALUES(NULL, NULL) }
                    362: } -test {
                    363:   sqlite3_finalize $::stmt
                    364:   faultsim_integrity_check
                    365: 
                    366:   faultsim_test_result {0 {}}
                    367:   catch { db eval { ROLLBACK } }
                    368:   faultsim_integrity_check
                    369: 
                    370:   set n [db eval {SELECT count(*), sum(length(zzz)) FROM z}]
                    371:   if {$n != "64 51200"} { error "Incorrect data: $n" }
                    372: }
                    373: 
                    374: #--------------------------------------------------------------------------
                    375: # Test fault injection while checkpointing a large WAL file, if the 
                    376: # checkpoint is the first operation run after opening the database.
                    377: # This means that some of the required wal-index pages are mapped as part of
                    378: # the checkpoint process, which means there are a few more opportunities
                    379: # for IO errors.
                    380: #
                    381: # To speed this up, IO errors are only simulated within xShmMap() calls.
                    382: #
                    383: do_test walfault-11-pre-1 {
                    384:   sqlite3 db test.db
                    385:   execsql {
                    386:     PRAGMA journal_mode = WAL;
                    387:     PRAGMA wal_autocheckpoint = 0;
                    388:     BEGIN;
                    389:       CREATE TABLE abc(a PRIMARY KEY);
                    390:       INSERT INTO abc VALUES(randomblob(1500));
                    391:       INSERT INTO abc VALUES(randomblob(1500));
                    392:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --    4
                    393:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --    8
                    394:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --   16
                    395:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --   32
                    396:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --   64
                    397:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --  128
                    398:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --  256
                    399:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   --  512
                    400:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   -- 1024
                    401:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   -- 2048
                    402:       INSERT INTO abc SELECT randomblob(1500) FROM abc;   -- 4096
                    403:     COMMIT;
                    404:   }
                    405:   faultsim_save_and_close
                    406: } {}
                    407: do_faultsim_test walfault-11 -faults shmerr* -prep {
                    408:   catch { db2 close }
                    409:   faultsim_restore_and_reopen
                    410:   shmfault filter xShmMap
                    411: } -body {
                    412:   db eval { SELECT count(*) FROM abc }
                    413:   sqlite3 db2 test.db -vfs shmfault
                    414:   db2 eval { PRAGMA wal_checkpoint }
                    415:   set {} {}
                    416: } -test {
                    417:   faultsim_test_result {0 {}}
                    418: }
                    419: 
                    420: #-------------------------------------------------------------------------
                    421: # Test the handling of the various IO/OOM/SHM errors that may occur during 
                    422: # a log recovery operation undertaken as part of a call to 
                    423: # sqlite3_wal_checkpoint().
                    424: # 
                    425: do_test walfault-12-pre-1 {
                    426:   faultsim_delete_and_reopen
                    427:   execsql {
                    428:     PRAGMA journal_mode = WAL;
                    429:     PRAGMA wal_autocheckpoint = 0;
                    430:     BEGIN;
                    431:       CREATE TABLE abc(a PRIMARY KEY);
                    432:       INSERT INTO abc VALUES(randomblob(1500));
                    433:       INSERT INTO abc VALUES(randomblob(1500));
                    434:     COMMIT;
                    435:   }
                    436:   faultsim_save_and_close
                    437: } {}
                    438: do_faultsim_test walfault-12 -prep {
                    439:   if {[info commands shmfault] == ""} {
                    440:     testvfs shmfault -default true
                    441:   }
                    442:   faultsim_restore_and_reopen
                    443:   db eval { SELECT * FROM sqlite_master }
                    444:   shmfault shm test.db [string repeat "\000" 40]
                    445: } -body {
                    446:   set rc [sqlite3_wal_checkpoint db]
                    447:   if {$rc != "SQLITE_OK"} { error [sqlite3_errmsg db] }
                    448: } -test {
                    449:   db close
                    450:   faultsim_test_result {0 {}}
                    451: }
                    452: 
                    453: #-------------------------------------------------------------------------
                    454: # Test simple recovery, reading and writing a database file using a 
                    455: # heap-memory wal-index.
                    456: # 
                    457: do_test walfault-13-pre-1 {
                    458:   faultsim_delete_and_reopen
                    459:   execsql {
                    460:     PRAGMA journal_mode = WAL;
                    461:     PRAGMA wal_autocheckpoint = 0;
                    462:     BEGIN;
                    463:       CREATE TABLE abc(a PRIMARY KEY);
                    464:       INSERT INTO abc VALUES(randomblob(1500));
                    465:       INSERT INTO abc VALUES(randomblob(1500));
                    466:     COMMIT;
                    467:   }
                    468:   faultsim_save_and_close
                    469:   delete_file sv_test.db-shm
                    470: } {}
                    471: 
                    472: do_faultsim_test walfault-13.1 -prep {
                    473:   faultsim_restore_and_reopen
                    474: } -body {
                    475:   db eval { PRAGMA locking_mode = exclusive }
                    476:   db eval { SELECT count(*) FROM abc }
                    477: } -test {
                    478:   faultsim_test_result {0 2}
                    479:   if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
                    480:   faultsim_integrity_check
                    481: }
                    482: 
                    483: do_faultsim_test walfault-13.2 -prep {
                    484:   faultsim_restore_and_reopen
                    485:   db eval { PRAGMA locking_mode = exclusive }
                    486: } -body {
                    487:   db eval { PRAGMA journal_mode = delete }
                    488: } -test {
                    489:   faultsim_test_result {0 delete}
                    490:   if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
                    491:   faultsim_integrity_check
                    492: }
                    493: 
                    494: do_test walfault-13-pre-2 {
                    495:   faultsim_delete_and_reopen
                    496:   execsql {
                    497:     BEGIN;
                    498:       CREATE TABLE abc(a PRIMARY KEY);
                    499:       INSERT INTO abc VALUES(randomblob(1500));
                    500:       INSERT INTO abc VALUES(randomblob(1500));
                    501:     COMMIT;
                    502:   }
                    503:   faultsim_save_and_close
                    504: } {}
                    505: 
                    506: do_faultsim_test walfault-13.3 -prep {
                    507:   faultsim_restore_and_reopen
                    508: } -body {
                    509:   db eval { 
                    510:     PRAGMA locking_mode = exclusive;
                    511:     PRAGMA journal_mode = WAL;
                    512:     INSERT INTO abc VALUES(randomblob(1500));
                    513:   }
                    514: } -test {
                    515:   faultsim_test_result {0 {exclusive wal}}
                    516:   if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
                    517:   faultsim_integrity_check
                    518:   set nRow [db eval {SELECT count(*) FROM abc}]
                    519:   if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" }
                    520: }
                    521: 
                    522: #-------------------------------------------------------------------------
                    523: # Test fault-handling when wrapping around to the start of a WAL file.
                    524: #
                    525: do_test walfault-14-pre {
                    526:   faultsim_delete_and_reopen
                    527:   execsql {
                    528:     PRAGMA auto_vacuum = 0;
                    529:     PRAGMA journal_mode = WAL;
                    530:     BEGIN;
                    531:       CREATE TABLE abc(a PRIMARY KEY);
                    532:       INSERT INTO abc VALUES(randomblob(1500));
                    533:       INSERT INTO abc VALUES(randomblob(1500));
                    534:     COMMIT;
                    535:   }
                    536:   faultsim_save_and_close
                    537: } {}
                    538: do_faultsim_test walfault-14 -prep {
                    539:   faultsim_restore_and_reopen
                    540: } -body {
                    541:   db eval { 
                    542:     PRAGMA wal_checkpoint = full;
                    543:     INSERT INTO abc VALUES(randomblob(1500));
                    544:   }
                    545: } -test {
                    546:   faultsim_test_result {0 {0 9 9}}
                    547:   faultsim_integrity_check
                    548:   set nRow [db eval {SELECT count(*) FROM abc}]
                    549:   if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" }
                    550: }
                    551: finish_test
                    552: 
                    553: finish_test

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