194b30733Sdanielk1977# 2009 July 2 294b30733Sdanielk1977# 394b30733Sdanielk1977# The author disclaims copyright to this source code. In place of 494b30733Sdanielk1977# a legal notice, here is a blessing: 594b30733Sdanielk1977# 694b30733Sdanielk1977# May you do good and not evil. 794b30733Sdanielk1977# May you find forgiveness for yourself and forgive others. 894b30733Sdanielk1977# May you share freely, never taking more than you give. 994b30733Sdanielk1977# 1094b30733Sdanielk1977#*********************************************************************** 1194b30733Sdanielk1977# 1294b30733Sdanielk1977# $Id: sharedlock.test,v 1.1 2009/07/02 17:21:58 danielk1977 Exp $ 1394b30733Sdanielk1977 1494b30733Sdanielk1977set testdir [file dirname $argv0] 1594b30733Sdanielk1977source $testdir/tester.tcl 16*5d1dcff0Sdanset testprefix sharedlock 1794b30733Sdanielk1977db close 1894b30733Sdanielk1977 1994b30733Sdanielk1977ifcapable !shared_cache { 2094b30733Sdanielk1977 finish_test 2194b30733Sdanielk1977 return 2294b30733Sdanielk1977} 2394b30733Sdanielk1977 2494b30733Sdanielk1977set ::enable_shared_cache [sqlite3_enable_shared_cache 1] 2594b30733Sdanielk1977sqlite3 db test.db 2694b30733Sdanielk1977sqlite3 db2 test.db 2794b30733Sdanielk1977 2894b30733Sdanielk1977do_test sharedlock-1.1 { 2994b30733Sdanielk1977 execsql { 3094b30733Sdanielk1977 CREATE TABLE t1(a, b); 3194b30733Sdanielk1977 INSERT INTO t1 VALUES(1, 'one'); 3294b30733Sdanielk1977 INSERT INTO t1 VALUES(2, 'two'); 3394b30733Sdanielk1977 } 3494b30733Sdanielk1977} {} 3594b30733Sdanielk1977 3694b30733Sdanielk1977do_test sharedlock-1.2 { 3794b30733Sdanielk1977 set res [list] 3894b30733Sdanielk1977 db eval { SELECT * FROM t1 ORDER BY rowid } { 3994b30733Sdanielk1977 lappend res $a $b 4094b30733Sdanielk1977 if {$a == 1} { catch { db eval "INSERT INTO t1 VALUES(3, 'three')" } } 4194b30733Sdanielk1977 4294b30733Sdanielk1977 # This should fail. Connection [db] has a read-lock on t1, which should 4394b30733Sdanielk1977 # prevent connection [db2] from obtaining the write-lock it needs to 4494b30733Sdanielk1977 # modify t1. At one point there was a bug causing the previous INSERT 4594b30733Sdanielk1977 # to drop the read-lock belonging to [db]. 4694b30733Sdanielk1977 if {$a == 2} { catch { db2 eval "INSERT INTO t1 VALUES(4, 'four')" } } 4794b30733Sdanielk1977 } 4894b30733Sdanielk1977 set res 4994b30733Sdanielk1977} {1 one 2 two 3 three} 5094b30733Sdanielk1977 51*5d1dcff0Sdan 52*5d1dcff0Sdan#------------------------------------------------------------------------- 53*5d1dcff0Sdan# Test that a write-lock is taken on a table when its entire contents 54*5d1dcff0Sdan# are deleted using the OP_Clear optimization. 55*5d1dcff0Sdan# 56*5d1dcff0Sdanforeach {tn delete_sql} { 57*5d1dcff0Sdan 1 { DELETE FROM t2 WHERE 1 } 58*5d1dcff0Sdan 2 { DELETE FROM t2 } 59*5d1dcff0Sdan} { 60*5d1dcff0Sdan do_execsql_test 2.1 { 61*5d1dcff0Sdan DROP TABLE IF EXISTS t2; 62*5d1dcff0Sdan CREATE TABLE t2(x, y); 63*5d1dcff0Sdan INSERT INTO t2 VALUES(1, 2); 64*5d1dcff0Sdan INSERT INTO t2 VALUES(3, 4); 65*5d1dcff0Sdan } 66*5d1dcff0Sdan 67*5d1dcff0Sdan do_test 2.2 { execsql { SELECT * FROM t2 } db2 } {1 2 3 4} 68*5d1dcff0Sdan 69*5d1dcff0Sdan do_execsql_test 2.3 " BEGIN; $delete_sql; " 70*5d1dcff0Sdan 71*5d1dcff0Sdan do_test 2.4 { 72*5d1dcff0Sdan catchsql { SELECT * FROM t2 } db2 73*5d1dcff0Sdan } {1 {database table is locked: t2}} 74*5d1dcff0Sdan 75*5d1dcff0Sdan do_execsql_test 2.5 COMMIT 76*5d1dcff0Sdan} 77*5d1dcff0Sdan 78*5d1dcff0Sdan 7994b30733Sdanielk1977db close 8094b30733Sdanielk1977db2 close 8194b30733Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache 8294b30733Sdanielk1977finish_test 83