xref: /sqlite-3.40.0/test/shared6.test (revision fda06bef)
15b413d78Sdanielk1977# 2009 April 01
25b413d78Sdanielk1977#
35b413d78Sdanielk1977# The author disclaims copyright to this source code.  In place of
45b413d78Sdanielk1977# a legal notice, here is a blessing:
55b413d78Sdanielk1977#
65b413d78Sdanielk1977#    May you do good and not evil.
75b413d78Sdanielk1977#    May you find forgiveness for yourself and forgive others.
85b413d78Sdanielk1977#    May you share freely, never taking more than you give.
95b413d78Sdanielk1977#
105b413d78Sdanielk1977#***********************************************************************
115b413d78Sdanielk1977#
12dda70fe3Sdrh# $Id: shared6.test,v 1.4 2009/06/05 17:09:12 drh Exp $
135b413d78Sdanielk1977
145b413d78Sdanielk1977set testdir [file dirname $argv0]
155b413d78Sdanielk1977source $testdir/tester.tcl
165b413d78Sdanielk1977ifcapable !shared_cache { finish_test ; return }
175b413d78Sdanielk1977
18856cc0fdSdanielk1977do_test shared6-1.1.1 {
195b413d78Sdanielk1977  execsql {
205b413d78Sdanielk1977    CREATE TABLE t1(a, b);
215b413d78Sdanielk1977    CREATE TABLE t2(c, d);
225b413d78Sdanielk1977    CREATE TABLE t3(e, f);
235b413d78Sdanielk1977  }
24fa542f1fSdanielk1977  db close
255b413d78Sdanielk1977} {}
26856cc0fdSdanielk1977do_test shared6-1.1.2 {
275b413d78Sdanielk1977  set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
285b413d78Sdanielk1977  sqlite3_enable_shared_cache
295b413d78Sdanielk1977} {1}
305b413d78Sdanielk1977
31856cc0fdSdanielk1977do_test shared6-1.1.3 {
325b413d78Sdanielk1977  sqlite3 db1 test.db
335b413d78Sdanielk1977  sqlite3 db2 test.db
345b413d78Sdanielk1977} {}
355b413d78Sdanielk1977
365b413d78Sdanielk1977# Exclusive shared-cache locks. Test the following:
375b413d78Sdanielk1977#
385b413d78Sdanielk1977#   1.2.1: If [db1] has an exclusive lock, [db2] cannot read.
395b413d78Sdanielk1977#   1.2.2: If [db1] has an exclusive lock, [db1] can read.
405b413d78Sdanielk1977#   1.2.3: If [db1] has a non-exclusive write-lock, [db2] can read.
415b413d78Sdanielk1977#
42856cc0fdSdanielk1977do_test shared6-1.2.1 {
435b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db2    ;# Cache a compiled statement
445b413d78Sdanielk1977  execsql { BEGIN EXCLUSIVE } db1
455b413d78Sdanielk1977  catchsql { SELECT * FROM t1 } db2   ;# Execute the cached compiled statement
465b413d78Sdanielk1977} {1 {database table is locked}}
47856cc0fdSdanielk1977do_test shared6-1.2.2 {
485b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db1
495b413d78Sdanielk1977} {}
50856cc0fdSdanielk1977do_test shared6-1.2.3 {
515b413d78Sdanielk1977  execsql {
525b413d78Sdanielk1977    COMMIT;
535b413d78Sdanielk1977    BEGIN;
545b413d78Sdanielk1977    INSERT INTO t2 VALUES(3, 4);
555b413d78Sdanielk1977  } db1
565b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db2
575b413d78Sdanielk1977} {}
58856cc0fdSdanielk1977do_test shared6-1.2.X {
595b413d78Sdanielk1977  execsql { COMMIT } db1
605b413d78Sdanielk1977} {}
615b413d78Sdanielk1977
625b413d78Sdanielk1977# Regular shared-cache locks. Verify the following:
635b413d78Sdanielk1977#
645b413d78Sdanielk1977#   1.3.1: If [db1] has a write-lock on t1, [db1] can read from t1.
655b413d78Sdanielk1977#   1.3.2: If [db1] has a write-lock on t1, [db2] can read from t2.
665b413d78Sdanielk1977#   1.3.3: If [db1] has a write-lock on t1, [db2] cannot read from t1.
675b413d78Sdanielk1977#   1.3.4: If [db1] has a write-lock on t1, [db2] cannot write to t1.
685b413d78Sdanielk1977#   1.3.5: If [db1] has a read-lock on t1, [db2] can read from t1.
695b413d78Sdanielk1977#   1.3.6: If [db1] has a read-lock on t1, [db2] cannot write to t1.
705b413d78Sdanielk1977#
71856cc0fdSdanielk1977do_test shared6-1.3.1 {
725b413d78Sdanielk1977  execsql {
735b413d78Sdanielk1977    BEGIN;
745b413d78Sdanielk1977    INSERT INTO t1 VALUES(1, 2);
755b413d78Sdanielk1977  } db1
765b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db1
775b413d78Sdanielk1977} {1 2}
78856cc0fdSdanielk1977do_test shared6-1.3.2 {
795b413d78Sdanielk1977  execsql { SELECT * FROM t2 } db2
805b413d78Sdanielk1977} {3 4}
81856cc0fdSdanielk1977do_test shared6-1.3.3 {
825b413d78Sdanielk1977  catchsql { SELECT * FROM t1 } db2
835b413d78Sdanielk1977} {1 {database table is locked: t1}}
84856cc0fdSdanielk1977do_test shared6-1.3.4 {
855b413d78Sdanielk1977  catchsql { INSERT INTO t2 VALUES(1, 2) } db2
865b413d78Sdanielk1977} {1 {database table is locked}}
87856cc0fdSdanielk1977do_test shared6-1.3.5 {
885b413d78Sdanielk1977  execsql {
895b413d78Sdanielk1977    COMMIT;
905b413d78Sdanielk1977    BEGIN;
915b413d78Sdanielk1977    SELECT * FROM t1;
925b413d78Sdanielk1977  } db1
935b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db2
945b413d78Sdanielk1977} {1 2}
95856cc0fdSdanielk1977do_test shared6-1.3.5 {
965b413d78Sdanielk1977  catchsql { INSERT INTO t1 VALUES(5, 6) } db2
975b413d78Sdanielk1977} {1 {database table is locked: t1}}
98856cc0fdSdanielk1977do_test shared6-1.3.X {
995b413d78Sdanielk1977  execsql { COMMIT } db1
1005b413d78Sdanielk1977} {}
1015b413d78Sdanielk1977
1025b413d78Sdanielk1977# Read-uncommitted mode.
1035b413d78Sdanielk1977#
1045b413d78Sdanielk1977# For these tests, connection [db2] is in read-uncommitted mode.
1055b413d78Sdanielk1977#
1065b413d78Sdanielk1977#   1.4.1: If [db1] has a write-lock on t1, [db2] can still read from t1.
1075b413d78Sdanielk1977#   1.4.2: If [db1] has a write-lock on the db schema (sqlite_master table),
1085b413d78Sdanielk1977#          [db2] cannot read from the schema.
1095b413d78Sdanielk1977#   1.4.3: If [db1] has a read-lock on t1, [db2] cannot write to t1.
1105b413d78Sdanielk1977#
111856cc0fdSdanielk1977do_test shared6-1.4.1 {
1125b413d78Sdanielk1977  execsql { PRAGMA read_uncommitted = 1 } db2
1135b413d78Sdanielk1977  execsql {
1145b413d78Sdanielk1977    BEGIN;
1155b413d78Sdanielk1977    INSERT INTO t1 VALUES(5, 6);
1165b413d78Sdanielk1977  } db1
1175b413d78Sdanielk1977  execsql { SELECT * FROM t1 } db2
1185b413d78Sdanielk1977} {1 2 5 6}
119856cc0fdSdanielk1977do_test shared6-1.4.2 {
1205b413d78Sdanielk1977  execsql { CREATE TABLE t4(a, b) } db1
1215b413d78Sdanielk1977  catchsql { SELECT * FROM t1 } db2
1225b413d78Sdanielk1977} {1 {database table is locked}}
123856cc0fdSdanielk1977do_test shared6-1.4.3 {
1245b413d78Sdanielk1977  execsql {
1255b413d78Sdanielk1977    COMMIT;
1265b413d78Sdanielk1977    BEGIN;
1275b413d78Sdanielk1977    SELECT * FROM t1;
1285b413d78Sdanielk1977  } db1
1295b413d78Sdanielk1977  catchsql { INSERT INTO t1 VALUES(7, 8) } db2
1305b413d78Sdanielk1977} {1 {database table is locked: t1}}
1315b413d78Sdanielk1977
132856cc0fdSdanielk1977do_test shared6-1.X {
1335b413d78Sdanielk1977  db1 close
1345b413d78Sdanielk1977  db2 close
1355b413d78Sdanielk1977} {}
1365b413d78Sdanielk1977
137fa542f1fSdanielk1977#-------------------------------------------------------------------------
138856cc0fdSdanielk1977# The following tests - shared6-2.* - test that two database connections
139856cc0fdSdanielk1977# that connect to the same file using different VFS implementations do
140856cc0fdSdanielk1977# not share a cache.
141fa542f1fSdanielk1977#
142856cc0fdSdanielk1977if {$::tcl_platform(platform) eq "unix"} {
143856cc0fdSdanielk1977  do_test shared6-2.1 {
144856cc0fdSdanielk1977    sqlite3 db1 test.db -vfs unix
145856cc0fdSdanielk1977    sqlite3 db2 test.db -vfs unix
146856cc0fdSdanielk1977    sqlite3 db3 test.db -vfs unix-none
147856cc0fdSdanielk1977    sqlite3 db4 test.db -vfs unix-none
148856cc0fdSdanielk1977  } {}
149856cc0fdSdanielk1977
150856cc0fdSdanielk1977  do_test shared6-2.2 {
151856cc0fdSdanielk1977    execsql { BEGIN; INSERT INTO t1 VALUES(9, 10); } db1
152856cc0fdSdanielk1977    catchsql { SELECT * FROM t1 } db2
153856cc0fdSdanielk1977  } {1 {database table is locked: t1}}
154856cc0fdSdanielk1977  do_test shared6-2.3 {
155856cc0fdSdanielk1977    execsql { SELECT * FROM t1 } db3
156856cc0fdSdanielk1977  } {1 2 5 6}
157856cc0fdSdanielk1977
158856cc0fdSdanielk1977  do_test shared6-2.3 {
159856cc0fdSdanielk1977    execsql { COMMIT } db1
160856cc0fdSdanielk1977    execsql { BEGIN; INSERT INTO t1 VALUES(11, 12); } db3
161856cc0fdSdanielk1977    catchsql { SELECT * FROM t1 } db4
162856cc0fdSdanielk1977  } {1 {database table is locked: t1}}
163856cc0fdSdanielk1977
164856cc0fdSdanielk1977  do_test shared6-2.4 {
165856cc0fdSdanielk1977    execsql { SELECT * FROM t1 } db1
166856cc0fdSdanielk1977  } {1 2 5 6 9 10}
167856cc0fdSdanielk1977
168856cc0fdSdanielk1977  do_test shared6-2.5 {
169856cc0fdSdanielk1977    execsql { COMMIT } db3
170856cc0fdSdanielk1977  } {}
171856cc0fdSdanielk1977
172856cc0fdSdanielk1977  do_test shared6-2.X {
173856cc0fdSdanielk1977    db1 close
174856cc0fdSdanielk1977    db2 close
175856cc0fdSdanielk1977    db3 close
176856cc0fdSdanielk1977    db4 close
177856cc0fdSdanielk1977  } {}
178856cc0fdSdanielk1977}
179856cc0fdSdanielk1977
180fa542f1fSdanielk1977#-------------------------------------------------------------------------
181fa542f1fSdanielk1977# Test that it is possible to open an exclusive transaction while
182fa542f1fSdanielk1977# already holding a read-lock on the database file. And that it is
183fa542f1fSdanielk1977# not possible if some other connection holds such a lock.
184fa542f1fSdanielk1977#
185fa542f1fSdanielk1977do_test shared6-3.1 {
186fa542f1fSdanielk1977  sqlite3 db1 test.db
187fa542f1fSdanielk1977  sqlite3 db2 test.db
188fa542f1fSdanielk1977  sqlite3 db3 test.db
189fa542f1fSdanielk1977} {}
190fa542f1fSdanielk1977db1 eval {SELECT * FROM t1} {
191fa542f1fSdanielk1977  # Within this block [db1] is holding a read-lock on t1. Test that
192fa542f1fSdanielk1977  # this means t1 cannot be written by [db2].
193fa542f1fSdanielk1977  #
194fa542f1fSdanielk1977  do_test shared6-3.2 {
195fa542f1fSdanielk1977    catchsql { INSERT INTO t1 VALUES(1, 2) } db2
196fa542f1fSdanielk1977  } {1 {database table is locked: t1}}
197fa542f1fSdanielk1977
198fa542f1fSdanielk1977  do_test shared6-3.3 {
199fa542f1fSdanielk1977    execsql { BEGIN EXCLUSIVE } db1
200fa542f1fSdanielk1977  } {}
201fa542f1fSdanielk1977  break
202fa542f1fSdanielk1977}
203fa542f1fSdanielk1977do_test shared6-3.4 {
204fa542f1fSdanielk1977  catchsql { SELECT * FROM t1 } db2
205fa542f1fSdanielk1977} {1 {database schema is locked: main}}
206fa542f1fSdanielk1977do_test shared6-3.5 {
207fa542f1fSdanielk1977  execsql COMMIT db1
208fa542f1fSdanielk1977} {}
209fa542f1fSdanielk1977db2 eval {SELECT * FROM t1} {
210fa542f1fSdanielk1977  do_test shared6-3.6 {
211fa542f1fSdanielk1977    catchsql { BEGIN EXCLUSIVE } db1
212fa542f1fSdanielk1977  } {1 {database table is locked}}
213fa542f1fSdanielk1977  break
214fa542f1fSdanielk1977}
215fa542f1fSdanielk1977do_test shared6-3.7 {
216fa542f1fSdanielk1977  execsql { BEGIN } db1
217fa542f1fSdanielk1977  execsql { BEGIN } db2
218fa542f1fSdanielk1977} {}
219fa542f1fSdanielk1977db2 eval {SELECT * FROM t1} {
220fa542f1fSdanielk1977  do_test shared6-3.8 {
221fa542f1fSdanielk1977    catchsql { INSERT INTO t1 VALUES(1, 2) } db1
222fa542f1fSdanielk1977  } {1 {database table is locked: t1}}
223fa542f1fSdanielk1977  break
224fa542f1fSdanielk1977}
225fa542f1fSdanielk1977do_test shared6-3.9 {
226fa542f1fSdanielk1977  execsql { BEGIN ; ROLLBACK } db3
227fa542f1fSdanielk1977} {}
228fa542f1fSdanielk1977do_test shared6-3.10 {
229fa542f1fSdanielk1977  catchsql { SELECT * FROM t1 } db3
230fa542f1fSdanielk1977} {1 {database table is locked}}
231fa542f1fSdanielk1977do_test shared6-3.X {
232fa542f1fSdanielk1977  db1 close
233fa542f1fSdanielk1977  db2 close
234fa542f1fSdanielk1977  db3 close
235fa542f1fSdanielk1977} {}
236fa542f1fSdanielk1977
237fa542f1fSdanielk1977do_test shared6-4.1 {
238*fda06befSmistachkin  #forcedelete test.db test.db-journal
239fa542f1fSdanielk1977  sqlite3 db1 test.db
240fa542f1fSdanielk1977  sqlite3 db2 test.db
241fa542f1fSdanielk1977
242fa542f1fSdanielk1977  set ::STMT [sqlite3_prepare_v2 db1 "SELECT * FROM t1" -1 DUMMY]
243fa542f1fSdanielk1977  execsql { CREATE TABLE t5(a, b) } db2
244fa542f1fSdanielk1977} {}
245fa542f1fSdanielk1977do_test shared6-4.2 {
246fa542f1fSdanielk1977  sqlite3_finalize $::STMT
247fa542f1fSdanielk1977} {SQLITE_OK}
248fa542f1fSdanielk1977do_test shared6-4.X {
249fa542f1fSdanielk1977
250fa542f1fSdanielk1977  db1 close
251fa542f1fSdanielk1977  db2 close
252fa542f1fSdanielk1977} {}
253fa542f1fSdanielk1977
2545b413d78Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache
2555b413d78Sdanielk1977finish_test
256