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