update changelog to reflect upstream SQLite version
[sqlcipher.git] / test / walsetlk.test
blob8c0a9659f7f72689bb029e82f73a2f392a890c6e
1 # 2020 May 06
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
15 source $testdir/lock_common.tcl
16 set testprefix walsetlk
18 ifcapable !wal {finish_test ; return }
19 db timeout 1000
21 #-------------------------------------------------------------------------
22 # 1.*: Test that nothing goes wrong if recovery is forced while opening
23 #      a write transaction or performing a checkpoint with blocking locks.
26 do_execsql_test 1.0 {
27   CREATE TABLE t1(x, y);
28   PRAGMA journal_mode = wal;
29   INSERT INTO t1 VALUES(1, 2);
30   INSERT INTO t1 VALUES(3, 4);
31   INSERT INTO t1 VALUES(5, 6);
32   INSERT INTO t1 VALUES(7, 8);
33 } {wal}
35 sqlite3 db2 test.db
36 db2 timeout 1000
38 do_execsql_test -db db2 1.1 {
39   SELECT * FROM t1
40 } {1 2 3 4 5 6 7 8}
42 set fd [open test.db-shm r+]
43 puts $fd "blahblahblahblah"
44 flush $fd
46 do_execsql_test 1.2 {
47   BEGIN;
48     INSERT INTO t1 VALUES(9, 10);
51 do_execsql_test -db db2 1.3 {
52   SELECT * FROM t1
53 } {1 2 3 4 5 6 7 8}
55 do_test 1.4 {
56   list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg
57 } {1 {database is locked}}
59 do_execsql_test 1.5 { COMMIT }
60 do_execsql_test -db db2 1.6 {
61   SELECT * FROM t1
62 } {1 2 3 4 5 6 7 8 9 10}
64 puts $fd "blahblahblahblah"
65 flush $fd
67 do_execsql_test -db db2 1.7 {
68   PRAGMA wal_checkpoint = TRUNCATE
69 } {0 0 0}
71 do_test 1.8 {
72   file size test.db-wal
73 } 0
75 close $fd
76 db close
77 db2 close
78 #-------------------------------------------------------------------------
80 do_multiclient_test tn {
81   do_test 2.$tn.1 {
82     sql1 {
83       PRAGMA journal_mode = wal;
84       CREATE TABLE t1(s, v);
85       INSERT INTO t1 VALUES(1, 2);
86       INSERT INTO t1 VALUES(3, 4);
87       INSERT INTO t1 VALUES(5, 6);
88     }
89     code1 { db timeout 2000 }
90   } {}
92   do_test 2.$tn.2 {
93     sql2 {
94       BEGIN;
95         INSERT INTO t1 VALUES(7, 8);
96     }
97   } {}
99   do_test 2.$tn.3 {
100     set us [lindex [time { catch {db eval "BEGIN EXCLUSIVE"} }] 0]
101     expr $us>1000000 && $us<4000000
102   } {1}
104   do_test 2.$tn.4 {
105     sql2 { COMMIT }
106     sql1 { SELECT * FROM t1 }
107   } {1 2 3 4 5 6 7 8}
109   do_test 2.$tn.5 {
110     sql2 {
111       BEGIN;
112         INSERT INTO t1 VALUES(9, 10);
113     }
114   } {}
116   do_test 2.$tn.6 {
117     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
118     expr $us>1000000 && $us<4000000
119   } {1}
121   do_test 2.$tn.7 {
122     sql2 {
123       COMMIT;
124       BEGIN;
125         SELECT * FROM t1;
126     }
127   } {1 2 3 4 5 6 7 8 9 10}
129   do_test 2.$tn.8 {
130     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
131     expr $us>1000000 && $us<4000000
132   } {1}
134   do_test 2.$tn.9 {
135     sql3 {
136       INSERT INTO t1 VALUES(11, 12);
137     }
138     sql2 {
139       COMMIT;
140       BEGIN;
141         SELECT * FROM t1;
142     }
143     sql3 {
144       INSERT INTO t1 VALUES(13, 14);
145     }
146   } {}
148   do_test 2.$tn.10 {
149     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
150     expr $us>1000000 && $us<4000000
151   } {1}
153   do_test 2.$tn.11 {
154     sql3 {
155       BEGIN;
156         SELECT * FROM t1;
157     }
158     sql1 { INSERT INTO t1 VALUES(15, 16); }
159   } {}
161   do_test 2.$tn.12 {
162     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
163     expr $us>1000000 && $us<4000000
164   } {1}
166   do_test 2.$tn.13 {
167     sql2 {
168       COMMIT;
169       BEGIN;
170         SELECT * FROM t1;
171     }
172     sql1 { INSERT INTO t1 VALUES(17, 18); }
173   } {}
175   do_test 2.$tn.14 {
176     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
177     expr $us>1000000 && $us<4000000
178   } {1}
179   
182 #-------------------------------------------------------------------------
183 reset_db
184 sqlite3 db2 test.db
185 db2 timeout 1000
186 do_execsql_test 3.0 {
187   PRAGMA journal_mode = wal;
188   CREATE TABLE x1(x, y);
189   BEGIN;
190     INSERT INTO x1 VALUES(1, 2);
191 } {wal}
193 do_test 3.1 {
194   list [catch { db2 eval {BEGIN EXCLUSIVE} } msg] $msg
195 } {1 {database is locked}}
197 finish_test