Annotation of embedaddon/sqlite3/test/shared6.test, revision 1.1
1.1 ! misho 1: # 2009 April 01
! 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: #
! 12: # $Id: shared6.test,v 1.4 2009/06/05 17:09:12 drh Exp $
! 13:
! 14: set testdir [file dirname $argv0]
! 15: source $testdir/tester.tcl
! 16: ifcapable !shared_cache { finish_test ; return }
! 17:
! 18: do_test shared6-1.1.1 {
! 19: execsql {
! 20: CREATE TABLE t1(a, b);
! 21: CREATE TABLE t2(c, d);
! 22: CREATE TABLE t3(e, f);
! 23: }
! 24: db close
! 25: } {}
! 26: do_test shared6-1.1.2 {
! 27: set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
! 28: sqlite3_enable_shared_cache
! 29: } {1}
! 30:
! 31: do_test shared6-1.1.3 {
! 32: sqlite3 db1 test.db
! 33: sqlite3 db2 test.db
! 34: } {}
! 35:
! 36: # Exclusive shared-cache locks. Test the following:
! 37: #
! 38: # 1.2.1: If [db1] has an exclusive lock, [db2] cannot read.
! 39: # 1.2.2: If [db1] has an exclusive lock, [db1] can read.
! 40: # 1.2.3: If [db1] has a non-exclusive write-lock, [db2] can read.
! 41: #
! 42: do_test shared6-1.2.1 {
! 43: execsql { SELECT * FROM t1 } db2 ;# Cache a compiled statement
! 44: execsql { BEGIN EXCLUSIVE } db1
! 45: catchsql { SELECT * FROM t1 } db2 ;# Execute the cached compiled statement
! 46: } {1 {database table is locked}}
! 47: do_test shared6-1.2.2 {
! 48: execsql { SELECT * FROM t1 } db1
! 49: } {}
! 50: do_test shared6-1.2.3 {
! 51: execsql {
! 52: COMMIT;
! 53: BEGIN;
! 54: INSERT INTO t2 VALUES(3, 4);
! 55: } db1
! 56: execsql { SELECT * FROM t1 } db2
! 57: } {}
! 58: do_test shared6-1.2.X {
! 59: execsql { COMMIT } db1
! 60: } {}
! 61:
! 62: # Regular shared-cache locks. Verify the following:
! 63: #
! 64: # 1.3.1: If [db1] has a write-lock on t1, [db1] can read from t1.
! 65: # 1.3.2: If [db1] has a write-lock on t1, [db2] can read from t2.
! 66: # 1.3.3: If [db1] has a write-lock on t1, [db2] cannot read from t1.
! 67: # 1.3.4: If [db1] has a write-lock on t1, [db2] cannot write to t1.
! 68: # 1.3.5: If [db1] has a read-lock on t1, [db2] can read from t1.
! 69: # 1.3.6: If [db1] has a read-lock on t1, [db2] cannot write to t1.
! 70: #
! 71: do_test shared6-1.3.1 {
! 72: execsql {
! 73: BEGIN;
! 74: INSERT INTO t1 VALUES(1, 2);
! 75: } db1
! 76: execsql { SELECT * FROM t1 } db1
! 77: } {1 2}
! 78: do_test shared6-1.3.2 {
! 79: execsql { SELECT * FROM t2 } db2
! 80: } {3 4}
! 81: do_test shared6-1.3.3 {
! 82: catchsql { SELECT * FROM t1 } db2
! 83: } {1 {database table is locked: t1}}
! 84: do_test shared6-1.3.4 {
! 85: catchsql { INSERT INTO t2 VALUES(1, 2) } db2
! 86: } {1 {database table is locked}}
! 87: do_test shared6-1.3.5 {
! 88: execsql {
! 89: COMMIT;
! 90: BEGIN;
! 91: SELECT * FROM t1;
! 92: } db1
! 93: execsql { SELECT * FROM t1 } db2
! 94: } {1 2}
! 95: do_test shared6-1.3.5 {
! 96: catchsql { INSERT INTO t1 VALUES(5, 6) } db2
! 97: } {1 {database table is locked: t1}}
! 98: do_test shared6-1.3.X {
! 99: execsql { COMMIT } db1
! 100: } {}
! 101:
! 102: # Read-uncommitted mode.
! 103: #
! 104: # For these tests, connection [db2] is in read-uncommitted mode.
! 105: #
! 106: # 1.4.1: If [db1] has a write-lock on t1, [db2] can still read from t1.
! 107: # 1.4.2: If [db1] has a write-lock on the db schema (sqlite_master table),
! 108: # [db2] cannot read from the schema.
! 109: # 1.4.3: If [db1] has a read-lock on t1, [db2] cannot write to t1.
! 110: #
! 111: do_test shared6-1.4.1 {
! 112: execsql { PRAGMA read_uncommitted = 1 } db2
! 113: execsql {
! 114: BEGIN;
! 115: INSERT INTO t1 VALUES(5, 6);
! 116: } db1
! 117: execsql { SELECT * FROM t1 } db2
! 118: } {1 2 5 6}
! 119: do_test shared6-1.4.2 {
! 120: execsql { CREATE TABLE t4(a, b) } db1
! 121: catchsql { SELECT * FROM t1 } db2
! 122: } {1 {database table is locked}}
! 123: do_test shared6-1.4.3 {
! 124: execsql {
! 125: COMMIT;
! 126: BEGIN;
! 127: SELECT * FROM t1;
! 128: } db1
! 129: catchsql { INSERT INTO t1 VALUES(7, 8) } db2
! 130: } {1 {database table is locked: t1}}
! 131:
! 132: do_test shared6-1.X {
! 133: db1 close
! 134: db2 close
! 135: } {}
! 136:
! 137: #-------------------------------------------------------------------------
! 138: # The following tests - shared6-2.* - test that two database connections
! 139: # that connect to the same file using different VFS implementations do
! 140: # not share a cache.
! 141: #
! 142: if {$::tcl_platform(platform) eq "unix"} {
! 143: do_test shared6-2.1 {
! 144: sqlite3 db1 test.db -vfs unix
! 145: sqlite3 db2 test.db -vfs unix
! 146: sqlite3 db3 test.db -vfs unix-none
! 147: sqlite3 db4 test.db -vfs unix-none
! 148: } {}
! 149:
! 150: do_test shared6-2.2 {
! 151: execsql { BEGIN; INSERT INTO t1 VALUES(9, 10); } db1
! 152: catchsql { SELECT * FROM t1 } db2
! 153: } {1 {database table is locked: t1}}
! 154: do_test shared6-2.3 {
! 155: execsql { SELECT * FROM t1 } db3
! 156: } {1 2 5 6}
! 157:
! 158: do_test shared6-2.3 {
! 159: execsql { COMMIT } db1
! 160: execsql { BEGIN; INSERT INTO t1 VALUES(11, 12); } db3
! 161: catchsql { SELECT * FROM t1 } db4
! 162: } {1 {database table is locked: t1}}
! 163:
! 164: do_test shared6-2.4 {
! 165: execsql { SELECT * FROM t1 } db1
! 166: } {1 2 5 6 9 10}
! 167:
! 168: do_test shared6-2.5 {
! 169: execsql { COMMIT } db3
! 170: } {}
! 171:
! 172: do_test shared6-2.X {
! 173: db1 close
! 174: db2 close
! 175: db3 close
! 176: db4 close
! 177: } {}
! 178: }
! 179:
! 180: #-------------------------------------------------------------------------
! 181: # Test that it is possible to open an exclusive transaction while
! 182: # already holding a read-lock on the database file. And that it is
! 183: # not possible if some other connection holds such a lock.
! 184: #
! 185: do_test shared6-3.1 {
! 186: sqlite3 db1 test.db
! 187: sqlite3 db2 test.db
! 188: sqlite3 db3 test.db
! 189: } {}
! 190: db1 eval {SELECT * FROM t1} {
! 191: # Within this block [db1] is holding a read-lock on t1. Test that
! 192: # this means t1 cannot be written by [db2].
! 193: #
! 194: do_test shared6-3.2 {
! 195: catchsql { INSERT INTO t1 VALUES(1, 2) } db2
! 196: } {1 {database table is locked: t1}}
! 197:
! 198: do_test shared6-3.3 {
! 199: execsql { BEGIN EXCLUSIVE } db1
! 200: } {}
! 201: break
! 202: }
! 203: do_test shared6-3.4 {
! 204: catchsql { SELECT * FROM t1 } db2
! 205: } {1 {database schema is locked: main}}
! 206: do_test shared6-3.5 {
! 207: execsql COMMIT db1
! 208: } {}
! 209: db2 eval {SELECT * FROM t1} {
! 210: do_test shared6-3.6 {
! 211: catchsql { BEGIN EXCLUSIVE } db1
! 212: } {1 {database table is locked}}
! 213: break
! 214: }
! 215: do_test shared6-3.7 {
! 216: execsql { BEGIN } db1
! 217: execsql { BEGIN } db2
! 218: } {}
! 219: db2 eval {SELECT * FROM t1} {
! 220: do_test shared6-3.8 {
! 221: catchsql { INSERT INTO t1 VALUES(1, 2) } db1
! 222: } {1 {database table is locked: t1}}
! 223: break
! 224: }
! 225: do_test shared6-3.9 {
! 226: execsql { BEGIN ; ROLLBACK } db3
! 227: } {}
! 228: do_test shared6-3.10 {
! 229: catchsql { SELECT * FROM t1 } db3
! 230: } {1 {database table is locked}}
! 231: do_test shared6-3.X {
! 232: db1 close
! 233: db2 close
! 234: db3 close
! 235: } {}
! 236:
! 237: do_test shared6-4.1 {
! 238: #forcedelete test.db test.db-journal
! 239: sqlite3 db1 test.db
! 240: sqlite3 db2 test.db
! 241:
! 242: set ::STMT [sqlite3_prepare_v2 db1 "SELECT * FROM t1" -1 DUMMY]
! 243: execsql { CREATE TABLE t5(a, b) } db2
! 244: } {}
! 245: do_test shared6-4.2 {
! 246: sqlite3_finalize $::STMT
! 247: } {SQLITE_OK}
! 248: do_test shared6-4.X {
! 249:
! 250: db1 close
! 251: db2 close
! 252: } {}
! 253:
! 254: sqlite3_enable_shared_cache $::enable_shared_cache
! 255: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>