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

1.1       misho       1: # 2010 February 8
                      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 when
                     13: # recovering a database following a simulated system failure in 
                     14: # "PRAGMA journal_mode=WAL" mode.
                     15: #
                     16: 
                     17: #
                     18: # These are 'warm-body' tests of database recovery used while developing 
                     19: # the WAL code. They serve to prove that a few really simple cases work:
                     20: #
                     21: # walcrash-1.*: Recover a database.
                     22: # walcrash-2.*: Recover a database where the failed transaction spanned more
                     23: #               than one page.
                     24: # walcrash-3.*: Recover multiple databases where the failed transaction 
                     25: #               was a multi-file transaction.
                     26: #
                     27: 
                     28: set testdir [file dirname $argv0]
                     29: source $testdir/tester.tcl
                     30: ifcapable !wal {finish_test ; return }
                     31: 
                     32: db close
                     33: 
                     34: set seed 0
                     35: set REPEATS 100
                     36: 
                     37: # walcrash-1.*
                     38: #
                     39: for {set i 1} {$i < $REPEATS} {incr i} {
                     40:   forcedelete test.db test.db-wal
                     41:   do_test walcrash-1.$i.1 {
                     42:     crashsql -delay 4 -file test.db-wal -seed [incr seed] {
                     43:       PRAGMA journal_mode = WAL;
                     44:       CREATE TABLE t1(a, b);
                     45:       INSERT INTO t1 VALUES(1, 1);
                     46:       INSERT INTO t1 VALUES(2, 3);
                     47:       INSERT INTO t1 VALUES(3, 6);
                     48:     }
                     49:   } {1 {child process exited abnormally}}
                     50:   do_test walcrash-1.$i.2 {
                     51:     sqlite3 db test.db
                     52:     execsql { SELECT sum(a)==max(b) FROM t1 }
                     53:   } {1}
                     54:   integrity_check walcrash-1.$i.3
                     55:   db close
                     56:   
                     57:   do_test walcrash-1.$i.4 {
                     58:     crashsql -delay 2 -file test.db-wal -seed [incr seed] {
                     59:       INSERT INTO t1 VALUES(4, (SELECT sum(a) FROM t1) + 4);
                     60:       INSERT INTO t1 VALUES(5, (SELECT sum(a) FROM t1) + 5);
                     61:     }
                     62:   } {1 {child process exited abnormally}}
                     63:   do_test walcrash-1.$i.5 {
                     64:     sqlite3 db test.db
                     65:     execsql { SELECT sum(a)==max(b) FROM t1 }
                     66:   } {1}
                     67:   integrity_check walcrash-1.$i.6
                     68:   do_test walcrash-1.$i.7 {
                     69:     execsql { PRAGMA main.journal_mode }
                     70:   } {wal}
                     71:   db close
                     72: }
                     73: 
                     74: # walcrash-2.*
                     75: #
                     76: for {set i 1} {$i < $REPEATS} {incr i} {
                     77:   forcedelete test.db test.db-wal
                     78:   do_test walcrash-2.$i.1 {
                     79:     crashsql -delay 5 -file test.db-wal -seed [incr seed] {
                     80:       PRAGMA journal_mode = WAL;
                     81:       CREATE TABLE t1(a PRIMARY KEY, b);
                     82:       INSERT INTO t1 VALUES(1, 2);
                     83:       INSERT INTO t1 VALUES(3, 4);
                     84:       INSERT INTO t1 VALUES(5, 9);
                     85:     }
                     86:   } {1 {child process exited abnormally}}
                     87:   do_test walcrash-2.$i.2 {
                     88:     sqlite3 db test.db
                     89:     execsql { SELECT sum(a)==max(b) FROM t1 }
                     90:   } {1}
                     91:   integrity_check walcrash-2.$i.3
                     92:   db close
                     93:   
                     94:   do_test walcrash-2.$i.4 {
                     95:     crashsql -delay 2 -file test.db-wal -seed [incr seed] {
                     96:       INSERT INTO t1 VALUES(6, (SELECT sum(a) FROM t1) + 6);
                     97:       INSERT INTO t1 VALUES(7, (SELECT sum(a) FROM t1) + 7);
                     98:     }
                     99:   } {1 {child process exited abnormally}}
                    100:   do_test walcrash-2.$i.5 {
                    101:     sqlite3 db test.db
                    102:     execsql { SELECT sum(a)==max(b) FROM t1 }
                    103:   } {1}
                    104:   integrity_check walcrash-2.$i.6
                    105:   do_test walcrash-2.$i.6 {
                    106:     execsql { PRAGMA main.journal_mode }
                    107:   } {wal}
                    108:   db close
                    109: }
                    110: 
                    111: # walcrash-3.*
                    112: #
                    113: # for {set i 1} {$i < $REPEATS} {incr i} {
                    114: #   forcedelete test.db test.db-wal
                    115: #   forcedelete test2.db test2.db-wal
                    116: # 
                    117: #   do_test walcrash-3.$i.1 {
                    118: #     crashsql -delay 2 -file test2.db-wal -seed [incr seed] {
                    119: #       PRAGMA journal_mode = WAL;
                    120: #       ATTACH 'test2.db' AS aux;
                    121: #       CREATE TABLE t1(a PRIMARY KEY, b);
                    122: #       CREATE TABLE aux.t2(a PRIMARY KEY, b);
                    123: #       BEGIN;
                    124: #         INSERT INTO t1 VALUES(1, 2);
                    125: #         INSERT INTO t2 VALUES(1, 2);
                    126: #       COMMIT;
                    127: #     }
                    128: #   } {1 {child process exited abnormally}}
                    129: # 
                    130: #   do_test walcrash-3.$i.2 {
                    131: #     sqlite3_wal db test.db
                    132: #     execsql { 
                    133: #       ATTACH 'test2.db' AS aux;
                    134: #       SELECT * FROM t1 EXCEPT SELECT * FROM t2;
                    135: #     }
                    136: #   } {}
                    137: #   do_test walcrash-3.$i.3 { execsql { PRAGMA main.integrity_check } } {ok}
                    138: #   do_test walcrash-3.$i.4 { execsql { PRAGMA aux.integrity_check  } } {ok}
                    139: # 
                    140: #   db close
                    141: # }
                    142: 
                    143: # walcrash-4.*
                    144: #
                    145: for {set i 1} {$i < $REPEATS} {incr i} {
                    146:   forcedelete test.db test.db-wal
                    147:   forcedelete test2.db test2.db-wal
                    148: 
                    149:   do_test walcrash-4.$i.1 {
                    150:     crashsql -delay 4 -file test.db-wal -seed [incr seed] -blocksize 4096 {
                    151:       PRAGMA journal_mode = WAL;
                    152:       PRAGMA page_size = 1024;
                    153:       CREATE TABLE t1(a PRIMARY KEY, b);
                    154:       INSERT INTO t1 VALUES(1, 2);
                    155:       INSERT INTO t1 VALUES(3, 4);
                    156:     }
                    157:   } {1 {child process exited abnormally}}
                    158: 
                    159:   do_test walcrash-4.$i.2 {
                    160:     sqlite3 db test.db
                    161:     execsql { 
                    162:       SELECT * FROM t1 WHERE a = 1;
                    163:     }
                    164:   } {1 2}
                    165:   do_test walcrash-4.$i.3 { execsql { PRAGMA main.integrity_check } } {ok}
                    166:   do_test walcrash-4.$i.4 { execsql { PRAGMA main.journal_mode } } {wal}
                    167: 
                    168:   db close
                    169: }
                    170: 
                    171: # walcrash-5.*
                    172: #
                    173: for {set i 1} {$i < $REPEATS} {incr i} {
                    174:   forcedelete test.db test.db-wal
                    175:   forcedelete test2.db test2.db-wal
                    176: 
                    177:   do_test walcrash-5.$i.1 {
                    178:     crashsql -delay 13 -file test.db-wal -seed [incr seed] -blocksize 4096 {
                    179:       PRAGMA journal_mode = WAL;
                    180:       PRAGMA page_size = 1024;
                    181:       BEGIN;
                    182:         CREATE TABLE t1(x PRIMARY KEY);
                    183:         INSERT INTO t1 VALUES(randomblob(900));
                    184:         INSERT INTO t1 VALUES(randomblob(900));
                    185:         INSERT INTO t1 SELECT randomblob(900) FROM t1;           /* 4 */
                    186:       COMMIT;
                    187:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 8 */
                    188:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 12 */
                    189:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 16 */
                    190:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 20 */
                    191:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 24 */
                    192:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 28 */
                    193:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 32 */
                    194: 
                    195:       PRAGMA wal_checkpoint;
                    196:       INSERT INTO t1 VALUES(randomblob(900));
                    197:       INSERT INTO t1 VALUES(randomblob(900));
                    198:       INSERT INTO t1 VALUES(randomblob(900));
                    199:     }
                    200:   } {1 {child process exited abnormally}}
                    201: 
                    202:   do_test walcrash-5.$i.2 {
                    203:     sqlite3 db test.db
                    204:     execsql { SELECT count(*)==33 OR count(*)==34 FROM t1 WHERE x != 1 }
                    205:   } {1}
                    206:   do_test walcrash-5.$i.3 { execsql { PRAGMA main.integrity_check } } {ok}
                    207:   do_test walcrash-5.$i.4 { execsql { PRAGMA main.journal_mode } } {wal}
                    208: 
                    209:   db close
                    210: }
                    211: 
                    212: # walcrash-6.*
                    213: #
                    214: for {set i 1} {$i < $REPEATS} {incr i} {
                    215:   forcedelete test.db test.db-wal
                    216:   forcedelete test2.db test2.db-wal
                    217: 
                    218:   do_test walcrash-6.$i.1 {
                    219:     crashsql -delay 14 -file test.db-wal -seed [incr seed] -blocksize 512 {
                    220:       PRAGMA journal_mode = WAL;
                    221:       PRAGMA page_size = 1024;
                    222:       BEGIN;
                    223:         CREATE TABLE t1(x PRIMARY KEY);
                    224:         INSERT INTO t1 VALUES(randomblob(900));
                    225:         INSERT INTO t1 VALUES(randomblob(900));
                    226:         INSERT INTO t1 SELECT randomblob(900) FROM t1;           /* 4 */
                    227:       COMMIT;
                    228:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 8 */
                    229:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 12 */
                    230:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 16 */
                    231:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 20 */
                    232:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 24 */
                    233:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 28 */
                    234:       INSERT INTO t1 SELECT randomblob(900) FROM t1 LIMIT 4;   /* 32 */
                    235: 
                    236:       PRAGMA wal_checkpoint;
                    237:       INSERT INTO t1 VALUES(randomblob(9000));
                    238:       INSERT INTO t1 VALUES(randomblob(9000));
                    239:       INSERT INTO t1 VALUES(randomblob(9000));
                    240:     }
                    241:   } {1 {child process exited abnormally}}
                    242: 
                    243:   do_test walcrash-6.$i.2 {
                    244:     sqlite3 db test.db
                    245:     execsql { SELECT count(*)==34 OR count(*)==35 FROM t1 WHERE x != 1 }
                    246:   } {1}
                    247:   do_test walcrash-6.$i.3 { execsql { PRAGMA main.integrity_check } } {ok}
                    248:   do_test walcrash-6.$i.4 { execsql { PRAGMA main.journal_mode } } {wal}
                    249: 
                    250:   db close
                    251: }
                    252: 
                    253: #-------------------------------------------------------------------------
                    254: # This test case simulates a crash while checkpointing the database. Page
                    255: # 1 is one of the pages overwritten by the checkpoint. This is a special
                    256: # case because it means the content of page 1 may be damaged. SQLite will
                    257: # have to determine:
                    258: #
                    259: #   (a) that the database is a WAL database, and 
                    260: #   (b) the database page-size
                    261: #
                    262: # based on the log file.
                    263: #
                    264: for {set i 1} {$i < $REPEATS} {incr i} {
                    265:   forcedelete test.db test.db-wal
                    266: 
                    267:   # Select a page-size for this test.
                    268:   #
                    269:   set pgsz [lindex {512 1024 2048 4096 8192 16384} [expr $i%6]]
                    270: 
                    271:   do_test walcrash-7.$i.1 {
                    272:     crashsql -delay 3 -file test.db -seed [incr seed] -blocksize 512 "
                    273:       PRAGMA page_size = $pgsz;
                    274:       PRAGMA journal_mode = wal;
                    275:       BEGIN;
                    276:         CREATE TABLE t1(a, b);
                    277:         INSERT INTO t1 VALUES(1, 2);
                    278:       COMMIT;
                    279:       PRAGMA wal_checkpoint;
                    280:       CREATE INDEX i1 ON t1(a);
                    281:       PRAGMA wal_checkpoint;
                    282:     "
                    283:   } {1 {child process exited abnormally}}
                    284: 
                    285:   do_test walcrash-7.$i.2 {
                    286:     sqlite3 db test.db
                    287:     execsql { SELECT b FROM t1 WHERE a = 1 }
                    288:   } {2}
                    289:   do_test walcrash-7.$i.3 { execsql { PRAGMA main.integrity_check } } {ok}
                    290:   do_test walcrash-7.$i.4 { execsql { PRAGMA main.journal_mode } } {wal}
                    291: 
                    292:   db close
                    293: }
                    294: 
                    295: finish_test
                    296: 

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