15b413d78Sdanielk1977# 2009 April 01 25b413d78Sdanielk1977# 35b413d78Sdanielk1977# The author disclaims copyright to this source code. In place of 45b413d78Sdanielk1977# a legal notice, here is a blessing: 55b413d78Sdanielk1977# 65b413d78Sdanielk1977# May you do good and not evil. 75b413d78Sdanielk1977# May you find forgiveness for yourself and forgive others. 85b413d78Sdanielk1977# May you share freely, never taking more than you give. 95b413d78Sdanielk1977# 105b413d78Sdanielk1977#*********************************************************************** 115b413d78Sdanielk1977# 12dda70fe3Sdrh# $Id: shared6.test,v 1.4 2009/06/05 17:09:12 drh Exp $ 135b413d78Sdanielk1977 145b413d78Sdanielk1977set testdir [file dirname $argv0] 155b413d78Sdanielk1977source $testdir/tester.tcl 165b413d78Sdanielk1977ifcapable !shared_cache { finish_test ; return } 175b413d78Sdanielk1977 18856cc0fdSdanielk1977do_test shared6-1.1.1 { 195b413d78Sdanielk1977 execsql { 205b413d78Sdanielk1977 CREATE TABLE t1(a, b); 215b413d78Sdanielk1977 CREATE TABLE t2(c, d); 225b413d78Sdanielk1977 CREATE TABLE t3(e, f); 235b413d78Sdanielk1977 } 24fa542f1fSdanielk1977 db close 255b413d78Sdanielk1977} {} 26856cc0fdSdanielk1977do_test shared6-1.1.2 { 275b413d78Sdanielk1977 set ::enable_shared_cache [sqlite3_enable_shared_cache 1] 285b413d78Sdanielk1977 sqlite3_enable_shared_cache 295b413d78Sdanielk1977} {1} 305b413d78Sdanielk1977 31856cc0fdSdanielk1977do_test shared6-1.1.3 { 325b413d78Sdanielk1977 sqlite3 db1 test.db 335b413d78Sdanielk1977 sqlite3 db2 test.db 345b413d78Sdanielk1977} {} 355b413d78Sdanielk1977 365b413d78Sdanielk1977# Exclusive shared-cache locks. Test the following: 375b413d78Sdanielk1977# 385b413d78Sdanielk1977# 1.2.1: If [db1] has an exclusive lock, [db2] cannot read. 395b413d78Sdanielk1977# 1.2.2: If [db1] has an exclusive lock, [db1] can read. 405b413d78Sdanielk1977# 1.2.3: If [db1] has a non-exclusive write-lock, [db2] can read. 415b413d78Sdanielk1977# 42856cc0fdSdanielk1977do_test shared6-1.2.1 { 435b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db2 ;# Cache a compiled statement 445b413d78Sdanielk1977 execsql { BEGIN EXCLUSIVE } db1 455b413d78Sdanielk1977 catchsql { SELECT * FROM t1 } db2 ;# Execute the cached compiled statement 465b413d78Sdanielk1977} {1 {database table is locked}} 47856cc0fdSdanielk1977do_test shared6-1.2.2 { 485b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db1 495b413d78Sdanielk1977} {} 50856cc0fdSdanielk1977do_test shared6-1.2.3 { 515b413d78Sdanielk1977 execsql { 525b413d78Sdanielk1977 COMMIT; 535b413d78Sdanielk1977 BEGIN; 545b413d78Sdanielk1977 INSERT INTO t2 VALUES(3, 4); 555b413d78Sdanielk1977 } db1 565b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db2 575b413d78Sdanielk1977} {} 58856cc0fdSdanielk1977do_test shared6-1.2.X { 595b413d78Sdanielk1977 execsql { COMMIT } db1 605b413d78Sdanielk1977} {} 615b413d78Sdanielk1977 625b413d78Sdanielk1977# Regular shared-cache locks. Verify the following: 635b413d78Sdanielk1977# 645b413d78Sdanielk1977# 1.3.1: If [db1] has a write-lock on t1, [db1] can read from t1. 655b413d78Sdanielk1977# 1.3.2: If [db1] has a write-lock on t1, [db2] can read from t2. 665b413d78Sdanielk1977# 1.3.3: If [db1] has a write-lock on t1, [db2] cannot read from t1. 675b413d78Sdanielk1977# 1.3.4: If [db1] has a write-lock on t1, [db2] cannot write to t1. 685b413d78Sdanielk1977# 1.3.5: If [db1] has a read-lock on t1, [db2] can read from t1. 695b413d78Sdanielk1977# 1.3.6: If [db1] has a read-lock on t1, [db2] cannot write to t1. 705b413d78Sdanielk1977# 71856cc0fdSdanielk1977do_test shared6-1.3.1 { 725b413d78Sdanielk1977 execsql { 735b413d78Sdanielk1977 BEGIN; 745b413d78Sdanielk1977 INSERT INTO t1 VALUES(1, 2); 755b413d78Sdanielk1977 } db1 765b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db1 775b413d78Sdanielk1977} {1 2} 78856cc0fdSdanielk1977do_test shared6-1.3.2 { 795b413d78Sdanielk1977 execsql { SELECT * FROM t2 } db2 805b413d78Sdanielk1977} {3 4} 81856cc0fdSdanielk1977do_test shared6-1.3.3 { 825b413d78Sdanielk1977 catchsql { SELECT * FROM t1 } db2 835b413d78Sdanielk1977} {1 {database table is locked: t1}} 84856cc0fdSdanielk1977do_test shared6-1.3.4 { 855b413d78Sdanielk1977 catchsql { INSERT INTO t2 VALUES(1, 2) } db2 865b413d78Sdanielk1977} {1 {database table is locked}} 87856cc0fdSdanielk1977do_test shared6-1.3.5 { 885b413d78Sdanielk1977 execsql { 895b413d78Sdanielk1977 COMMIT; 905b413d78Sdanielk1977 BEGIN; 915b413d78Sdanielk1977 SELECT * FROM t1; 925b413d78Sdanielk1977 } db1 935b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db2 945b413d78Sdanielk1977} {1 2} 95856cc0fdSdanielk1977do_test shared6-1.3.5 { 965b413d78Sdanielk1977 catchsql { INSERT INTO t1 VALUES(5, 6) } db2 975b413d78Sdanielk1977} {1 {database table is locked: t1}} 98856cc0fdSdanielk1977do_test shared6-1.3.X { 995b413d78Sdanielk1977 execsql { COMMIT } db1 1005b413d78Sdanielk1977} {} 1015b413d78Sdanielk1977 1025b413d78Sdanielk1977# Read-uncommitted mode. 1035b413d78Sdanielk1977# 1045b413d78Sdanielk1977# For these tests, connection [db2] is in read-uncommitted mode. 1055b413d78Sdanielk1977# 1065b413d78Sdanielk1977# 1.4.1: If [db1] has a write-lock on t1, [db2] can still read from t1. 1075b413d78Sdanielk1977# 1.4.2: If [db1] has a write-lock on the db schema (sqlite_master table), 1085b413d78Sdanielk1977# [db2] cannot read from the schema. 1095b413d78Sdanielk1977# 1.4.3: If [db1] has a read-lock on t1, [db2] cannot write to t1. 1105b413d78Sdanielk1977# 111856cc0fdSdanielk1977do_test shared6-1.4.1 { 1125b413d78Sdanielk1977 execsql { PRAGMA read_uncommitted = 1 } db2 1135b413d78Sdanielk1977 execsql { 1145b413d78Sdanielk1977 BEGIN; 1155b413d78Sdanielk1977 INSERT INTO t1 VALUES(5, 6); 1165b413d78Sdanielk1977 } db1 1175b413d78Sdanielk1977 execsql { SELECT * FROM t1 } db2 1185b413d78Sdanielk1977} {1 2 5 6} 119856cc0fdSdanielk1977do_test shared6-1.4.2 { 1205b413d78Sdanielk1977 execsql { CREATE TABLE t4(a, b) } db1 1215b413d78Sdanielk1977 catchsql { SELECT * FROM t1 } db2 1225b413d78Sdanielk1977} {1 {database table is locked}} 123856cc0fdSdanielk1977do_test shared6-1.4.3 { 1245b413d78Sdanielk1977 execsql { 1255b413d78Sdanielk1977 COMMIT; 1265b413d78Sdanielk1977 BEGIN; 1275b413d78Sdanielk1977 SELECT * FROM t1; 1285b413d78Sdanielk1977 } db1 1295b413d78Sdanielk1977 catchsql { INSERT INTO t1 VALUES(7, 8) } db2 1305b413d78Sdanielk1977} {1 {database table is locked: t1}} 1315b413d78Sdanielk1977 132856cc0fdSdanielk1977do_test shared6-1.X { 1335b413d78Sdanielk1977 db1 close 1345b413d78Sdanielk1977 db2 close 1355b413d78Sdanielk1977} {} 1365b413d78Sdanielk1977 137fa542f1fSdanielk1977#------------------------------------------------------------------------- 138856cc0fdSdanielk1977# The following tests - shared6-2.* - test that two database connections 139856cc0fdSdanielk1977# that connect to the same file using different VFS implementations do 140856cc0fdSdanielk1977# not share a cache. 141fa542f1fSdanielk1977# 142856cc0fdSdanielk1977if {$::tcl_platform(platform) eq "unix"} { 143856cc0fdSdanielk1977 do_test shared6-2.1 { 144856cc0fdSdanielk1977 sqlite3 db1 test.db -vfs unix 145856cc0fdSdanielk1977 sqlite3 db2 test.db -vfs unix 146856cc0fdSdanielk1977 sqlite3 db3 test.db -vfs unix-none 147856cc0fdSdanielk1977 sqlite3 db4 test.db -vfs unix-none 148856cc0fdSdanielk1977 } {} 149856cc0fdSdanielk1977 150856cc0fdSdanielk1977 do_test shared6-2.2 { 151856cc0fdSdanielk1977 execsql { BEGIN; INSERT INTO t1 VALUES(9, 10); } db1 152856cc0fdSdanielk1977 catchsql { SELECT * FROM t1 } db2 153856cc0fdSdanielk1977 } {1 {database table is locked: t1}} 154856cc0fdSdanielk1977 do_test shared6-2.3 { 155856cc0fdSdanielk1977 execsql { SELECT * FROM t1 } db3 156856cc0fdSdanielk1977 } {1 2 5 6} 157856cc0fdSdanielk1977 158856cc0fdSdanielk1977 do_test shared6-2.3 { 159856cc0fdSdanielk1977 execsql { COMMIT } db1 160856cc0fdSdanielk1977 execsql { BEGIN; INSERT INTO t1 VALUES(11, 12); } db3 161856cc0fdSdanielk1977 catchsql { SELECT * FROM t1 } db4 162856cc0fdSdanielk1977 } {1 {database table is locked: t1}} 163856cc0fdSdanielk1977 164856cc0fdSdanielk1977 do_test shared6-2.4 { 165856cc0fdSdanielk1977 execsql { SELECT * FROM t1 } db1 166856cc0fdSdanielk1977 } {1 2 5 6 9 10} 167856cc0fdSdanielk1977 168856cc0fdSdanielk1977 do_test shared6-2.5 { 169856cc0fdSdanielk1977 execsql { COMMIT } db3 170856cc0fdSdanielk1977 } {} 171856cc0fdSdanielk1977 172856cc0fdSdanielk1977 do_test shared6-2.X { 173856cc0fdSdanielk1977 db1 close 174856cc0fdSdanielk1977 db2 close 175856cc0fdSdanielk1977 db3 close 176856cc0fdSdanielk1977 db4 close 177856cc0fdSdanielk1977 } {} 178856cc0fdSdanielk1977} 179856cc0fdSdanielk1977 180fa542f1fSdanielk1977#------------------------------------------------------------------------- 181fa542f1fSdanielk1977# Test that it is possible to open an exclusive transaction while 182fa542f1fSdanielk1977# already holding a read-lock on the database file. And that it is 183fa542f1fSdanielk1977# not possible if some other connection holds such a lock. 184fa542f1fSdanielk1977# 185fa542f1fSdanielk1977do_test shared6-3.1 { 186fa542f1fSdanielk1977 sqlite3 db1 test.db 187fa542f1fSdanielk1977 sqlite3 db2 test.db 188fa542f1fSdanielk1977 sqlite3 db3 test.db 189fa542f1fSdanielk1977} {} 190fa542f1fSdanielk1977db1 eval {SELECT * FROM t1} { 191fa542f1fSdanielk1977 # Within this block [db1] is holding a read-lock on t1. Test that 192fa542f1fSdanielk1977 # this means t1 cannot be written by [db2]. 193fa542f1fSdanielk1977 # 194fa542f1fSdanielk1977 do_test shared6-3.2 { 195fa542f1fSdanielk1977 catchsql { INSERT INTO t1 VALUES(1, 2) } db2 196fa542f1fSdanielk1977 } {1 {database table is locked: t1}} 197fa542f1fSdanielk1977 198fa542f1fSdanielk1977 do_test shared6-3.3 { 199fa542f1fSdanielk1977 execsql { BEGIN EXCLUSIVE } db1 200fa542f1fSdanielk1977 } {} 201fa542f1fSdanielk1977 break 202fa542f1fSdanielk1977} 203fa542f1fSdanielk1977do_test shared6-3.4 { 204fa542f1fSdanielk1977 catchsql { SELECT * FROM t1 } db2 205fa542f1fSdanielk1977} {1 {database schema is locked: main}} 206fa542f1fSdanielk1977do_test shared6-3.5 { 207fa542f1fSdanielk1977 execsql COMMIT db1 208fa542f1fSdanielk1977} {} 209fa542f1fSdanielk1977db2 eval {SELECT * FROM t1} { 210fa542f1fSdanielk1977 do_test shared6-3.6 { 211fa542f1fSdanielk1977 catchsql { BEGIN EXCLUSIVE } db1 212fa542f1fSdanielk1977 } {1 {database table is locked}} 213fa542f1fSdanielk1977 break 214fa542f1fSdanielk1977} 215fa542f1fSdanielk1977do_test shared6-3.7 { 216fa542f1fSdanielk1977 execsql { BEGIN } db1 217fa542f1fSdanielk1977 execsql { BEGIN } db2 218fa542f1fSdanielk1977} {} 219fa542f1fSdanielk1977db2 eval {SELECT * FROM t1} { 220fa542f1fSdanielk1977 do_test shared6-3.8 { 221fa542f1fSdanielk1977 catchsql { INSERT INTO t1 VALUES(1, 2) } db1 222fa542f1fSdanielk1977 } {1 {database table is locked: t1}} 223fa542f1fSdanielk1977 break 224fa542f1fSdanielk1977} 225fa542f1fSdanielk1977do_test shared6-3.9 { 226fa542f1fSdanielk1977 execsql { BEGIN ; ROLLBACK } db3 227fa542f1fSdanielk1977} {} 228fa542f1fSdanielk1977do_test shared6-3.10 { 229fa542f1fSdanielk1977 catchsql { SELECT * FROM t1 } db3 230fa542f1fSdanielk1977} {1 {database table is locked}} 231fa542f1fSdanielk1977do_test shared6-3.X { 232fa542f1fSdanielk1977 db1 close 233fa542f1fSdanielk1977 db2 close 234fa542f1fSdanielk1977 db3 close 235fa542f1fSdanielk1977} {} 236fa542f1fSdanielk1977 237fa542f1fSdanielk1977do_test shared6-4.1 { 238*fda06befSmistachkin #forcedelete test.db test.db-journal 239fa542f1fSdanielk1977 sqlite3 db1 test.db 240fa542f1fSdanielk1977 sqlite3 db2 test.db 241fa542f1fSdanielk1977 242fa542f1fSdanielk1977 set ::STMT [sqlite3_prepare_v2 db1 "SELECT * FROM t1" -1 DUMMY] 243fa542f1fSdanielk1977 execsql { CREATE TABLE t5(a, b) } db2 244fa542f1fSdanielk1977} {} 245fa542f1fSdanielk1977do_test shared6-4.2 { 246fa542f1fSdanielk1977 sqlite3_finalize $::STMT 247fa542f1fSdanielk1977} {SQLITE_OK} 248fa542f1fSdanielk1977do_test shared6-4.X { 249fa542f1fSdanielk1977 250fa542f1fSdanielk1977 db1 close 251fa542f1fSdanielk1977 db2 close 252fa542f1fSdanielk1977} {} 253fa542f1fSdanielk1977 2545b413d78Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache 2555b413d78Sdanielk1977finish_test 256