Annotation of embedaddon/sqlite3/test/crash3.test, revision 1.1

1.1     ! misho       1: # 2007 August 23
        !             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: #
        !            12: # This file contains tests that verify that SQLite can correctly rollback
        !            13: # databases after crashes when using the special IO modes triggered 
        !            14: # by device IOCAP flags.
        !            15: #
        !            16: # $Id: crash3.test,v 1.4 2008/07/12 14:52:20 drh Exp $
        !            17: 
        !            18: set testdir [file dirname $argv0]
        !            19: source $testdir/tester.tcl
        !            20: 
        !            21: ifcapable !crashtest {
        !            22:   finish_test
        !            23:   return
        !            24: }
        !            25: 
        !            26: proc do_test2 {name tcl res1 res2} {
        !            27:   set script [subst -nocommands {
        !            28:     do_test $name {
        !            29:       set res1 {$res1}
        !            30:       set res2 {$res2}
        !            31:       set res [eval {$tcl}]
        !            32:       if {[set res] eq [set res1] || [set res] eq [set res2]} {
        !            33:         set res "{[set res1]} or {[set res2]}"
        !            34:       }
        !            35:       set res
        !            36:     } {{$res1} or {$res2}}
        !            37:   }]
        !            38:   uplevel $script
        !            39: }
        !            40: 
        !            41: # This block tests crash-recovery when the IOCAP_ATOMIC flags is set.
        !            42: #
        !            43: # Each iteration of the following loop sets up the database to contain
        !            44: # the following schema and data:
        !            45: #
        !            46: #    CREATE TABLE abc(a, b, c);
        !            47: #    INSERT INTO abc VALUES(1, 2, 3);
        !            48: #
        !            49: # Then execute the SQL statement, scheduling a crash for part-way through
        !            50: # the first sync() of either the database file or the journal file (often
        !            51: # the journal file is not required - meaning no crash occurs).
        !            52: #
        !            53: # After the crash (or absence of a crash), open the database and 
        !            54: # verify that:
        !            55: #
        !            56: #   * The integrity check passes, and
        !            57: #   * The contents of table abc is either {1 2 3} or the value specified
        !            58: #     to the right of the SQL statement below.
        !            59: #
        !            60: # The procedure is repeated 10 times for each SQL statement. Five times
        !            61: # with the crash scheduled for midway through the first journal sync (if 
        !            62: # any), and five times with the crash midway through the database sync.
        !            63: #
        !            64: set tn 1
        !            65: foreach {sql res2} [list \
        !            66:   {INSERT INTO abc VALUES(4, 5, 6)}                    {1 2 3 4 5 6} \
        !            67:   {DELETE FROM abc}                                    {}    \
        !            68:   {INSERT INTO abc SELECT * FROM abc}                  {1 2 3 1 2 3} \
        !            69:   {UPDATE abc SET a = 2}                               {2 2 3}       \
        !            70:   {INSERT INTO abc VALUES(4, 5, randstr(1000,1000))}   {n/a} \
        !            71:   {CREATE TABLE def(d, e, f)}                          {n/a} \
        !            72: ] {
        !            73:   for {set ii 0} {$ii < 10} {incr ii} {
        !            74: 
        !            75:     db close
        !            76:     forcedelete test.db test.db-journal
        !            77:     sqlite3 db test.db
        !            78:     do_test crash3-1.$tn.1 {
        !            79:       execsql {
        !            80:         PRAGMA page_size = 1024;
        !            81:         BEGIN;
        !            82:         CREATE TABLE abc(a, b, c);
        !            83:         INSERT INTO abc VALUES(1, 2, 3);
        !            84:         COMMIT;
        !            85:       }
        !            86:     } {}
        !            87:     db close
        !            88:   
        !            89:     set crashfile test.db
        !            90:     if {($ii%2)==0} { append crashfile -journal }
        !            91:     set rand "SELECT randstr($tn,$tn);"
        !            92:     do_test crash3-1.$tn.2 [subst {
        !            93:       crashsql -file $crashfile -char atomic {$rand $sql}
        !            94:       sqlite3 db test.db
        !            95:       execsql { PRAGMA integrity_check; }
        !            96:     }] {ok}
        !            97:   
        !            98:     do_test2 crash3-1.$tn.3 {
        !            99:       execsql { SELECT * FROM abc }
        !           100:     } {1 2 3} $res2
        !           101: 
        !           102:     incr tn
        !           103:   }
        !           104: }
        !           105: 
        !           106: # This block tests both the IOCAP_SEQUENTIAL and IOCAP_SAFE_APPEND flags.
        !           107: #
        !           108: db close
        !           109: forcedelete test.db test.db-journal
        !           110: sqlite3 db test.db
        !           111: do_test crash3-2.0 {
        !           112:   execsql {
        !           113:     BEGIN;
        !           114:     CREATE TABLE abc(a PRIMARY KEY, b, c);
        !           115:     CREATE TABLE def(d PRIMARY KEY, e, f);
        !           116:     PRAGMA default_cache_size = 10;
        !           117:     INSERT INTO abc VALUES(randstr(10,1000),randstr(10,1000),randstr(10,1000));
        !           118:     INSERT INTO abc 
        !           119:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           120:     INSERT INTO abc 
        !           121:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           122:     INSERT INTO abc 
        !           123:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           124:     INSERT INTO abc 
        !           125:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           126:     INSERT INTO abc 
        !           127:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           128:     INSERT INTO abc 
        !           129:       SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) FROM abc;
        !           130:     COMMIT;
        !           131:   }
        !           132: } {}
        !           133: 
        !           134: set tn 1
        !           135: foreach {::crashfile ::delay ::char} {
        !           136:   test.db         1 sequential
        !           137:   test.db         1 safe_append
        !           138:   test.db-journal 1 sequential
        !           139:   test.db-journal 1 safe_append
        !           140:   test.db-journal 2 safe_append
        !           141:   test.db-journal 2 sequential
        !           142:   test.db-journal 3 sequential
        !           143:   test.db-journal 3 safe_append
        !           144: } {
        !           145:   for {set ii 0} {$ii < 100} {incr ii} {
        !           146:     set ::SQL [subst {
        !           147:       SELECT randstr($ii,$ii+10);
        !           148:       BEGIN;
        !           149:       DELETE FROM abc WHERE random()%5;
        !           150:       INSERT INTO abc 
        !           151:         SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) 
        !           152:         FROM abc
        !           153:         WHERE (random()%5)==0;
        !           154:       DELETE FROM def WHERE random()%5;
        !           155:       INSERT INTO def 
        !           156:         SELECT randstr(10,1000),randstr(10,1000),randstr(10,1000) 
        !           157:         FROM def
        !           158:         WHERE (random()%5)==0;
        !           159:       COMMIT;
        !           160:     }]
        !           161: 
        !           162:     do_test crash3-2.$tn.$ii {
        !           163:       crashsql -file $::crashfile -delay $::delay -char $::char $::SQL
        !           164:       db close
        !           165:       sqlite3 db test.db
        !           166:       execsql {PRAGMA integrity_check}
        !           167:     } {ok}
        !           168:   }
        !           169:   incr tn
        !           170: }
        !           171: 
        !           172: # The following block tests an interaction between IOCAP_ATOMIC and
        !           173: # IOCAP_SEQUENTIAL. At one point, if both flags were set, small
        !           174: # journal files that contained only a single page, but were required 
        !           175: # for some other reason (i.e. nTrunk) were not being written to
        !           176: # disk.
        !           177: #
        !           178: for {set ii 0} {$ii < 10} {incr ii} {
        !           179:   db close
        !           180:   forcedelete test.db test.db-journal
        !           181:   crashsql -file test.db -char {sequential atomic} {
        !           182:     CREATE TABLE abc(a, b, c);
        !           183:   }
        !           184:   sqlite3 db test.db
        !           185:   do_test crash3-3.$ii {
        !           186:     execsql {PRAGMA integrity_check}
        !           187:   } {ok}
        !           188: }
        !           189: 
        !           190: finish_test

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