xref: /sqlite-3.40.0/test/notify1.test (revision fda06bef)
1404ca075Sdanielk1977# 2009 March 04
2404ca075Sdanielk1977#
3404ca075Sdanielk1977# The author disclaims copyright to this source code.  In place of
4404ca075Sdanielk1977# a legal notice, here is a blessing:
5404ca075Sdanielk1977#
6404ca075Sdanielk1977#    May you do good and not evil.
7404ca075Sdanielk1977#    May you find forgiveness for yourself and forgive others.
8404ca075Sdanielk1977#    May you share freely, never taking more than you give.
9404ca075Sdanielk1977#
10404ca075Sdanielk1977#***********************************************************************
11404ca075Sdanielk1977# This file implements regression tests for SQLite library.  The
12404ca075Sdanielk1977# focus of this file is testing the sqlite3_unlock_notify() API.
13404ca075Sdanielk1977#
14dda70fe3Sdrh# $Id: notify1.test,v 1.4 2009/06/05 17:09:12 drh Exp $
15404ca075Sdanielk1977
16404ca075Sdanielk1977set testdir [file dirname $argv0]
17404ca075Sdanielk1977source $testdir/tester.tcl
18404ca075Sdanielk1977
19404ca075Sdanielk1977ifcapable !unlock_notify||!shared_cache {
20404ca075Sdanielk1977  finish_test
21404ca075Sdanielk1977  return
22404ca075Sdanielk1977}
23404ca075Sdanielk1977db close
24404ca075Sdanielk1977set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
25404ca075Sdanielk1977
26404ca075Sdanielk1977#-------------------------------------------------------------------------
27404ca075Sdanielk1977# Warm body test. Test that an unlock-notify callback can be registered
28404ca075Sdanielk1977# and that it is invoked.
29404ca075Sdanielk1977#
30404ca075Sdanielk1977do_test notify1-1.1 {
31404ca075Sdanielk1977  sqlite3 db test.db
32404ca075Sdanielk1977  sqlite3 db2 test.db
33404ca075Sdanielk1977  execsql { CREATE TABLE t1(a, b) }
34404ca075Sdanielk1977} {}
35404ca075Sdanielk1977do_test notify1-1.2 {
36404ca075Sdanielk1977  execsql {
37404ca075Sdanielk1977    BEGIN;
38404ca075Sdanielk1977    INSERT INTO t1 VALUES(1, 2);
39404ca075Sdanielk1977  }
40404ca075Sdanielk1977  catchsql { INSERT INTO t1 VALUES(3, 4) } db2
41404ca075Sdanielk1977} {1 {database table is locked}}
42404ca075Sdanielk1977do_test notify1-1.3 {
43404ca075Sdanielk1977  set zScript ""
44404ca075Sdanielk1977  db2 unlock_notify {
45404ca075Sdanielk1977    set zScript "db2 eval { INSERT INTO t1 VALUES(3, 4) }"
46404ca075Sdanielk1977  }
47404ca075Sdanielk1977  execsql { SELECT * FROM t1 }
48404ca075Sdanielk1977} {1 2}
49404ca075Sdanielk1977do_test notify1-1.4 {
50404ca075Sdanielk1977  set zScript
51404ca075Sdanielk1977} {}
52404ca075Sdanielk1977do_test notify1-1.5 {
53404ca075Sdanielk1977  execsql { COMMIT }
54404ca075Sdanielk1977  eval $zScript
55404ca075Sdanielk1977  execsql { SELECT * FROM t1 }
56404ca075Sdanielk1977} {1 2 3 4}
57404ca075Sdanielk1977
58404ca075Sdanielk1977#-------------------------------------------------------------------------
5965a73badSdrh# Verify that invoking the "unlock_notify" method with no arguments
6065a73badSdrh# (which is the equivalent of invoking sqlite3_unlock_notify() with
6165a73badSdrh# a NULL xNotify argument) cancels a pending notify callback.
6265a73badSdrh#
6365a73badSdrhdo_test notify1-1.11 {
6465a73badSdrh  execsql { DROP TABLE t1; CREATE TABLE t1(a, b) }
6565a73badSdrh} {}
6665a73badSdrhdo_test notify1-1.12 {
6765a73badSdrh  execsql {
6865a73badSdrh    BEGIN;
6965a73badSdrh    INSERT INTO t1 VALUES(1, 2);
7065a73badSdrh  }
7165a73badSdrh  catchsql { INSERT INTO t1 VALUES(3, 4) } db2
7265a73badSdrh} {1 {database table is locked}}
7365a73badSdrhdo_test notify1-1.13 {
7465a73badSdrh  set zScript ""
7565a73badSdrh  db2 unlock_notify {
7665a73badSdrh    set zScript "db2 eval { INSERT INTO t1 VALUES(3, 4) }"
7765a73badSdrh  }
7865a73badSdrh  execsql { SELECT * FROM t1 }
7965a73badSdrh} {1 2}
8065a73badSdrhdo_test notify1-1.14 {
8165a73badSdrh  set zScript
8265a73badSdrh} {}
8365a73badSdrhdo_test notify1-1.15 {
8465a73badSdrh  db2 unlock_notify
8565a73badSdrh  execsql { COMMIT }
8665a73badSdrh  eval $zScript
8765a73badSdrh  execsql { SELECT * FROM t1 }
8865a73badSdrh} {1 2}
8965a73badSdrh
9065a73badSdrh#-------------------------------------------------------------------------
91404ca075Sdanielk1977# The following tests, notify1-2.*, test that deadlock is detected
92404ca075Sdanielk1977# correctly.
93404ca075Sdanielk1977#
94404ca075Sdanielk1977do_test notify1-2.1 {
95404ca075Sdanielk1977  execsql {
96404ca075Sdanielk1977    CREATE TABLE t2(a, b);
97404ca075Sdanielk1977    INSERT INTO t2 VALUES('I', 'II');
98404ca075Sdanielk1977  }
99404ca075Sdanielk1977} {}
100404ca075Sdanielk1977
101404ca075Sdanielk1977#
102404ca075Sdanielk1977# Test for simple deadlock involving two database connections.
103404ca075Sdanielk1977#
104404ca075Sdanielk1977# 1. Grab a write-lock on t1 with [db]. Then grab a read-lock on t2 with [db2].
105404ca075Sdanielk1977# 2. Try to grab a read-lock on t1 with [db2] (fails).
106404ca075Sdanielk1977# 3. Have [db2] wait on the read-lock it failed to obtain in step 2.
107404ca075Sdanielk1977# 4. Try to grab a write-lock on t2 with [db] (fails).
108404ca075Sdanielk1977# 5. Try to have [db] wait on the lock from step 4. Fails, as the system
109404ca075Sdanielk1977#    would be deadlocked (since [db2] is already waiting on [db], and this
110404ca075Sdanielk1977#    operation would have [db] wait on [db2]).
111404ca075Sdanielk1977#
112404ca075Sdanielk1977do_test notify1-2.2.1 {
113404ca075Sdanielk1977  execsql {
114404ca075Sdanielk1977    BEGIN;
115404ca075Sdanielk1977    INSERT INTO t1 VALUES(5, 6);
116404ca075Sdanielk1977  }
117404ca075Sdanielk1977  execsql {
118404ca075Sdanielk1977    BEGIN;
119404ca075Sdanielk1977    SELECT * FROM t2;
120404ca075Sdanielk1977  } db2
121404ca075Sdanielk1977} {I II}
122404ca075Sdanielk1977do_test notify1-2.2.2 {
123404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db2
124404ca075Sdanielk1977} {1 {database table is locked: t1}}
125404ca075Sdanielk1977do_test notify1-2.2.3 {
126404ca075Sdanielk1977  db2 unlock_notify {lappend unlock_notify db2}
127404ca075Sdanielk1977} {}
128404ca075Sdanielk1977do_test notify1-2.2.4 {
129404ca075Sdanielk1977  catchsql { INSERT INTO t2 VALUES('III', 'IV') }
130404ca075Sdanielk1977} {1 {database table is locked: t2}}
131404ca075Sdanielk1977do_test notify1-2.2.5 {
132404ca075Sdanielk1977  set rc [catch { db unlock_notify {lappend unlock_notify db} } msg]
133404ca075Sdanielk1977  list $rc $msg
134404ca075Sdanielk1977} {1 {database is deadlocked}}
135404ca075Sdanielk1977
136404ca075Sdanielk1977#
137404ca075Sdanielk1977# Test for slightly more complex deadlock involving three database
138404ca075Sdanielk1977# connections: db, db2 and db3.
139404ca075Sdanielk1977#
140404ca075Sdanielk1977do_test notify1-2.3.1 {
141404ca075Sdanielk1977  db close
142404ca075Sdanielk1977  db2 close
143*fda06befSmistachkin  forcedelete test.db test2.db test3.db
144404ca075Sdanielk1977  foreach con {db db2 db3} {
145404ca075Sdanielk1977    sqlite3 $con test.db
146404ca075Sdanielk1977    $con eval { ATTACH 'test2.db' AS aux2 }
147404ca075Sdanielk1977    $con eval { ATTACH 'test3.db' AS aux3 }
148404ca075Sdanielk1977  }
149404ca075Sdanielk1977  execsql {
150404ca075Sdanielk1977    CREATE TABLE main.t1(a, b);
151404ca075Sdanielk1977    CREATE TABLE aux2.t2(a, b);
152404ca075Sdanielk1977    CREATE TABLE aux3.t3(a, b);
153404ca075Sdanielk1977  }
154404ca075Sdanielk1977} {}
155404ca075Sdanielk1977do_test notify1-2.3.2 {
156404ca075Sdanielk1977  execsql { BEGIN ; INSERT INTO t1 VALUES(1, 2) } db
157404ca075Sdanielk1977  execsql { BEGIN ; INSERT INTO t2 VALUES(1, 2) } db2
158404ca075Sdanielk1977  execsql { BEGIN ; INSERT INTO t3 VALUES(1, 2) } db3
159404ca075Sdanielk1977} {}
160404ca075Sdanielk1977do_test notify1-2.3.3 {
161404ca075Sdanielk1977  catchsql { SELECT * FROM t2 } db
162404ca075Sdanielk1977} {1 {database table is locked: t2}}
163404ca075Sdanielk1977do_test notify1-2.3.4 {
164404ca075Sdanielk1977  catchsql { SELECT * FROM t3 } db2
165404ca075Sdanielk1977} {1 {database table is locked: t3}}
166404ca075Sdanielk1977do_test notify1-2.3.5 {
167404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db3
168404ca075Sdanielk1977} {1 {database table is locked: t1}}
169404ca075Sdanielk1977do_test notify1-2.3.6 {
170404ca075Sdanielk1977  set lUnlock [list]
171404ca075Sdanielk1977  db  unlock_notify {lappend lUnlock db}
172404ca075Sdanielk1977  db2 unlock_notify {lappend lUnlock db2}
173404ca075Sdanielk1977} {}
174404ca075Sdanielk1977do_test notify1-2.3.7 {
175404ca075Sdanielk1977  set rc [catch { db3 unlock_notify {lappend lUnlock db3} } msg]
176404ca075Sdanielk1977  list $rc $msg
177404ca075Sdanielk1977} {1 {database is deadlocked}}
178404ca075Sdanielk1977do_test notify1-2.3.8 {
179404ca075Sdanielk1977  execsql { COMMIT }
180404ca075Sdanielk1977  set lUnlock
181404ca075Sdanielk1977} {}
182404ca075Sdanielk1977do_test notify1-2.3.9 {
183404ca075Sdanielk1977  db3 unlock_notify {lappend lUnlock db3}
184404ca075Sdanielk1977  set lUnlock
185404ca075Sdanielk1977} {db3}
186404ca075Sdanielk1977do_test notify1-2.3.10 {
187404ca075Sdanielk1977  execsql { COMMIT } db2
188404ca075Sdanielk1977  set lUnlock
189404ca075Sdanielk1977} {db3 db}
190404ca075Sdanielk1977do_test notify1-2.3.11 {
191404ca075Sdanielk1977  execsql { COMMIT } db3
192404ca075Sdanielk1977  set lUnlock
193404ca075Sdanielk1977} {db3 db db2}
194404ca075Sdanielk1977catch { db3 close }
195404ca075Sdanielk1977catch { db2 close }
196404ca075Sdanielk1977catch { db close }
197404ca075Sdanielk1977
198404ca075Sdanielk1977#-------------------------------------------------------------------------
199404ca075Sdanielk1977# The following tests, notify1-3.* and notify1-4.*, test that callbacks
200404ca075Sdanielk1977# can be issued when there are many (>16) connections waiting on a single
201404ca075Sdanielk1977# unlock event.
202404ca075Sdanielk1977#
203404ca075Sdanielk1977foreach {tn nConn} {3 20 4 76} {
204404ca075Sdanielk1977  do_test notify1-$tn.1 {
205404ca075Sdanielk1977    sqlite3 db test.db
206404ca075Sdanielk1977    execsql {
207404ca075Sdanielk1977      BEGIN;
208404ca075Sdanielk1977      INSERT INTO t1 VALUES('a', 'b');
209404ca075Sdanielk1977    }
210404ca075Sdanielk1977  } {}
211404ca075Sdanielk1977  set lUnlock [list]
212404ca075Sdanielk1977  set lUnlockFinal [list]
213404ca075Sdanielk1977  for {set ii 1} {$ii <= $nConn} {incr ii} {
214404ca075Sdanielk1977    do_test notify1-$tn.2.$ii.1 {
215404ca075Sdanielk1977      set cmd "db$ii"
216404ca075Sdanielk1977      sqlite3 $cmd test.db
217404ca075Sdanielk1977      catchsql { SELECT * FROM t1 } $cmd
218404ca075Sdanielk1977    } {1 {database table is locked: t1}}
219404ca075Sdanielk1977    do_test notify1-$tn.2.$ii.2 {
220404ca075Sdanielk1977      $cmd unlock_notify "lappend lUnlock $ii"
221404ca075Sdanielk1977    } {}
222404ca075Sdanielk1977    lappend lUnlockFinal $ii
223404ca075Sdanielk1977  }
224404ca075Sdanielk1977  do_test notify1-$tn.3 {
225404ca075Sdanielk1977    set lUnlock
226404ca075Sdanielk1977  } {}
227404ca075Sdanielk1977  do_test notify1-$tn.4 {
228404ca075Sdanielk1977    execsql {COMMIT}
229404ca075Sdanielk1977    lsort -integer $lUnlock
230404ca075Sdanielk1977  } $lUnlockFinal
231404ca075Sdanielk1977  do_test notify1-$tn.5 {
232404ca075Sdanielk1977    for {set ii 1} {$ii <= $nConn} {incr ii} {
233404ca075Sdanielk1977      "db$ii" close
234404ca075Sdanielk1977    }
235404ca075Sdanielk1977  } {}
236404ca075Sdanielk1977}
237404ca075Sdanielk1977db close
238404ca075Sdanielk1977
239404ca075Sdanielk1977#-------------------------------------------------------------------------
240404ca075Sdanielk1977# These tests, notify1-5.*, test that a malloc() failure that occurs while
241404ca075Sdanielk1977# allocating an array to use as an argument to an unlock-notify callback
242404ca075Sdanielk1977# is handled correctly.
243404ca075Sdanielk1977#
244404ca075Sdanielk1977source $testdir/malloc_common.tcl
245404ca075Sdanielk1977do_malloc_test notify1-5 -tclprep {
246404ca075Sdanielk1977  set ::lUnlock [list]
247404ca075Sdanielk1977  execsql {
248404ca075Sdanielk1977    CREATE TABLE t1(a, b);
249404ca075Sdanielk1977    BEGIN;
250404ca075Sdanielk1977    INSERT INTO t1 VALUES('a', 'b');
251404ca075Sdanielk1977  }
252404ca075Sdanielk1977  for {set ii 1} {$ii <= 60} {incr ii} {
253404ca075Sdanielk1977    set cmd "db$ii"
254404ca075Sdanielk1977    sqlite3 $cmd test.db
255404ca075Sdanielk1977    catchsql { SELECT * FROM t1 } $cmd
256404ca075Sdanielk1977    $cmd unlock_notify "lappend ::lUnlock $ii"
257404ca075Sdanielk1977  }
258404ca075Sdanielk1977} -sqlbody {
259404ca075Sdanielk1977  COMMIT;
260404ca075Sdanielk1977} -cleanup {
261404ca075Sdanielk1977  # One of two things should have happened:
262404ca075Sdanielk1977  #
263404ca075Sdanielk1977  #   1) The transaction opened by [db] was not committed. No unlock-notify
264404ca075Sdanielk1977  #      callbacks were invoked, OR
265404ca075Sdanielk1977  #   2) The transaction opened by [db] was committed and 60 unlock-notify
266404ca075Sdanielk1977  #      callbacks were invoked.
267404ca075Sdanielk1977  #
268404ca075Sdanielk1977  do_test notify1-5.systemstate {
269404ca075Sdanielk1977    expr { ([llength $::lUnlock]==0 && [sqlite3_get_autocommit db]==0)
270404ca075Sdanielk1977        || ([llength $::lUnlock]==60 && [sqlite3_get_autocommit db]==1)
271404ca075Sdanielk1977    }
272404ca075Sdanielk1977  } {1}
273404ca075Sdanielk1977  for {set ii 1} {$ii <= 60} {incr ii} { "db$ii" close }
274404ca075Sdanielk1977}
275404ca075Sdanielk1977
276404ca075Sdanielk1977#-------------------------------------------------------------------------
277404ca075Sdanielk1977# Test cases notify1-6.* test cases where the following occur:
278404ca075Sdanielk1977#
279404ca075Sdanielk1977#   notify1-6.1.*: Test encountering an SQLITE_LOCKED error when the
280404ca075Sdanielk1977#                  "blocking connection" has already been set by a previous
281404ca075Sdanielk1977#                  SQLITE_LOCKED.
282404ca075Sdanielk1977#
283404ca075Sdanielk1977#   notify1-6.2.*: Test encountering an SQLITE_LOCKED error when already
284404ca075Sdanielk1977#                  waiting on an unlock-notify callback.
285404ca075Sdanielk1977#
286404ca075Sdanielk1977#   notify1-6.3.*: Test that if an SQLITE_LOCKED error is encountered while
287404ca075Sdanielk1977#                  already waiting on an unlock-notify callback, and then
288404ca075Sdanielk1977#                  the blocker that caused the SQLITE_LOCKED commits its
289404ca075Sdanielk1977#                  transaction, the unlock-notify callback is not invoked.
290404ca075Sdanielk1977#
291404ca075Sdanielk1977#   notify1-6.4.*: Like 6.3.*, except that instead of the second blocker
292404ca075Sdanielk1977#                  committing its transaction, the first does. The
293404ca075Sdanielk1977#                  unlock-notify callback is therefore invoked.
294404ca075Sdanielk1977#
295404ca075Sdanielk1977db close
296404ca075Sdanielk1977do_test notify1-6.1.1 {
297*fda06befSmistachkin  forcedelete test.db test2.db
298404ca075Sdanielk1977  foreach conn {db db2 db3} {
299404ca075Sdanielk1977    sqlite3 $conn test.db
300404ca075Sdanielk1977    execsql { ATTACH 'test2.db' AS two } $conn
301404ca075Sdanielk1977  }
302404ca075Sdanielk1977  execsql {
303404ca075Sdanielk1977    CREATE TABLE t1(a, b);
304404ca075Sdanielk1977    CREATE TABLE two.t2(a, b);
305404ca075Sdanielk1977  }
306404ca075Sdanielk1977  execsql {
307404ca075Sdanielk1977    BEGIN;
308404ca075Sdanielk1977    INSERT INTO t1 VALUES(1, 2);
309404ca075Sdanielk1977  } db2
310404ca075Sdanielk1977  execsql {
311404ca075Sdanielk1977    BEGIN;
312404ca075Sdanielk1977    INSERT INTO t2 VALUES(1, 2);
313404ca075Sdanielk1977  } db3
314404ca075Sdanielk1977} {}
315404ca075Sdanielk1977do_test notify1-6.1.2 {
316404ca075Sdanielk1977  catchsql { SELECT * FROM t2 }
317404ca075Sdanielk1977} {1 {database table is locked: t2}}
318404ca075Sdanielk1977do_test notify1-6.1.3 {
319404ca075Sdanielk1977  catchsql { SELECT * FROM t1 }
320404ca075Sdanielk1977} {1 {database table is locked: t1}}
321404ca075Sdanielk1977
322404ca075Sdanielk1977do_test notify1-6.2.1 {
323404ca075Sdanielk1977  set unlocked 0
324404ca075Sdanielk1977  db unlock_notify {set unlocked 1}
325404ca075Sdanielk1977  set unlocked
326404ca075Sdanielk1977} {0}
327404ca075Sdanielk1977do_test notify1-6.2.2 {
328404ca075Sdanielk1977  catchsql { SELECT * FROM t2 }
329404ca075Sdanielk1977} {1 {database table is locked: t2}}
330404ca075Sdanielk1977do_test notify1-6.2.3 {
331404ca075Sdanielk1977  execsql { COMMIT } db2
332404ca075Sdanielk1977  set unlocked
333404ca075Sdanielk1977} {1}
334404ca075Sdanielk1977
335404ca075Sdanielk1977do_test notify1-6.3.1 {
336404ca075Sdanielk1977  execsql {
337404ca075Sdanielk1977    BEGIN;
338404ca075Sdanielk1977    INSERT INTO t1 VALUES(3, 4);
339404ca075Sdanielk1977  } db2
340404ca075Sdanielk1977} {}
341404ca075Sdanielk1977do_test notify1-6.3.2 {
342404ca075Sdanielk1977  catchsql { SELECT * FROM t1 }
343404ca075Sdanielk1977} {1 {database table is locked: t1}}
344404ca075Sdanielk1977do_test notify1-6.3.3 {
345404ca075Sdanielk1977  set unlocked 0
346404ca075Sdanielk1977  db unlock_notify {set unlocked 1}
347404ca075Sdanielk1977  set unlocked
348404ca075Sdanielk1977} {0}
349404ca075Sdanielk1977do_test notify1-6.3.4 {
350404ca075Sdanielk1977  catchsql { SELECT * FROM t2 }
351404ca075Sdanielk1977} {1 {database table is locked: t2}}
352404ca075Sdanielk1977do_test notify1-6.3.5 {
353404ca075Sdanielk1977  execsql { COMMIT } db3
354404ca075Sdanielk1977  set unlocked
355404ca075Sdanielk1977} {0}
356404ca075Sdanielk1977
357404ca075Sdanielk1977do_test notify1-6.4.1 {
358404ca075Sdanielk1977  execsql {
359404ca075Sdanielk1977    BEGIN;
360404ca075Sdanielk1977    INSERT INTO t2 VALUES(3, 4);
361404ca075Sdanielk1977  } db3
362404ca075Sdanielk1977  catchsql { SELECT * FROM t2 }
363404ca075Sdanielk1977} {1 {database table is locked: t2}}
364404ca075Sdanielk1977do_test notify1-6.4.2 {
365404ca075Sdanielk1977  execsql { COMMIT } db2
366404ca075Sdanielk1977  set unlocked
367404ca075Sdanielk1977} {1}
368404ca075Sdanielk1977do_test notify1-6.4.3 {
369404ca075Sdanielk1977  execsql { COMMIT } db3
370404ca075Sdanielk1977} {}
371404ca075Sdanielk1977db close
372404ca075Sdanielk1977db2 close
373404ca075Sdanielk1977db3 close
374404ca075Sdanielk1977
375404ca075Sdanielk1977#-------------------------------------------------------------------------
376404ca075Sdanielk1977# Test cases notify1-7.* tests that when more than one distinct
377404ca075Sdanielk1977# unlock-notify function is registered, all are invoked correctly.
378404ca075Sdanielk1977#
379404ca075Sdanielk1977proc unlock_notify {} {
380404ca075Sdanielk1977  incr ::unlock_notify
381404ca075Sdanielk1977}
382404ca075Sdanielk1977do_test notify1-7.1 {
383404ca075Sdanielk1977  foreach conn {db db2 db3} {
384404ca075Sdanielk1977    sqlite3 $conn test.db
385404ca075Sdanielk1977  }
386404ca075Sdanielk1977  execsql {
387404ca075Sdanielk1977    BEGIN;
388404ca075Sdanielk1977    INSERT INTO t1 VALUES(5, 6);
389404ca075Sdanielk1977  }
390404ca075Sdanielk1977} {}
391404ca075Sdanielk1977do_test notify1-7.2 {
392404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db2
393404ca075Sdanielk1977} {1 {database table is locked: t1}}
394404ca075Sdanielk1977do_test notify1-7.3 {
395404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db3
396404ca075Sdanielk1977} {1 {database table is locked: t1}}
397404ca075Sdanielk1977do_test notify1-7.4 {
398404ca075Sdanielk1977  set unlock_notify 0
399404ca075Sdanielk1977  db2 unlock_notify unlock_notify
400404ca075Sdanielk1977  sqlite3_unlock_notify db3
401404ca075Sdanielk1977} {SQLITE_OK}
402404ca075Sdanielk1977do_test notify1-7.5 {
403404ca075Sdanielk1977  set unlock_notify
404404ca075Sdanielk1977} {0}
405404ca075Sdanielk1977do_test notify1-7.6 {
406404ca075Sdanielk1977  execsql { COMMIT }
407404ca075Sdanielk1977  set unlock_notify
408404ca075Sdanielk1977} {2}
409404ca075Sdanielk1977
410404ca075Sdanielk1977#-------------------------------------------------------------------------
411404ca075Sdanielk1977# Test cases notify1-8.* tests that the correct SQLITE_LOCKED extended
412404ca075Sdanielk1977# error code is returned in various scenarios.
413404ca075Sdanielk1977#
414404ca075Sdanielk1977do_test notify1-8.1 {
415404ca075Sdanielk1977  execsql {
416404ca075Sdanielk1977    BEGIN;
417404ca075Sdanielk1977    INSERT INTO t1 VALUES(7, 8);
418404ca075Sdanielk1977  }
419404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db2
420404ca075Sdanielk1977} {1 {database table is locked: t1}}
421404ca075Sdanielk1977do_test notify1-8.2 {
422404ca075Sdanielk1977  sqlite3_extended_errcode db2
423404ca075Sdanielk1977} {SQLITE_LOCKED_SHAREDCACHE}
424404ca075Sdanielk1977
425404ca075Sdanielk1977do_test notify1-8.3 {
426404ca075Sdanielk1977  execsql {
427404ca075Sdanielk1977    COMMIT;
428404ca075Sdanielk1977    BEGIN EXCLUSIVE;
429404ca075Sdanielk1977  }
430404ca075Sdanielk1977  catchsql { SELECT * FROM t1 } db2
431404ca075Sdanielk1977} {1 {database schema is locked: main}}
432404ca075Sdanielk1977do_test notify1-8.4 {
433404ca075Sdanielk1977  sqlite3_extended_errcode db2
434404ca075Sdanielk1977} {SQLITE_LOCKED_SHAREDCACHE}
435404ca075Sdanielk1977
436404ca075Sdanielk1977do_test notify1-8.X {
437404ca075Sdanielk1977  execsql { COMMIT }
438404ca075Sdanielk1977} {}
439404ca075Sdanielk1977
440404ca075Sdanielk1977#-------------------------------------------------------------------------
441404ca075Sdanielk1977# Test cases notify1-9.* test the shared-cache 'pending-lock' feature.
442404ca075Sdanielk1977#
443404ca075Sdanielk1977do_test notify1-9.1 {
444404ca075Sdanielk1977  execsql {
445404ca075Sdanielk1977    CREATE TABLE t2(a, b);
446404ca075Sdanielk1977    BEGIN;
447404ca075Sdanielk1977    SELECT * FROM t1;
448404ca075Sdanielk1977  } db2
449404ca075Sdanielk1977} {1 2 3 4 5 6 7 8}
450404ca075Sdanielk1977do_test notify1-9.2 {
451404ca075Sdanielk1977  execsql { SELECT * FROM t1 } db3
452404ca075Sdanielk1977} {1 2 3 4 5 6 7 8}
453404ca075Sdanielk1977do_test notify1-9.3 {
454404ca075Sdanielk1977  catchsql {
455404ca075Sdanielk1977    BEGIN;
456404ca075Sdanielk1977    INSERT INTO t1 VALUES(9, 10);
457404ca075Sdanielk1977  }
458404ca075Sdanielk1977} {1 {database table is locked: t1}}
459404ca075Sdanielk1977do_test notify1-9.4 {
460404ca075Sdanielk1977  catchsql { SELECT * FROM t2 } db3
461404ca075Sdanielk1977} {1 {database table is locked}}
462404ca075Sdanielk1977do_test notify1-9.5 {
463404ca075Sdanielk1977  execsql  { COMMIT } db2
464404ca075Sdanielk1977  execsql { SELECT * FROM t2 } db3
465404ca075Sdanielk1977} {}
466404ca075Sdanielk1977do_test notify1-9.6 {
467404ca075Sdanielk1977  execsql  { COMMIT }
468404ca075Sdanielk1977} {}
469404ca075Sdanielk1977
470404ca075Sdanielk1977do_test notify1-9.7 {
471404ca075Sdanielk1977  execsql {
472404ca075Sdanielk1977    BEGIN;
473404ca075Sdanielk1977    SELECT * FROM t1;
474404ca075Sdanielk1977  } db2
475404ca075Sdanielk1977} {1 2 3 4 5 6 7 8}
476404ca075Sdanielk1977do_test notify1-9.8 {
477404ca075Sdanielk1977  execsql { SELECT * FROM t1 } db3
478404ca075Sdanielk1977} {1 2 3 4 5 6 7 8}
479404ca075Sdanielk1977do_test notify1-9.9 {
480404ca075Sdanielk1977  catchsql {
481404ca075Sdanielk1977    BEGIN;
482404ca075Sdanielk1977    INSERT INTO t1 VALUES(9, 10);
483404ca075Sdanielk1977  }
484404ca075Sdanielk1977} {1 {database table is locked: t1}}
485404ca075Sdanielk1977do_test notify1-9.10 {
486404ca075Sdanielk1977  catchsql { SELECT * FROM t2 } db3
487404ca075Sdanielk1977} {1 {database table is locked}}
488404ca075Sdanielk1977do_test notify1-9.11 {
489404ca075Sdanielk1977  execsql  { COMMIT }
490404ca075Sdanielk1977  execsql { SELECT * FROM t2 } db3
491404ca075Sdanielk1977} {}
492404ca075Sdanielk1977do_test notify1-9.12 {
493404ca075Sdanielk1977  execsql  { COMMIT } db2
494404ca075Sdanielk1977} {}
495404ca075Sdanielk1977
496404ca075Sdanielk1977db close
497404ca075Sdanielk1977db2 close
498404ca075Sdanielk1977db3 close
499404ca075Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache
500404ca075Sdanielk1977finish_test
501