Merge trunk changes into this branch.
[sqlite.git] / ext / rbu / rbuexlock.test
blob28ab308fc082ec04143ec14a9763293b3d1a5dd4
1 # 2021 November 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 source [file join [file dirname [info script]] rbu_common.tcl]
14 if_no_rbu_support { finish_test ; return }
15 set ::testprefix rbuexlock
17 db close
19 set journalmode delete
20 if {[permutation]=="inmemory_journal"} {
21   set journalmode memory
24 # Create a simple RBU database. That expects to write to a table:
26 #   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
28 proc create_rbu {filename} {
29   forcedelete $filename
30   sqlite3 rbu1 $filename  
31   rbu1 eval {
32     CREATE TABLE data_t1(a, b, c, rbu_control);
33     INSERT INTO data_t1 VALUES(10, random(), random(), 0);
34     INSERT INTO data_t1 VALUES(20, random(), random(), 0);
35     INSERT INTO data_t1 VALUES(30, random(), random(), 0);
36     INSERT INTO data_t1 VALUES(40, random(), random(), 0);
37     INSERT INTO data_t1 VALUES(50, random(), random(), 0);
38     INSERT INTO data_t1 VALUES(60, random(), random(), 0);
39     INSERT INTO data_t1 VALUES(70, random(), random(), 0);
40     INSERT INTO data_t1 VALUES(80, random(), random(), 0);
41   }
42   rbu1 close
43   return $filename
46 reset_db
48 do_execsql_test 1.0 {
49   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
50   CREATE INDEX t1b ON t1(b);
51   CREATE INDEX t1c ON t1(c);
52   INSERT INTO t1 VALUES(1, 2, 3);
54 create_rbu rbu1.db
56 do_test 1.1.0 {
57   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
58   rbu step
59 } SQLITE_OK
60 do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
62 do_test 1.2.0 {
63   for {set ii 0} {$ii < 10} {incr ii} {
64     rbu step
65   }
66   rbu step
67 } SQLITE_OK
68 do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
69 do_test 1.2.2 {
70   db eval {PRAGMA journal_mode}
71 } $journalmode
73 do_test 1.3.0 {
74   while {[file exists test.db-wal]==0} {
75     rbu step
76   }
77 } {}
78 do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
79 do_test 1.3.2 {
80   db eval {PRAGMA journal_mode}
81 } $journalmode
84 do_test 1.4.0 {
85   rbu step
86 } SQLITE_OK
87 do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
88 do_test 1.4.2 {
89   db eval {PRAGMA journal_mode}
90 } $journalmode
93 rbu close
95 do_test 1.5.0 {
96   file exists test.db-wal
97 } {1}
98 do_test 1.5.1 {
99   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
100   file exists test.db-wal
101 } 1
102 do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
103 do_test 1.5.2 {
104   db eval {PRAGMA journal_mode}
105 } $journalmode
108 do_test 1.6.0 {
109   rbu step
110 } SQLITE_OK
111 do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
112 do_test 1.6.2 {
113   db eval {PRAGMA journal_mode}
114 } $journalmode
116 do_test 1.7.0 {
117   while {[rbu step]=="SQLITE_OK"} {}
118   rbu close
119 } SQLITE_DONE
120 do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
121 do_test 1.7.2 {
122   db eval {PRAGMA journal_mode}
123 } $journalmode
125 reset_db
126 do_execsql_test 2.0 {
127   CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
128   CREATE INDEX t1b ON t1(b);
129   CREATE INDEX t1c ON t1(c);
130   INSERT INTO t1 VALUES(1, 2, 3);
132 create_rbu rbu1.db
134 do_test 2.1.0 {
135   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
136   rbu step
137 } SQLITE_OK
138 do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
140 do_test 2.2.0 {
141   for {set ii 0} {$ii < 10} {incr ii} {
142     rbu step
143   }
144   rbu step
145 } SQLITE_OK
146 do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
148 do_test 2.3.0 {
149   while {[file exists test.db-wal]==0} {
150     rbu step
151   }
152 } {}
153 do_test 2.3.1 {
154   llength [db eval {SELECT * FROM t1}]
155 } {27}
156 do_test 2.3.2 {
157   db eval {PRAGMA journal_mode}
158 } {wal}
160 do_test 2.4.0 {
161   rbu step
162 } SQLITE_OK
163 do_test 2.4.1 {
164   llength [db eval  {SELECT * FROM t1}]
165 } {27}
166 do_test 2.4.2 {
167   db eval {PRAGMA journal_mode}
168 } {wal}
170 rbu close
172 do_test 2.5.0 {
173   db eval {PRAGMA journal_mode}
174 } {wal}
175 do_execsql_test 2.5.1 {
176   DELETE FROM t1;
177 } {}
179 create_rbu rbu1.db
180 do_test 3.1.0 {
181   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
182   rbu step
183 } SQLITE_ERROR
185 do_test 3.1.1 {
186   set rc [catch {rbu close} msg]
187   lappend rc $msg
188 } {1 {SQLITE_ERROR - cannot update wal mode database}}
189 db eval {PRAGMA journal_mode=DELETE}
191 create_rbu rbu1.db
192 do_test 3.2.0 {
193   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
194   rbu step
195 } SQLITE_OK
197 do_test 3.3.1 {
198   set rc [catch {rbu close} msg]
199   lappend rc $msg
200 } {0 SQLITE_OK}
202 db close
203 create_rbu rbu1.db
204 do_test 3.4.0 {
205   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
206   rbu step
207 } SQLITE_OK
208 rbu close
210 #-------------------------------------------------------------------------
211 reset_db
212 forcedelete rbu1.db
213 forcedelete rbu2.db
215 sqlite3 rbu rbu1.db 
216 do_execsql_test -db rbu 4.1 {
217   CREATE TABLE data_t1(a, b, rbu_control);
218   INSERT INTO data_t1 VALUES(1, 'one', 0);
220 rbu close
221 sqlite3 rbu rbu2.db 
222 do_execsql_test -db rbu 4.2 {
223   CREATE TABLE data_t1(a, b, rbu_control);
224   INSERT INTO data_t1 VALUES(2, 'two', 0);
226 rbu close
228 do_execsql_test 4.3 {
229   CREATE TABLE t1(a PRIMARY KEY, b);
231 db close
233 do_test 4.4 {
234   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
235   rbu step
236   rbu state
237 } {oal}
239 sqlite3 cons test.db
240 do_execsql_test -db cons 4.5 {
241   SELECT * FROM t1
242 } {}
244 do_test 4.6 { rbu step ; rbu state } {oal}
245 do_test 4.7 { rbu step ; rbu state } {move}
246 do_execsql_test -db cons 4.8 {
247   SELECT * FROM t1
248 } {}
249 do_test 4.9 { rbu step ; rbu state } {checkpoint}
250 do_test 4.10 {
251   catchsql { SELECT * FROM t1 } cons
252 } {1 {database is locked}}
253 do_test 4.11 { rbu step ; rbu state } {checkpoint}
254 do_test 4.11 { rbu step ; rbu state } {done}
255 rbu close
257 do_test 4.12 {
258   catchsql { SELECT * FROM t1 } cons
259 } {0 {1 one}}
261 do_test 4.13 {
262   sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu2.db
263   rbu step
264   rbu state
265 } {oal}
267 do_test 4.14 {
268   catchsql { SELECT * FROM t1 } cons
269 } {0 {1 one}}
271 do_test 4.15 { rbu step ; rbu state } {oal}
272 do_test 4.16 { rbu step ; rbu state } {move}
274 do_test 4.17 {
275   catchsql { SELECT * FROM t1 } cons
276 } {0 {1 one}}
278 do_test 4.18 { rbu step ; rbu state } {checkpoint}
279 do_test 4.19 {
280   catchsql { SELECT * FROM t1 } cons
281 } {1 {database is locked}}
282 do_test 4.20 { rbu step ; rbu state } {checkpoint}
283 do_test 4.21 { rbu step ; rbu state } {done}
284 rbu close
286 do_test 4.22 {
287   catchsql { SELECT * FROM t1 } cons
288 } {0 {1 one 2 two}}
290 cons close
292 finish_test