Annotation of embedaddon/sqlite3/test/walmode.test, revision 1.1
1.1 ! misho 1: # 2010 April 19
! 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/malloc_common.tcl
! 19:
! 20: # If the library was compiled without WAL support, check that the
! 21: # "PRAGMA journal_mode=WAL" treats "WAL" as an unrecognized mode.
! 22: #
! 23: ifcapable !wal {
! 24:
! 25: do_test walmode-0.1 {
! 26: execsql { PRAGMA journal_mode = wal }
! 27: } {delete}
! 28: do_test walmode-0.2 {
! 29: execsql { PRAGMA main.journal_mode = wal }
! 30: } {delete}
! 31: do_test walmode-0.3 {
! 32: execsql { PRAGMA main.journal_mode }
! 33: } {delete}
! 34:
! 35: finish_test
! 36: return
! 37: }
! 38:
! 39: do_test walmode-1.1 {
! 40: set sqlite_sync_count 0
! 41: execsql { PRAGMA page_size = 1024 }
! 42: execsql { PRAGMA journal_mode = wal }
! 43: } {wal}
! 44: do_test walmode-1.2 {
! 45: file size test.db
! 46: } {1024}
! 47:
! 48: set expected_sync_count 3
! 49: if {$::tcl_platform(platform)!="windows"} {
! 50: ifcapable dirsync {
! 51: incr expected_sync_count
! 52: }
! 53: }
! 54: do_test walmode-1.3 {
! 55: set sqlite_sync_count
! 56: } $expected_sync_count
! 57:
! 58: do_test walmode-1.4 {
! 59: file exists test.db-wal
! 60: } {0}
! 61: do_test walmode-1.5 {
! 62: execsql { CREATE TABLE t1(a, b) }
! 63: file size test.db
! 64: } {1024}
! 65: do_test walmode-1.6 {
! 66: file exists test.db-wal
! 67: } {1}
! 68: do_test walmode-1.7 {
! 69: db close
! 70: file exists test.db-wal
! 71: } {0}
! 72:
! 73: # There is now a database file with the read and write versions set to 2
! 74: # in the file system. This file should default to WAL mode.
! 75: #
! 76: do_test walmode-2.1 {
! 77: sqlite3 db test.db
! 78: file exists test.db-wal
! 79: } {0}
! 80: do_test walmode-2.2 {
! 81: execsql { SELECT * FROM sqlite_master }
! 82: file exists test.db-wal
! 83: } {1}
! 84: do_test walmode-2.3 {
! 85: db close
! 86: file exists test.db-wal
! 87: } {0}
! 88:
! 89: # If the first statement executed is "PRAGMA journal_mode = wal", and
! 90: # the file is already configured for WAL (read and write versions set
! 91: # to 2), then there should be no need to write the database. The
! 92: # statement should cause the client to connect to the log file.
! 93: #
! 94: set sqlite_sync_count 0
! 95: do_test walmode-3.1 {
! 96: sqlite3 db test.db
! 97: execsql { PRAGMA journal_mode = wal }
! 98: } {wal}
! 99: do_test walmode-3.2 {
! 100: list $sqlite_sync_count [file exists test.db-wal] [file size test.db-wal]
! 101: } {0 1 0}
! 102:
! 103: # Test that changing back to journal_mode=persist works.
! 104: #
! 105: do_test walmode-4.1 {
! 106: execsql { INSERT INTO t1 VALUES(1, 2) }
! 107: execsql { PRAGMA journal_mode = persist }
! 108: } {persist}
! 109: do_test walmode-4.2 {
! 110: list [file exists test.db-journal] [file exists test.db-wal]
! 111: } {1 0}
! 112: do_test walmode-4.3 {
! 113: execsql { SELECT * FROM t1 }
! 114: } {1 2}
! 115: do_test walmode-4.4 {
! 116: db close
! 117: sqlite3 db test.db
! 118: execsql { SELECT * FROM t1 }
! 119: } {1 2}
! 120: do_test walmode-4.5 {
! 121: list [file exists test.db-journal] [file exists test.db-wal]
! 122: } {1 0}
! 123:
! 124: # Test that nothing goes wrong if a connection is prevented from changing
! 125: # from WAL to rollback mode because a second connection has the database
! 126: # open. Or from rollback to WAL.
! 127: #
! 128: do_test walmode-4.6 {
! 129: sqlite3 db2 test.db
! 130: execsql { PRAGMA main.journal_mode } db2
! 131: } {delete}
! 132: do_test walmode-4.7 {
! 133: execsql { PRAGMA main.journal_mode = wal } db
! 134: } {wal}
! 135: do_test walmode-4.8 {
! 136: execsql { SELECT * FROM t1 } db2
! 137: } {1 2}
! 138: do_test walmode-4.9 {
! 139: catchsql { PRAGMA journal_mode = delete } db
! 140: } {1 {database is locked}}
! 141: do_test walmode-4.10 {
! 142: execsql { PRAGMA main.journal_mode } db
! 143: } {wal}
! 144:
! 145: do_test walmode-4.11 {
! 146: db2 close
! 147: execsql { PRAGMA journal_mode = delete } db
! 148: } {delete}
! 149: do_test walmode-4.12 {
! 150: execsql { PRAGMA main.journal_mode } db
! 151: } {delete}
! 152: do_test walmode-4.13 {
! 153: list [file exists test.db-journal] [file exists test.db-wal]
! 154: } {0 0}
! 155: do_test walmode-4.14 {
! 156: sqlite3 db2 test.db
! 157: execsql {
! 158: BEGIN;
! 159: SELECT * FROM t1;
! 160: } db2
! 161: } {1 2}
! 162:
! 163: do_test walmode-4.16 { execsql { PRAGMA main.journal_mode } db } {delete}
! 164: do_test walmode-4.17 { execsql { PRAGMA main.journal_mode } db2 } {delete}
! 165:
! 166: do_test walmode-4.17 {
! 167: catchsql { PRAGMA main.journal_mode = wal } db
! 168: } {1 {database is locked}}
! 169: do_test walmode-4.18 {
! 170: execsql { PRAGMA main.journal_mode } db
! 171: } {delete}
! 172: catch { db close }
! 173: catch { db2 close }
! 174:
! 175: # Test that it is not possible to change a temporary or in-memory database
! 176: # to WAL mode. WAL mode is for persistent file-backed databases only.
! 177: #
! 178: # walmode-5.1.*: Try to set journal_mode=WAL on [sqlite3 db :memory:] database.
! 179: # walmode-5.2.*: Try to set journal_mode=WAL on [sqlite3 db ""] database.
! 180: # walmode-5.3.*: Try to set temp.journal_mode=WAL.
! 181: #
! 182: do_test walmode-5.1.1 {
! 183: sqlite3 db :memory:
! 184: execsql { PRAGMA main.journal_mode }
! 185: } {memory}
! 186: do_test walmode-5.1.2 {
! 187: execsql { PRAGMA main.journal_mode = wal }
! 188: } {memory}
! 189: do_test walmode-5.1.3 {
! 190: execsql {
! 191: BEGIN;
! 192: CREATE TABLE t1(a, b);
! 193: INSERT INTO t1 VALUES(1, 2);
! 194: COMMIT;
! 195: SELECT * FROM t1;
! 196: PRAGMA main.journal_mode;
! 197: }
! 198: } {1 2 memory}
! 199: do_test walmode-5.1.4 {
! 200: execsql { PRAGMA main.journal_mode = wal }
! 201: } {memory}
! 202: do_test walmode-5.1.5 {
! 203: execsql {
! 204: INSERT INTO t1 VALUES(3, 4);
! 205: SELECT * FROM t1;
! 206: PRAGMA main.journal_mode;
! 207: }
! 208: } {1 2 3 4 memory}
! 209:
! 210: if {$TEMP_STORE>=2} {
! 211: set tempJrnlMode memory
! 212: } else {
! 213: set tempJrnlMode delete
! 214: }
! 215: do_test walmode-5.2.1 {
! 216: sqlite3 db ""
! 217: execsql { PRAGMA main.journal_mode }
! 218: } $tempJrnlMode
! 219: do_test walmode-5.2.2 {
! 220: execsql { PRAGMA main.journal_mode = wal }
! 221: } $tempJrnlMode
! 222: do_test walmode-5.2.3 {
! 223: execsql {
! 224: BEGIN;
! 225: CREATE TABLE t1(a, b);
! 226: INSERT INTO t1 VALUES(1, 2);
! 227: COMMIT;
! 228: SELECT * FROM t1;
! 229: PRAGMA main.journal_mode;
! 230: }
! 231: } [list 1 2 $tempJrnlMode]
! 232: do_test walmode-5.2.4 {
! 233: execsql { PRAGMA main.journal_mode = wal }
! 234: } $tempJrnlMode
! 235: do_test walmode-5.2.5 {
! 236: execsql {
! 237: INSERT INTO t1 VALUES(3, 4);
! 238: SELECT * FROM t1;
! 239: PRAGMA main.journal_mode;
! 240: }
! 241: } [list 1 2 3 4 $tempJrnlMode]
! 242:
! 243: do_test walmode-5.3.1 {
! 244: sqlite3 db test.db
! 245: execsql { PRAGMA temp.journal_mode }
! 246: } $tempJrnlMode
! 247: do_test walmode-5.3.2 {
! 248: execsql { PRAGMA temp.journal_mode = wal }
! 249: } $tempJrnlMode
! 250: do_test walmode-5.3.3 {
! 251: execsql {
! 252: BEGIN;
! 253: CREATE TEMP TABLE t1(a, b);
! 254: INSERT INTO t1 VALUES(1, 2);
! 255: COMMIT;
! 256: SELECT * FROM t1;
! 257: PRAGMA temp.journal_mode;
! 258: }
! 259: } [list 1 2 $tempJrnlMode]
! 260: do_test walmode-5.3.4 {
! 261: execsql { PRAGMA temp.journal_mode = wal }
! 262: } $tempJrnlMode
! 263: do_test walmode-5.3.5 {
! 264: execsql {
! 265: INSERT INTO t1 VALUES(3, 4);
! 266: SELECT * FROM t1;
! 267: PRAGMA temp.journal_mode;
! 268: }
! 269: } [list 1 2 3 4 $tempJrnlMode]
! 270:
! 271:
! 272: #-------------------------------------------------------------------------
! 273: # Test changing to WAL mode from journal_mode=off or journal_mode=memory
! 274: #
! 275: foreach {tn mode} {
! 276: 1 off
! 277: 2 memory
! 278: 3 persist
! 279: 4 delete
! 280: 5 truncate
! 281: } {
! 282: do_test walmode-6.$tn {
! 283: faultsim_delete_and_reopen
! 284: execsql "
! 285: PRAGMA journal_mode = $mode;
! 286: PRAGMA journal_mode = wal;
! 287: "
! 288: } [list $mode wal]
! 289: }
! 290: db close
! 291:
! 292: #-------------------------------------------------------------------------
! 293: # Test the effect of a "PRAGMA journal_mode" command being the first
! 294: # thing executed by a new connection. This means that the schema is not
! 295: # loaded when sqlite3_prepare_v2() is called to compile the statement.
! 296: #
! 297: do_test walmode-7.0 {
! 298: forcedelete test.db
! 299: sqlite3 db test.db
! 300: execsql {
! 301: PRAGMA journal_mode = WAL;
! 302: CREATE TABLE t1(a, b);
! 303: }
! 304: } {wal}
! 305: foreach {tn sql result} {
! 306: 1 "PRAGMA journal_mode" wal
! 307: 2 "PRAGMA main.journal_mode" wal
! 308: 3 "PRAGMA journal_mode = delete" delete
! 309: 4 "PRAGMA journal_mode" delete
! 310: 5 "PRAGMA main.journal_mode" delete
! 311: 6 "PRAGMA journal_mode = wal" wal
! 312: 7 "PRAGMA journal_mode" wal
! 313: 8 "PRAGMA main.journal_mode" wal
! 314:
! 315: 9 "PRAGMA journal_mode" wal
! 316: 10 "PRAGMA main.journal_mode" wal
! 317: 11 "PRAGMA main.journal_mode = delete" delete
! 318: 12 "PRAGMA journal_mode" delete
! 319: 13 "PRAGMA main.journal_mode" delete
! 320: 14 "PRAGMA main.journal_mode = wal" wal
! 321: 15 "PRAGMA journal_mode" wal
! 322: 16 "PRAGMA main.journal_mode" wal
! 323: } {
! 324: do_test walmode-7.$tn {
! 325: db close
! 326: sqlite3 db test.db
! 327: execsql $sql
! 328: } $result
! 329: }
! 330: db close
! 331:
! 332: #-------------------------------------------------------------------------
! 333: # Test the effect of a "PRAGMA journal_mode" command on an attached
! 334: # database.
! 335: #
! 336: faultsim_delete_and_reopen
! 337: do_execsql_test walmode-8.1 {
! 338: CREATE TABLE t1(a, b);
! 339: PRAGMA journal_mode = WAL;
! 340: ATTACH 'test.db2' AS two;
! 341: CREATE TABLE two.t2(a, b);
! 342: } {wal}
! 343: do_execsql_test walmode-8.2 { PRAGMA main.journal_mode } {wal}
! 344: do_execsql_test walmode-8.3 { PRAGMA two.journal_mode } {delete}
! 345: do_execsql_test walmode-8.4 { PRAGMA two.journal_mode = DELETE } {delete}
! 346:
! 347: db close
! 348: sqlite3 db test.db
! 349: do_execsql_test walmode-8.5 { ATTACH 'test.db2' AS two } {}
! 350: do_execsql_test walmode-8.6 { PRAGMA main.journal_mode } {wal}
! 351: do_execsql_test walmode-8.7 { PRAGMA two.journal_mode } {delete}
! 352: do_execsql_test walmode-8.8 { INSERT INTO two.t2 DEFAULT VALUES } {}
! 353: do_execsql_test walmode-8.9 { PRAGMA two.journal_mode } {delete}
! 354: do_execsql_test walmode-8.10 { INSERT INTO t1 DEFAULT VALUES } {}
! 355: do_execsql_test walmode-8.11 { PRAGMA main.journal_mode } {wal}
! 356: do_execsql_test walmode-8.12 { PRAGMA journal_mode } {wal}
! 357:
! 358: # Change to WAL mode on test2.db and make sure (in the tests that follow)
! 359: # that this mode change persists.
! 360: do_test walmode-8.x1 {
! 361: execsql {
! 362: PRAGMA two.journal_mode=WAL;
! 363: PRAGMA two.journal_mode;
! 364: }
! 365: } {wal wal}
! 366:
! 367: db close
! 368: sqlite3 db test.db
! 369: do_execsql_test walmode-8.13 { PRAGMA journal_mode = WAL } {wal}
! 370: do_execsql_test walmode-8.14 { ATTACH 'test.db2' AS two } {}
! 371: do_execsql_test walmode-8.15 { PRAGMA main.journal_mode } {wal}
! 372: do_execsql_test walmode-8.16 { PRAGMA two.journal_mode } {wal}
! 373: do_execsql_test walmode-8.17 { INSERT INTO two.t2 DEFAULT VALUES } {}
! 374: do_execsql_test walmode-8.18 { PRAGMA two.journal_mode } {wal}
! 375:
! 376: sqlite3 db2 test.db2
! 377: do_test walmode-8.19 { execsql { PRAGMA main.journal_mode } db2 } {wal}
! 378: db2 close
! 379:
! 380: do_execsql_test walmode-8.20 { PRAGMA journal_mode = DELETE } {delete}
! 381: do_execsql_test walmode-8.21 { PRAGMA main.journal_mode } {delete}
! 382: do_execsql_test walmode-8.22 { PRAGMA two.journal_mode } {delete}
! 383: do_execsql_test walmode-8.21 { PRAGMA journal_mode = WAL } {wal}
! 384: do_execsql_test walmode-8.21 { PRAGMA main.journal_mode } {wal}
! 385: do_execsql_test walmode-8.22 { PRAGMA two.journal_mode } {wal}
! 386:
! 387: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>