1# 2008 June 28 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 script is database locks. 13# 14# $Id: lock5.test,v 1.6 2008/12/04 12:34:16 drh Exp $ 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19# This file is only run if using the unix backend compiled with the 20# SQLITE_ENABLE_LOCKING_STYLE macro. 21db close 22if {[catch {sqlite3 db test.db -vfs unix-none} msg]} { 23 finish_test 24 return 25} 26db close 27forcedelete test.db.lock 28 29ifcapable lock_proxy_pragmas { 30 set ::using_proxy 0 31 foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] { 32 set ::using_proxy $value 33 } 34 # Disable the proxy locking for these tests 35 set env(SQLITE_FORCE_PROXY_LOCKING) "0" 36} 37 38 39do_test lock5-dotfile.1 { 40 sqlite3 db test.db -vfs unix-dotfile 41 execsql { 42 BEGIN; 43 CREATE TABLE t1(a, b); 44 } 45} {} 46 47do_test lock5-dotfile.2 { 48 file exists test.db.lock 49} {1} 50 51do_test lock5-dotfile.3 { 52 execsql COMMIT 53 file exists test.db.lock 54} {0} 55 56do_test lock5-dotfile.4 { 57 sqlite3 db2 test.db -vfs unix-dotfile 58 execsql { 59 INSERT INTO t1 VALUES('a', 'b'); 60 SELECT * FROM t1; 61 } db2 62} {a b} 63 64do_test lock5-dotfile.5 { 65 execsql { 66 BEGIN; 67 SELECT * FROM t1; 68 } db2 69} {a b} 70 71do_test lock5-dotfile.6 { 72 file exists test.db.lock 73} {1} 74 75do_test lock5-dotfile.7 { 76 catchsql { SELECT * FROM t1; } 77} {1 {database is locked}} 78 79do_test lock5-dotfile.8 { 80 execsql { 81 SELECT * FROM t1; 82 ROLLBACK; 83 } db2 84} {a b} 85 86do_test lock5-dotfile.9 { 87 catchsql { SELECT * FROM t1; } 88} {0 {a b}} 89 90do_test lock5-dotfile.10 { 91 file exists test.db.lock 92} {0} 93 94do_test lock5-dotfile.X { 95 db2 close 96 execsql {BEGIN EXCLUSIVE} 97 db close 98 file exists test.db.lock 99} {0} 100 101##################################################################### 102 103forcedelete test.db 104if {[catch {sqlite3 db test.db -vfs unix-flock} msg]} { 105 finish_test 106 return 107} 108 109do_test lock5-flock.1 { 110 sqlite3 db test.db -vfs unix-flock 111 execsql { 112 CREATE TABLE t1(a, b); 113 BEGIN; 114 INSERT INTO t1 VALUES(1, 2); 115 } 116} {} 117 118# Make sure we are not accidentally using the dotfile locking scheme. 119do_test lock5-flock.2 { 120 file exists test.db.lock 121} {0} 122 123do_test lock5-flock.3 { 124 catch { sqlite3 db2 test.db -vfs unix-flock } 125 catchsql { SELECT * FROM t1 } db2 126} {1 {database is locked}} 127 128do_test lock5-flock.4 { 129 execsql COMMIT 130 catchsql { SELECT * FROM t1 } db2 131} {0 {1 2}} 132 133do_test lock5-flock.5 { 134 execsql BEGIN 135 catchsql { SELECT * FROM t1 } db2 136} {0 {1 2}} 137 138do_test lock5-flock.6 { 139 execsql {SELECT * FROM t1} 140 catchsql { SELECT * FROM t1 } db2 141} {1 {database is locked}} 142 143do_test lock5-flock.7 { 144 db close 145 catchsql { SELECT * FROM t1 } db2 146} {0 {1 2}} 147 148do_test lock5-flock.8 { 149 db2 close 150} {} 151 152##################################################################### 153 154do_test lock5-none.1 { 155 sqlite3 db test.db -vfs unix-none 156 sqlite3 db2 test.db -vfs unix-none 157 execsql { PRAGMA mmap_size = 0 } db2 158 execsql { 159 BEGIN; 160 INSERT INTO t1 VALUES(3, 4); 161 } 162} {} 163do_test lock5-none.2 { 164 execsql { SELECT * FROM t1 } 165} {1 2 3 4} 166do_test lock5-none.3 { 167 execsql { SELECT * FROM t1; } db2 168} {1 2} 169do_test lock5-none.4 { 170 execsql { 171 BEGIN; 172 SELECT * FROM t1; 173 } db2 174} {1 2} 175do_test lock5-none.5 { 176 execsql COMMIT 177 execsql {SELECT * FROM t1} db2 178} {1 2} 179 180ifcapable memorymanage { 181 do_test lock5-none.6 { 182 sqlite3_release_memory 1000000 183 execsql {SELECT * FROM t1} db2 184 } {1 2 3 4} 185} 186 187do_test lock5-none.X { 188 db close 189 db2 close 190} {} 191 192ifcapable lock_proxy_pragmas { 193 set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy 194} 195 196finish_test 197