OLD | NEW |
(Empty) | |
| 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 |
OLD | NEW |