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 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 # This file is only run if using the unix backend compiled with the 20 # SQLITE_ENABLE_LOCKING_STYLE macro. 21 db close 22 if {[catch {sqlite3 db test.db -vfs unix-none} msg]} { 23 finish_test 24 return 25 } 26 db close 27 file delete -force test.db.lock 28 29 ifcapable 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 39 do_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 47 do_test lock5-dotfile.2 { 48 file exists test.db.lock 49 } {1} 50 51 do_test lock5-dotfile.3 { 52 execsql COMMIT 53 file exists test.db.lock 54 } {0} 55 56 do_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 64 do_test lock5-dotfile.5 { 65 execsql { 66 BEGIN; 67 SELECT * FROM t1; 68 } db2 69 } {a b} 70 71 do_test lock5-dotfile.6 { 72 file exists test.db.lock 73 } {1} 74 75 do_test lock5-dotfile.7 { 76 catchsql { SELECT * FROM t1; } 77 } {1 {database is locked}} 78 79 do_test lock5-dotfile.8 { 80 execsql { 81 SELECT * FROM t1; 82 ROLLBACK; 83 } db2 84 } {a b} 85 86 do_test lock5-dotfile.9 { 87 catchsql { SELECT * FROM t1; } 88 } {0 {a b}} 89 90 do_test lock5-dotfile.10 { 91 file exists test.db.lock 92 } {0} 93 94 do_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 103 file delete -force test.db 104 if {[catch {sqlite3 db test.db -vfs unix-flock} msg]} { 105 finish_test 106 return 107 } 108 109 do_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. 119 do_test lock5-flock.2 { 120 file exists test.db.lock 121 } {0} 122 123 do_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 128 do_test lock5-flock.4 { 129 execsql COMMIT 130 catchsql { SELECT * FROM t1 } db2 131 } {0 {1 2}} 132 133 do_test lock5-flock.5 { 134 execsql BEGIN 135 catchsql { SELECT * FROM t1 } db2 136 } {0 {1 2}} 137 138 do_test lock5-flock.6 { 139 execsql {SELECT * FROM t1} 140 catchsql { SELECT * FROM t1 } db2 141 } {1 {database is locked}} 142 143 do_test lock5-flock.7 { 144 db close 145 catchsql { SELECT * FROM t1 } db2 146 } {0 {1 2}} 147 148 do_test lock5-flock.8 { 149 db2 close 150 } {} 151 152 ##################################################################### 153 154 do_test lock5-none.1 { 155 sqlite3 db test.db -vfs unix-none 156 sqlite3 db2 test.db -vfs unix-none 157 execsql { 158 BEGIN; 159 INSERT INTO t1 VALUES(3, 4); 160 } 161 } {} 162 do_test lock5-none.2 { 163 execsql { SELECT * FROM t1 } 164 } {1 2 3 4} 165 do_test lock5-flock.3 { 166 execsql { SELECT * FROM t1 } db2 167 } {1 2} 168 do_test lock5-none.4 { 169 execsql { 170 BEGIN; 171 SELECT * FROM t1; 172 } db2 173 } {1 2} 174 do_test lock5-none.5 { 175 execsql COMMIT 176 execsql {SELECT * FROM t1} db2 177 } {1 2} 178 179 ifcapable memorymanage { 180 do_test lock5-none.6 { 181 sqlite3_release_memory 1000000 182 execsql {SELECT * FROM t1} db2 183 } {1 2 3 4} 184 } 185 186 do_test lock5-flock.X { 187 db close 188 db2 close 189 } {} 190 191 ifcapable lock_proxy_pragmas { 192 set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy 193 } 194 195 finish_test 196