1# 2008 May 2 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# 12# Ticket #3093 13# 14# Verify that a busy callback waiting on a reserved lock resolves 15# once the lock clears. 16# 17# $Id: tkt3093.test,v 1.2 2008/05/02 14:23:55 drh Exp $ 18# 19 20set testdir [file dirname $argv0] 21source $testdir/tester.tcl 22 23# Set up a test database 24# 25do_test tkt3093.1 { 26 db eval { 27 CREATE TABLE t1(x); 28 INSERT INTO t1 VALUES(1); 29 SELECT * FROM t1 30 } 31} {1} 32 33# Establish a separate, independent connection to that database. 34# 35do_test tkt3093.2 { 36 catch {sqlite3_enable_shared_cache 0} 37 sqlite3 db2 test.db 38 db2 eval { 39 SELECT * FROM t1 40 } 41} {1} 42 43# Make sure that clearing a lock allows a pending request for 44# a reserved lock to continue. 45# 46do_test tkt3093.3 { 47 # This will be the busy callback for connection db2. On the first 48 # busy callback, commit the transaction in db. This should clear 49 # the lock so that there should not be a second callback. If the 50 # busy handler is called a second time, then fail so that we get 51 # timeout. 52 proc busy_callback {cnt} { 53 if {$cnt==0} { 54 db eval COMMIT 55 return 0 56 } else { 57 return 1 58 } 59 } 60 db2 busy ::busy_callback 61 62 # Start a write transaction on db. 63 db eval { 64 BEGIN; 65 INSERT INTO t1 VALUES(2); 66 } 67 68 # Attempt to modify the database on db2 69 catchsql { 70 UPDATE t1 SET x=x+1; 71 } db2 72} {0 {}} 73 74# Verify that everything worked as expected. The db transaction should 75# have gone first and added entry 2. Then the db2 transaction would have 76# run and added one to each entry. 77# 78do_test tkt3093.4 { 79 db eval {SELECT * FROM t1} 80} {2 3} 81do_test tkt3093.5 { 82 db2 eval {SELECT * FROM t1} 83} {2 3} 84db2 close 85 86finish_test 87