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