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>