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

1.1       misho       1: # 2010 April 22
                      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/wal_common.tcl
                     19: source $testdir/malloc_common.tcl
                     20: 
                     21: do_not_use_codec
                     22: 
                     23: ifcapable !wal {finish_test ; return }
                     24: 
                     25: 
                     26: # Test organization:
                     27: # 
                     28: #   walback-1.*: Simple tests.
                     29: #
                     30: #   walback-2.*: Test backups when the source db is modified mid-backup.
                     31: #
                     32: #   walback-3.*: Backup of WAL sources into rollback destinations, and 
                     33: #                vice-versa.
                     34: #
                     35: 
                     36: # Make sure a simple backup from a WAL database works.
                     37: #
                     38: do_test walbak-1.0 {
                     39:   execsql { 
                     40:     PRAGMA synchronous = NORMAL;
                     41:     PRAGMA page_size = 1024;
                     42:     PRAGMA auto_vacuum = 0;
                     43:     PRAGMA journal_mode = wal;
                     44:     BEGIN;
                     45:       CREATE TABLE t1(a PRIMARY KEY, b);
                     46:       INSERT INTO t1 VALUES('I', 'one');
                     47:     COMMIT;
                     48:   }
                     49: } {wal}
                     50: do_test walbak-1.1 {
                     51:   forcedelete bak.db bak.db-journal bak.db-wal
                     52:   db backup bak.db
                     53:   file size bak.db
                     54: } [expr 3*1024]
                     55: do_test walbak-1.2 {
                     56:   sqlite3 db2 bak.db
                     57:   execsql { 
                     58:     SELECT * FROM t1;
                     59:     PRAGMA main.journal_mode;
                     60:   } db2
                     61: } {I one wal}
                     62: do_test walbak-1.3 {
                     63:   execsql { PRAGMA integrity_check } db2
                     64: } {ok}
                     65: db2 close
                     66: 
                     67: # Try a VACUUM on a WAL database.
                     68: #
                     69: do_test walbak-1.4 {
                     70:   execsql { 
                     71:     VACUUM;
                     72:     PRAGMA main.journal_mode;
                     73:   }
                     74: } {wal}
                     75: do_test walbak-1.5 {
                     76:   list [file size test.db] [file size test.db-wal]
                     77: } [list 1024 [wal_file_size 6 1024]]
                     78: do_test walbak-1.6 {
                     79:   execsql { PRAGMA wal_checkpoint }
                     80:   list [file size test.db] [file size test.db-wal]
                     81: } [list [expr 3*1024] [wal_file_size 6 1024]]
                     82: do_test walbak-1.6.1 {
                     83:   hexio_read test.db 18 2
                     84: } {0202}
                     85: do_test walbak-1.7 {
                     86:   execsql { 
                     87:     CREATE TABLE t2(a, b);
                     88:     INSERT INTO t2 SELECT * FROM t1;
                     89:     DROP TABLE t1;
                     90:   }
                     91:   list [file size test.db] [file size test.db-wal]
                     92: } [list [expr 3*1024] [wal_file_size 6 1024]]
                     93: do_test walbak-1.8 {
                     94:   execsql { VACUUM }
                     95:   list [file size test.db] [file size test.db-wal]
                     96: } [list [expr 3*1024] [wal_file_size 8 1024]]
                     97: do_test walbak-1.9 {
                     98:   execsql { PRAGMA wal_checkpoint }
                     99:   list [file size test.db] [file size test.db-wal]
                    100: } [list [expr 2*1024] [wal_file_size 8 1024]]
                    101: 
                    102: #-------------------------------------------------------------------------
                    103: # Backups when the source db is modified mid-backup.
                    104: #
                    105: proc sig {{db db}} {
                    106:   $db eval { 
                    107:     PRAGMA integrity_check;
                    108:     SELECT md5sum(a, b) FROM t1; 
                    109:   }
                    110: }
                    111: db close
                    112: delete_file test.db
                    113: sqlite3 db test.db
                    114: do_test walbak-2.1 {
                    115:   execsql { PRAGMA journal_mode = WAL }
                    116:   execsql {
                    117:     CREATE TABLE t1(a PRIMARY KEY, b);
                    118:     BEGIN;
                    119:       INSERT INTO t1 VALUES(randomblob(500), randomblob(500));
                    120:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /*  2 */
                    121:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /*  4 */
                    122:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /*  8 */
                    123:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /* 16 */
                    124:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /* 32 */
                    125:       INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; /* 64 */
                    126:     COMMIT;
                    127:   }
                    128: } {}
                    129: do_test walbak-2.2 {
                    130:   db backup abc.db
                    131:   sqlite3 db2 abc.db
                    132:   string compare [sig db] [sig db2]
                    133: } {0}
                    134: 
                    135: do_test walbak-2.3 {
                    136:   sqlite3_backup B db2 main db main
                    137:   B step 50
                    138:   execsql { UPDATE t1 SET b = randomblob(500) }
                    139:   list [B step 1000] [B finish]
                    140: } {SQLITE_DONE SQLITE_OK}
                    141: do_test walbak-2.4 {
                    142:   string compare [sig db] [sig db2]
                    143: } {0}
                    144: 
                    145: do_test walbak-2.5 {
                    146:   db close
                    147:   sqlite3 db test.db
                    148:   execsql { PRAGMA cache_size = 10 }
                    149:   sqlite3_backup B db2 main db main
                    150:   B step 50
                    151:   execsql {
                    152:     BEGIN;
                    153:       UPDATE t1 SET b = randomblob(500);
                    154:   }
                    155:   expr [file size test.db-wal] > 10*1024
                    156: } {1}
                    157: do_test walbak-2.6 {
                    158:   B step 1000
                    159: } {SQLITE_BUSY}
                    160: do_test walbak-2.7 {
                    161:   execsql COMMIT
                    162:   list [B step 1000] [B finish]
                    163: } {SQLITE_DONE SQLITE_OK}
                    164: do_test walbak-2.8 {
                    165:   string compare [sig db] [sig db2]
                    166: } {0}
                    167: 
                    168: do_test walbak-2.9 {
                    169:   db close
                    170:   sqlite3 db test.db
                    171:   execsql { PRAGMA cache_size = 10 }
                    172:   sqlite3_backup B db2 main db main
                    173:   B step 50
                    174:   execsql {
                    175:     BEGIN;
                    176:       UPDATE t1 SET b = randomblob(500);
                    177:   }
                    178:   expr [file size test.db-wal] > 10*1024
                    179: } {1}
                    180: do_test walbak-2.10 {
                    181:   B step 1000
                    182: } {SQLITE_BUSY}
                    183: do_test walbak-2.11 {
                    184:   execsql ROLLBACK
                    185: set sigB [sig db]
                    186:   list [B step 1000] [B finish]
                    187: } {SQLITE_DONE SQLITE_OK}
                    188: do_test walbak-2.12 {
                    189:   string compare [sig db] [sig db2]
                    190: } {0}
                    191: db2 close
                    192: db close
                    193: 
                    194: #-------------------------------------------------------------------------
                    195: # Run some backup operations to copy back and forth between WAL and:
                    196: #
                    197: #   walbak-3.1.*: an in-memory database
                    198: #
                    199: #   walbak-3.2.*: a temporary database
                    200: #
                    201: #   walbak-3.3.*: a database in rollback mode.
                    202: #
                    203: #   walbak-3.4.*: a database in rollback mode that (initially) uses a 
                    204: #                 different page-size.
                    205: #
                    206: # Check that this does not confuse any connected clients.
                    207: #
                    208: foreach {tn setup} {
                    209:   1 {
                    210:     sqlite3 db  test.db
                    211:     sqlite3 db2 :memory:
                    212:     db  eval { PRAGMA page_size = 1024 ; PRAGMA journal_mode = WAL }
                    213:     db2 eval { PRAGMA page_size = 1024 }
                    214:   }
                    215: 
                    216:   2 {
                    217:     sqlite3 db  test.db
                    218:     sqlite3 db2 ""
                    219:     db  eval { PRAGMA page_size = 1024 ; PRAGMA journal_mode = WAL }
                    220:     db2 eval { PRAGMA page_size = 1024 }
                    221:   }
                    222: 
                    223:   3 {
                    224:     sqlite3 db  test.db
                    225:     sqlite3 db2 test.db2
                    226:     db  eval { PRAGMA page_size = 1024 ; PRAGMA journal_mode = WAL }
                    227:     db2 eval { PRAGMA page_size = 1024 ; PRAGMA journal_mode = PERSIST }
                    228:   }
                    229: 
                    230:   4 {
                    231:     sqlite3 db  test.db
                    232:     sqlite3 db2 test.db2
                    233:     db  eval { PRAGMA page_size = 1024 ; PRAGMA journal_mode = WAL }
                    234:     db2 eval { 
                    235:       PRAGMA page_size = 2048;
                    236:       PRAGMA journal_mode = PERSIST;
                    237:       CREATE TABLE xx(x);
                    238:     }
                    239:   }
                    240: 
                    241: } {
                    242:   foreach f [glob -nocomplain test.db*] { forcedelete $f }
                    243: 
                    244:   eval $setup
                    245: 
                    246:   do_test walbak-3.$tn.1 {
                    247:     execsql {
                    248:       CREATE TABLE t1(a, b);
                    249:       INSERT INTO t1 VALUES(1, 2);
                    250:       INSERT INTO t1 VALUES(3, 4);
                    251:       SELECT * FROM t1;
                    252:     }
                    253:   } {1 2 3 4}
                    254: 
                    255:   do_test walbak-3.$tn.2 {
                    256:     sqlite3_backup B db2 main db main
                    257:     B step 10000
                    258:     B finish
                    259:     execsql { SELECT * FROM t1 } db2
                    260:   } {1 2 3 4}
                    261: 
                    262:   do_test walbak-3.$tn.3 {
                    263:     execsql {
                    264:       INSERT INTO t1 VALUES(5, 6);
                    265:       INSERT INTO t1 VALUES(7, 8);
                    266:       SELECT * FROM t1;
                    267:     } db2
                    268:   } {1 2 3 4 5 6 7 8}
                    269: 
                    270:   do_test walbak-3.$tn.4 {
                    271:     sqlite3_backup B db main db2 main
                    272:     B step 10000
                    273:     B finish
                    274:     execsql { SELECT * FROM t1 }
                    275:   } {1 2 3 4 5 6 7 8}
                    276: 
                    277:   # Check that [db] is still in WAL mode.
                    278:   do_test walbak-3.$tn.5 {
                    279:     execsql { PRAGMA journal_mode }
                    280:   } {wal}
                    281:   do_test walbak-3.$tn.6 {
                    282:     execsql { PRAGMA wal_checkpoint }
                    283:     hexio_read test.db 18 2
                    284:   } {0202}
                    285: 
                    286:   # If it was not an in-memory database, check that [db2] is still in
                    287:   # rollback mode.
                    288:   if {[file exists test.db2]} {
                    289:     do_test walbak-3.$tn.7 {
                    290:       execsql { PRAGMA journal_mode } db2
                    291:     } {wal}
                    292:     do_test walbak-3.$tn.8 {
                    293:       execsql { PRAGMA wal_checkpoint }
                    294:       hexio_read test.db 18 2
                    295:     } {0202}
                    296:   }
                    297: 
                    298:   db  close
                    299:   db2 close
                    300: }
                    301: 
                    302: #-------------------------------------------------------------------------
                    303: # Test that the following holds when a backup operation is run:
                    304: #
                    305: #   Source  |  Destination inital  |  Destination final
                    306: #   ---------------------------------------------------
                    307: #   Rollback   Rollback               Rollback
                    308: #   Rollback   WAL                    WAL
                    309: #   WAL        Rollback               WAL
                    310: #   WAL        WAL                    WAL
                    311: #
                    312: foreach {tn src dest dest_final} {
                    313:   1   delete    delete    delete
                    314:   2   delete    wal       wal
                    315:   3   wal       delete    wal
                    316:   4   wal       wal       wal
                    317: } {
                    318:   catch { db close } 
                    319:   catch { db2 close } 
                    320:   forcedelete test.db test.db2
                    321: 
                    322:   do_test walbak-4.$tn.1 {
                    323:     sqlite3 db test.db
                    324:     db eval "PRAGMA journal_mode = $src"
                    325:     db eval {
                    326:       CREATE TABLE t1(a, b);
                    327:       INSERT INTO t1 VALUES('I', 'II');
                    328:       INSERT INTO t1 VALUES('III', 'IV');
                    329:     }
                    330: 
                    331:     sqlite3 db2 test.db2
                    332:     db2 eval "PRAGMA journal_mode = $dest"
                    333:     db2 eval {
                    334:       CREATE TABLE t2(x, y);
                    335:       INSERT INTO t2 VALUES('1', '2');
                    336:       INSERT INTO t2 VALUES('3', '4');
                    337:     }
                    338:   } {}
                    339: 
                    340:   do_test walbak-4.$tn.2 { execsql { PRAGMA journal_mode } db  } $src
                    341:   do_test walbak-4.$tn.3 { execsql { PRAGMA journal_mode } db2 } $dest
                    342: 
                    343:   do_test walbak-4.$tn.4 { db backup test.db2 } {}
                    344:   do_test walbak-4.$tn.5 {
                    345:     execsql { SELECT * FROM t1 } db2
                    346:   } {I II III IV}
                    347:   do_test walbak-4.$tn.5 { execsql { PRAGMA journal_mode } db2 } $dest_final
                    348: 
                    349: 
                    350:   db2 close
                    351:   do_test walbak-4.$tn.6 { file exists test.db2-wal } 0
                    352:   sqlite3 db2 test.db2
                    353:   do_test walbak-4.$tn.7 { execsql { PRAGMA journal_mode } db2 } $dest_final
                    354: }
                    355: 
                    356: 
                    357: finish_test

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