141fb5cd1Sdan# 2012 October 5 241fb5cd1Sdan# 341fb5cd1Sdan# The author disclaims copyright to this source code. In place of 441fb5cd1Sdan# a legal notice, here is a blessing: 541fb5cd1Sdan# 641fb5cd1Sdan# May you do good and not evil. 741fb5cd1Sdan# May you find forgiveness for yourself and forgive others. 841fb5cd1Sdan# May you share freely, never taking more than you give. 941fb5cd1Sdan# 1041fb5cd1Sdan#*********************************************************************** 1141fb5cd1Sdan# 1241fb5cd1Sdan# The tests in this file are intended to show if two connections attach 1341fb5cd1Sdan# to the same shared cache using different database names, views and 1441fb5cd1Sdan# virtual tables may still be accessed. 1541fb5cd1Sdan# 1641fb5cd1Sdan 1741fb5cd1Sdanset testdir [file dirname $argv0] 1841fb5cd1Sdansource $testdir/tester.tcl 196b9bb59fSdansource $testdir/lock_common.tcl 2041fb5cd1Sdanset testprefix shared9 21a2ebe4b4Sdan 22*9c5e1e40Sdrhifcapable !view||!trigger||!shared_cache { 23a2ebe4b4Sdan finish_test 24a2ebe4b4Sdan return 25a2ebe4b4Sdan} 26a2ebe4b4Sdan 2741fb5cd1Sdandb close 2841fb5cd1Sdanset enable_shared_cache [sqlite3_enable_shared_cache 1] 2941fb5cd1Sdan 3041fb5cd1Sdansqlite3 db1 test.db 3141fb5cd1Sdansqlite3 db2 test.db 3241fb5cd1Sdanforcedelete test.db2 3341fb5cd1Sdan 3441fb5cd1Sdando_test 1.1 { 3541fb5cd1Sdan db1 eval { 3641fb5cd1Sdan ATTACH 'test.db2' AS 'fred'; 3741fb5cd1Sdan CREATE TABLE fred.t1(a, b, c); 3841fb5cd1Sdan CREATE VIEW fred.v1 AS SELECT * FROM t1; 3941fb5cd1Sdan 4041fb5cd1Sdan CREATE TABLE fred.t2(a, b); 4141fb5cd1Sdan CREATE TABLE fred.t3(a, b); 4241fb5cd1Sdan CREATE TRIGGER fred.trig AFTER INSERT ON t2 BEGIN 4341fb5cd1Sdan DELETE FROM t3; 4441fb5cd1Sdan INSERT INTO t3 SELECT * FROM t2; 4541fb5cd1Sdan END; 4641fb5cd1Sdan INSERT INTO t2 VALUES(1, 2); 4741fb5cd1Sdan SELECT * FROM t3; 4841fb5cd1Sdan } 4941fb5cd1Sdan} {1 2} 5041fb5cd1Sdan 5141fb5cd1Sdando_test 1.2 { db2 eval "ATTACH 'test.db2' AS 'jones'" } {} 52a2ebe4b4Sdando_test 1.3 { db2 eval "SELECT * FROM v1" } {} 53a2ebe4b4Sdando_test 1.4 { db2 eval "INSERT INTO t2 VALUES(3, 4)" } {} 5441fb5cd1Sdan 55a2ebe4b4Sdanifcapable fts3 { 56a2ebe4b4Sdan do_test 1.5 { 5741fb5cd1Sdan db1 eval { 5841fb5cd1Sdan CREATE VIRTUAL TABLE fred.t4 USING fts4; 5941fb5cd1Sdan INSERT INTO t4 VALUES('hello world'); 6041fb5cd1Sdan } 6141fb5cd1Sdan } {} 6241fb5cd1Sdan 63a2ebe4b4Sdan do_test 1.6 { 6441fb5cd1Sdan db2 eval { 6541fb5cd1Sdan INSERT INTO t4 VALUES('shared cache'); 6641fb5cd1Sdan SELECT * FROM t4 WHERE t4 MATCH 'hello'; 6741fb5cd1Sdan } 6841fb5cd1Sdan } {{hello world}} 6941fb5cd1Sdan 70a2ebe4b4Sdan do_test 1.7 { 7141fb5cd1Sdan db1 eval { 7241fb5cd1Sdan SELECT * FROM t4 WHERE t4 MATCH 'c*'; 7341fb5cd1Sdan } 7441fb5cd1Sdan } {{shared cache}} 75a2ebe4b4Sdan} 7641fb5cd1Sdan 7741fb5cd1Sdandb1 close 7841fb5cd1Sdandb2 close 79a2ebe4b4Sdan 80a2ebe4b4Sdan#------------------------------------------------------------------------- 81a2ebe4b4Sdan# The following tests attempt to find a similar problem with collation 82a2ebe4b4Sdan# sequence names - pointers to database handle specific allocations leaking 83a2ebe4b4Sdan# into schema objects and being used after the original handle has been 84a2ebe4b4Sdan# closed. 85a2ebe4b4Sdan# 86a2ebe4b4Sdanforcedelete test.db test.db2 87a2ebe4b4Sdansqlite3 db1 test.db 88a2ebe4b4Sdansqlite3 db2 test.db 89a2ebe4b4Sdanforeach x {collate1 collate2 collate3} { 90a2ebe4b4Sdan proc $x {a b} { string compare $a $b } 91a2ebe4b4Sdan db1 collate $x $x 92a2ebe4b4Sdan db2 collate $x $x 93a2ebe4b4Sdan} 94a2ebe4b4Sdando_test 2.1 { 95a2ebe4b4Sdan db1 eval { 96a2ebe4b4Sdan CREATE TABLE t1(a, b, c COLLATE collate1); 97a2ebe4b4Sdan CREATE INDEX i1 ON t1(a COLLATE collate2, c, b); 98a2ebe4b4Sdan } 99a2ebe4b4Sdan} {} 100a2ebe4b4Sdando_test 2.2 { 101a2ebe4b4Sdan db1 close 102a2ebe4b4Sdan db2 eval "INSERT INTO t1 VALUES('abc', 'def', 'ghi')" 103a2ebe4b4Sdan} {} 104a2ebe4b4Sdandb2 close 105a2ebe4b4Sdan 106a2ebe4b4Sdan#------------------------------------------------------------------------- 107a2ebe4b4Sdan# At one point, the following would cause a collation sequence belonging 108a2ebe4b4Sdan# to connection [db1] to be invoked by a call to [db2 eval]. Which is a 109a2ebe4b4Sdan# problem if [db1] has already been closed. 110a2ebe4b4Sdan# 111a2ebe4b4Sdanforcedelete test.db test.db2 112a2ebe4b4Sdansqlite3 db1 test.db 113a2ebe4b4Sdansqlite3 db2 test.db 114a2ebe4b4Sdan 115a2ebe4b4Sdanproc mycollate_db1 {a b} {set ::invoked_mycollate_db1 1 ; string compare $a $b} 116a2ebe4b4Sdanproc mycollate_db2 {a b} {string compare $a $b} 117a2ebe4b4Sdan 118a2ebe4b4Sdandb1 collate mycollate mycollate_db1 119a2ebe4b4Sdandb2 collate mycollate mycollate_db2 120a2ebe4b4Sdan 121a2ebe4b4Sdando_test 2.3 { 122a2ebe4b4Sdan set ::invoked_mycollate_db1 0 123a2ebe4b4Sdan db1 eval { 124a2ebe4b4Sdan CREATE TABLE t1(a COLLATE mycollate, CHECK (a IN ('one', 'two', 'three'))); 125a2ebe4b4Sdan INSERT INTO t1 VALUES('one'); 126a2ebe4b4Sdan } 127a2ebe4b4Sdan db1 close 128a2ebe4b4Sdan set ::invoked_mycollate_db1 129a2ebe4b4Sdan} {1} 130a2ebe4b4Sdando_test 2.4 { 131a2ebe4b4Sdan set ::invoked_mycollate_db1 0 132a2ebe4b4Sdan db2 eval { 133a2ebe4b4Sdan INSERT INTO t1 VALUES('two'); 134a2ebe4b4Sdan } 135a2ebe4b4Sdan db2 close 136a2ebe4b4Sdan set ::invoked_mycollate_db1 137a2ebe4b4Sdan} {0} 138a2ebe4b4Sdan 13974358f0cSdrhforcedelete test.db test.db2 14074358f0cSdrhsqlite3 db1 test.db 14174358f0cSdrhsqlite3 db2 test.db 14274358f0cSdrhdb1 collate mycollate mycollate_db1 14374358f0cSdrhdb2 collate mycollate mycollate_db2 14474358f0cSdrh 14574358f0cSdrhdo_test 2.13 { 14674358f0cSdrh set ::invoked_mycollate_db1 0 14774358f0cSdrh db1 eval { 14874358f0cSdrh CREATE TABLE t1(a, CHECK (a COLLATE mycollate IN ('one', 'two', 'three'))); 14974358f0cSdrh INSERT INTO t1 VALUES('one'); 15074358f0cSdrh } 15174358f0cSdrh db1 close 15274358f0cSdrh set ::invoked_mycollate_db1 15374358f0cSdrh} {1} 15474358f0cSdrhdo_test 2.14 { 15574358f0cSdrh set ::invoked_mycollate_db1 0 15674358f0cSdrh db2 eval { 15774358f0cSdrh INSERT INTO t1 VALUES('two'); 15874358f0cSdrh } 15974358f0cSdrh db2 close 16074358f0cSdrh set ::invoked_mycollate_db1 16174358f0cSdrh} {0} 16274358f0cSdrh 1636b9bb59fSdan#------------------------------------------------------------------------- 1646b9bb59fSdan# This test verifies that a bug causing a busy-handler belonging to one 1656b9bb59fSdan# shared-cache connection to be executed as a result of an sqlite3_step() 1666b9bb59fSdan# on another has been fixed. 1676b9bb59fSdan# 1686b9bb59fSdanforcedelete test.db test.db2 1696b9bb59fSdansqlite3 db1 test.db 1706b9bb59fSdansqlite3 db2 test.db 1716b9bb59fSdan 1726b9bb59fSdanproc busyhandler {handle args} { 1736b9bb59fSdan set ::busyhandler_invoked_for $handle 1746b9bb59fSdan return 1 1756b9bb59fSdan} 1766b9bb59fSdandb1 busy [list busyhandler db1] 1776b9bb59fSdandb2 busy [list busyhandler db2] 1786b9bb59fSdan 1796b9bb59fSdando_test 3.1 { 1806b9bb59fSdan db1 eval { 1816b9bb59fSdan BEGIN; 1826b9bb59fSdan CREATE TABLE t1(a, b); 1836b9bb59fSdan CREATE TABLE t2(a, b); 1846b9bb59fSdan INSERT INTO t1 VALUES(1, 2); 1856b9bb59fSdan INSERT INTO t2 VALUES(1, 2); 1866b9bb59fSdan } 1876b9bb59fSdan # Keep this next COMMIT as a separate statement. This ensures that COMMIT 1886b9bb59fSdan # has already been compiled and loaded into the tcl interface statement 1896b9bb59fSdan # cache when it is attempted below. 1906b9bb59fSdan db1 eval COMMIT 1916b9bb59fSdan db1 eval { 1926b9bb59fSdan BEGIN; 1936b9bb59fSdan INSERT INTO t1 VALUES(3, 4); 1946b9bb59fSdan } 1956b9bb59fSdan} {} 1966b9bb59fSdan 1973038cfe9Smistachkindo_test 3.2 { 1986b9bb59fSdan set ::tf [launch_testfixture] 1996b9bb59fSdan testfixture $::tf { 2006b9bb59fSdan sqlite3 db test.db 2016b9bb59fSdan db eval { 2026b9bb59fSdan BEGIN; 2036b9bb59fSdan SELECT * FROM t1; 2046b9bb59fSdan } 2056b9bb59fSdan } 2066b9bb59fSdan} {1 2} 2076b9bb59fSdan 2083038cfe9Smistachkindo_test 3.3 { 2096b9bb59fSdan db2 eval { SELECT * FROM t2 } 2106b9bb59fSdan} {1 2} 2116b9bb59fSdan 2123038cfe9Smistachkindo_test 3.4 { 2136b9bb59fSdan list [catch { db1 eval COMMIT } msg] $msg 2146b9bb59fSdan} {1 {database is locked}} 2156b9bb59fSdan 2166b9bb59fSdan# At one point the following would fail, showing that the busy-handler 2176b9bb59fSdan# belonging to [db2] was invoked instead. 2183038cfe9Smistachkindo_test 3.5 { 2196b9bb59fSdan set ::busyhandler_invoked_for 2206b9bb59fSdan} {db1} 2213038cfe9Smistachkindo_test 3.6 { 2226b9bb59fSdan close $::tf 2236b9bb59fSdan db1 eval COMMIT 2246b9bb59fSdan} {} 2256b9bb59fSdan 2266b9bb59fSdandb1 close 2276b9bb59fSdandb2 close 2286b9bb59fSdan 22941fb5cd1Sdansqlite3_enable_shared_cache $::enable_shared_cache 23041fb5cd1Sdanfinish_test 231