xref: /sqlite-3.40.0/test/shared9.test (revision 9c5e1e40)
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