blob: 58dd206997be56c7b67270ed98389596eed49496 [file] [log] [blame]
drhbb5f18d2007-04-06 18:23:17 +00001# 2007 April 6
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this script is database locks.
13#
drh310bd202009-05-06 00:52:40 +000014# $Id: lock4.test,v 1.10 2009/05/06 00:52:41 drh Exp $
drhbb5f18d2007-04-06 18:23:17 +000015
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
dan69aedc82018-01-13 13:07:49 +000020if {[atomic_batch_write test.db]} {
21 # This test uses two processes, one of which blocks until the other
22 # creates a *-journal file. Which doesn't work if atomic writes are
23 # available.
24 finish_test
25 return
26}
27
dan68928b62010-06-22 13:46:43 +000028do_not_use_codec
29
drhbb5f18d2007-04-06 18:23:17 +000030# Initialize the test.db database so that it is non-empty
31#
32do_test lock4-1.1 {
drh1e9daa62007-04-06 21:42:22 +000033 db eval {
34 PRAGMA auto_vacuum=OFF;
35 CREATE TABLE t1(x);
36 }
mistachkinfda06be2011-08-02 00:57:34 +000037 forcedelete test2.db test2.db-journal
drhbb5f18d2007-04-06 18:23:17 +000038 sqlite3 db2 test2.db
drh1e9daa62007-04-06 21:42:22 +000039 db2 eval {
40 PRAGMA auto_vacuum=OFF;
41 CREATE TABLE t2(x)
42 }
drhbb5f18d2007-04-06 18:23:17 +000043 db2 close
44 list [file size test.db] [file size test2.db]
45} {2048 2048}
46
47# Create a script to drive a separate process that will
48#
49# 1. Create a second database test2.db
50# 2. Get an exclusive lock on test2.db
51# 3. Add an entry to test.db in table t1, waiting as necessary.
52# 4. Commit the change to test2.db.
53#
54# Meanwhile, this process will:
55#
56# A. Get an exclusive lock on test.db
57# B. Attempt to read from test2.db but get an SQLITE_BUSY error.
58# C. Commit the changes to test.db thus alloing the other process
59# to continue.
60#
61do_test lock4-1.2 {
danielk1977d5fe8d62008-03-14 08:57:41 +000062
63 # Create a script for the second process to run.
64 #
drhbb5f18d2007-04-06 18:23:17 +000065 set out [open test2-script.tcl w]
drhc7a3bb92009-02-05 16:31:45 +000066 puts $out "sqlite3_test_control_pending_byte [set sqlite_pending_byte]"
drhbb5f18d2007-04-06 18:23:17 +000067 puts $out {
68 sqlite3 db2 test2.db
69 db2 eval {
70 BEGIN;
71 INSERT INTO t2 VALUES(2);
72 }
73 sqlite3 db test.db
74 db timeout 1000000
75 db eval {
76 INSERT INTO t1 VALUES(2);
77 }
danielk19774ffb7b92008-03-13 04:53:52 +000078 db close
drhbb5f18d2007-04-06 18:23:17 +000079 db2 eval COMMIT
80 exit
81 }
82 close $out
danielk1977d5fe8d62008-03-14 08:57:41 +000083
84 # Begin a transaction on test.db.
drhbb5f18d2007-04-06 18:23:17 +000085 db eval {
danielk1977d5fe8d62008-03-14 08:57:41 +000086 BEGIN EXCLUSIVE;
drhbb5f18d2007-04-06 18:23:17 +000087 INSERT INTO t1 VALUES(1);
88 }
danielk1977d5fe8d62008-03-14 08:57:41 +000089
90 # Kick off the second process.
drhbb5f18d2007-04-06 18:23:17 +000091 exec [info nameofexec] ./test2-script.tcl &
danielk1977d5fe8d62008-03-14 08:57:41 +000092
93 # Wait until the second process has started its transaction on test2.db.
drhbb5f18d2007-04-06 18:23:17 +000094 while {![file exists test2.db-journal]} {
95 after 10
96 }
danielk1977d5fe8d62008-03-14 08:57:41 +000097
98 # Try to write to test2.db. We are locked out.
drhbb5f18d2007-04-06 18:23:17 +000099 sqlite3 db2 test2.db
100 catchsql {
101 INSERT INTO t2 VALUES(1)
102 } db2
103} {1 {database is locked}}
104do_test lock4-1.3 {
105 db eval {
106 COMMIT;
107 }
drhbb5f18d2007-04-06 18:23:17 +0000108 while {[file exists test2.db-journal]} {
109 after 10
110 }
danielk1977d5fe8d62008-03-14 08:57:41 +0000111 # The other process has committed its transaction on test2.db by
112 # deleting the journal file. But it might retain the lock for a
113 # fraction longer
114 #
drh310bd202009-05-06 00:52:40 +0000115 after 25
drhbb5f18d2007-04-06 18:23:17 +0000116 db2 eval {
117 SELECT * FROM t2
118 }
119} {2}
120
121
122do_test lock4-999.1 {
123 rename db2 {}
124} {}
125
126finish_test