Annotation of embedaddon/sqlite3/test/walcrash.test, revision 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>