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 20 set testdir [file dirname $argv0] 21 source $testdir/tester.tcl 22 23 # Set up a test database 24 # 25 do_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 # 35 do_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 # 46 do_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 # 78 do_test tkt3093.4 { 79 db eval {SELECT * FROM t1} 80 } {2 3} 81 do_test tkt3093.5 { 82 db2 eval {SELECT * FROM t1} 83 } {2 3} 84 db2 close 85 86 finish_test 87