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

1.1     ! misho       1: # 2010 November 1
        !             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 that WAL databases may be accessed without
        !            13: # using the xShm primitives if the connection is in exclusive-mode.
        !            14: #
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: set testprefix walnoshm
        !            19: ifcapable !wal {finish_test ; return }
        !            20: 
        !            21: db close
        !            22: testvfs tvfsshm
        !            23: testvfs tvfs -default 1 -iversion 1 
        !            24: sqlite3 db test.db
        !            25: 
        !            26: #--------------------------------------------------------------------------
        !            27: # Test that when using a version 1 VFS, a database can only be converted
        !            28: # to WAL mode after setting locking_mode=EXCLUSIVE. Also, test that if a
        !            29: # WAL database is opened using heap-memory for the WAL index, the connection
        !            30: # cannot change back to locking_mode=NORMAL while the database is still in
        !            31: # WAL mode.
        !            32: #
        !            33: do_execsql_test 1.1 {
        !            34:   CREATE TABLE t1(x, y);
        !            35:   INSERT INTO t1 VALUES(1, 2);
        !            36: }
        !            37: 
        !            38: do_execsql_test 1.2 { 
        !            39:   PRAGMA journal_mode = WAL;
        !            40:   SELECT * FROM t1;
        !            41: } {delete 1 2}
        !            42: do_test 1.3 { file exists test.db-wal } {0}
        !            43: 
        !            44: do_execsql_test 1.4 { 
        !            45:   PRAGMA locking_mode = exclusive;
        !            46:   PRAGMA journal_mode = WAL;
        !            47:   SELECT * FROM t1;
        !            48: } {exclusive wal 1 2}
        !            49: do_test 1.5 { file exists test.db-wal } {1}
        !            50: 
        !            51: do_execsql_test 1.6 { INSERT INTO t1 VALUES(3, 4) }
        !            52: 
        !            53: do_execsql_test 1.7 {
        !            54:   PRAGMA locking_mode = normal;
        !            55: } {exclusive}
        !            56: do_execsql_test 1.8 {
        !            57:   PRAGMA journal_mode = delete;
        !            58:   PRAGMA main.locking_mode;
        !            59: } {delete exclusive}
        !            60: do_execsql_test 1.9 {
        !            61:   PRAGMA locking_mode = normal;
        !            62: } {normal}
        !            63: do_execsql_test 1.10 {
        !            64:   SELECT * FROM t1;
        !            65: } {1 2 3 4}
        !            66: do_test 1.11 { file exists test.db-wal } {0}
        !            67: 
        !            68: #-------------------------------------------------------------------------
        !            69: #
        !            70: # 2.1.*: Test that a connection using a version 1 VFS can open a WAL database
        !            71: #        and convert it to rollback mode if it is set to use
        !            72: #        locking_mode=exclusive.
        !            73: #
        !            74: # 2.2.*: Test that if the exclusive lock cannot be obtained while attempting
        !            75: #        the above, the operation fails and the WAL file is not opened.
        !            76: #
        !            77: do_execsql_test 2.1.1 {
        !            78:   CREATE TABLE t2(x, y);
        !            79:   INSERT INTO t2 VALUES('a', 'b');
        !            80:   INSERT INTO t2 VALUES('c', 'd');
        !            81: }
        !            82: do_execsql_test 2.1.2 {
        !            83:   PRAGMA locking_mode = exclusive;
        !            84:   PRAGMA journal_mode = WAL;
        !            85:   INSERT INTO t2 VALUES('e', 'f');
        !            86:   INSERT INTO t2 VALUES('g', 'h');
        !            87: } {exclusive wal}
        !            88: 
        !            89: do_test 2.1.3 {
        !            90:   forcecopy test.db     test2.db
        !            91:   forcecopy test.db-wal test2.db-wal
        !            92:   sqlite3 db2 test2.db
        !            93:   catchsql { SELECT * FROM t2 } db2
        !            94: } {1 {unable to open database file}}
        !            95: do_test 2.1.4 {
        !            96:   catchsql { PRAGMA journal_mode = delete } db2
        !            97: } {1 {unable to open database file}}
        !            98: do_test 2.1.5 {
        !            99:   execsql { 
        !           100:     PRAGMA locking_mode = exclusive; 
        !           101:     PRAGMA journal_mode = delete;
        !           102:     SELECT * FROM t2;
        !           103:   } db2
        !           104: } {exclusive delete a b c d e f g h}
        !           105: 
        !           106: do_test 2.2.1 {
        !           107:   forcecopy test.db     test2.db
        !           108:   forcecopy test.db-wal test2.db-wal
        !           109:   sqlite3 db3 test2.db -vfs tvfsshm
        !           110:   sqlite3 db2 test2.db
        !           111:   execsql { SELECT * FROM t2 } db3
        !           112: } {a b c d e f g h}
        !           113: 
        !           114: do_test 2.2.2 {
        !           115:   execsql  { PRAGMA locking_mode = exclusive }  db2
        !           116:   catchsql { PRAGMA journal_mode = delete } db2
        !           117: } {1 {database is locked}}
        !           118: 
        !           119: do_test 2.2.3 {
        !           120:   # This is to test that [db2] is not holding a PENDING lock (which can 
        !           121:   # happen when an attempt to obtain an EXCLUSIVE lock fails).
        !           122:   sqlite3 db4 test2.db -vfs tvfsshm
        !           123:   execsql { SELECT * FROM t2 } db4
        !           124: } {a b c d e f g h}
        !           125: 
        !           126: do_test 2.2.4 {
        !           127:   catchsql { SELECT * FROM t2 } db2
        !           128: } {1 {database is locked}}
        !           129: 
        !           130: do_test 2.2.5 {
        !           131:   db4 close
        !           132:   sqlite3 db4 test2.db -vfs tvfsshm
        !           133:   execsql { SELECT * FROM t2 } db4
        !           134: } {a b c d e f g h}
        !           135: 
        !           136: do_test 2.2.6 {
        !           137:   db3 close
        !           138:   db4 close
        !           139:   execsql { SELECT * FROM t2 } db2
        !           140: } {a b c d e f g h}
        !           141: 
        !           142: db2 close
        !           143: db close
        !           144: 
        !           145: #-------------------------------------------------------------------------
        !           146: #
        !           147: # 3.1: Test that if locking_mode=EXCLUSIVE is set after the wal file is
        !           148: #      opened, it is possible to drop back to locking_mode=NORMAL.
        !           149: #
        !           150: # 3.2: Test that if locking_mode=EXCLUSIVE is set before the wal file is
        !           151: #      opened, it is not.
        !           152: #
        !           153: do_test 3.1 {
        !           154:   sqlite3 db test.db -vfs tvfsshm
        !           155:   execsql { 
        !           156:     SELECT * FROM t1;
        !           157:     PRAGMA locking_mode = EXCLUSIVE;
        !           158:     INSERT INTO t1 VALUES(5, 6);
        !           159:     PRAGMA locking_mode = NORMAL;
        !           160:     INSERT INTO t1 VALUES(7, 8);
        !           161:   }
        !           162:   sqlite3 db2 test.db -vfs tvfsshm
        !           163:   execsql { SELECT * FROM t1 } db2
        !           164: } {1 2 3 4 5 6 7 8}
        !           165: db close
        !           166: db2 close
        !           167: do_test 3.2 {
        !           168:   sqlite3 db  test.db -vfs tvfsshm
        !           169:   execsql { 
        !           170:     PRAGMA locking_mode = EXCLUSIVE;
        !           171:     INSERT INTO t1 VALUES(9, 10);
        !           172:     PRAGMA locking_mode = NORMAL;
        !           173:     INSERT INTO t1 VALUES(11, 12);
        !           174:   }
        !           175:   sqlite3 db2 test.db -vfs tvfsshm
        !           176:   catchsql { SELECT * FROM t1 } db2
        !           177: } {1 {database is locked}}
        !           178: db close
        !           179: db2 close
        !           180: 
        !           181: tvfs delete
        !           182: tvfsshm delete
        !           183: 
        !           184: finish_test

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