diff options
Diffstat (limited to 'test/lock3.test')
-rw-r--r-- | test/lock3.test | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/test/lock3.test b/test/lock3.test new file mode 100644 index 0000000..f771a19 --- /dev/null +++ b/test/lock3.test @@ -0,0 +1,79 @@ +# 2001 September 15 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this script is database locks and the operation of the +# DEFERRED, IMMEDIATE, and EXCLUSIVE keywords as modifiers to the +# BEGIN command. +# +# $Id: lock3.test,v 1.4 2009/03/28 15:04:24 drh Exp $ + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# Establish two connections to the same database. Put some +# sample data into the database. +# +do_test lock3-1.1 { + file mkdir tempdir/t1/t2/t3 + sqlite3 db2 ./tempdir/t1//t2/./t3//./../..//./../../tempdir/..//test.db// + execsql { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1); + } + execsql { + SELECT * FROM t1 + } db2 +} 1 + +# Get a deferred lock on the database using one connection. The +# other connection should still be able to write. +# +do_test lock3-2.1 { + execsql {BEGIN DEFERRED TRANSACTION} + execsql {INSERT INTO t1 VALUES(2)} db2 + execsql {END TRANSACTION} + execsql {SELECT * FROM t1} +} {1 2} + +# Get an immediate lock on the database using one connection. The +# other connection should be able to read the database but not write +# it. +# +do_test lock3-3.1 { + execsql {BEGIN IMMEDIATE TRANSACTION} + catchsql {SELECT * FROM t1} db2 +} {0 {1 2}} +do_test lock3-3.2 { + catchsql {INSERT INTO t1 VALUES(3)} db2 +} {1 {database is locked}} +do_test lock3-3.3 { + execsql {END TRANSACTION} +} {} + + +# Get an exclusive lock on the database using one connection. The +# other connection should be unable to read or write the database. +# +do_test lock3-4.1 { + execsql {BEGIN EXCLUSIVE TRANSACTION} + catchsql {SELECT * FROM t1} db2 +} {1 {database is locked}} +do_test lock3-4.2 { + catchsql {INSERT INTO t1 VALUES(3)} db2 +} {1 {database is locked}} +do_test lock3-4.3 { + execsql {END TRANSACTION} +} {} + +catch {db2 close} + +finish_test |