OLD | NEW |
| (Empty) |
1 # 2010 April 19 | |
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 file is testing the operation of the library in | |
13 # "PRAGMA journal_mode=WAL" mode. | |
14 # | |
15 | |
16 set testdir [file dirname $argv0] | |
17 source $testdir/tester.tcl | |
18 source $testdir/malloc_common.tcl | |
19 | |
20 # If the library was compiled without WAL support, check that the | |
21 # "PRAGMA journal_mode=WAL" treats "WAL" as an unrecognized mode. | |
22 # | |
23 ifcapable !wal { | |
24 | |
25 do_test walmode-0.1 { | |
26 execsql { PRAGMA journal_mode = wal } | |
27 } {delete} | |
28 do_test walmode-0.2 { | |
29 execsql { PRAGMA main.journal_mode = wal } | |
30 } {delete} | |
31 do_test walmode-0.3 { | |
32 execsql { PRAGMA main.journal_mode } | |
33 } {delete} | |
34 | |
35 finish_test | |
36 return | |
37 } | |
38 | |
39 do_test walmode-1.1 { | |
40 set sqlite_sync_count 0 | |
41 execsql { PRAGMA page_size = 1024 } | |
42 execsql { PRAGMA journal_mode = wal } | |
43 } {wal} | |
44 do_test walmode-1.2 { | |
45 file size test.db | |
46 } {1024} | |
47 | |
48 set expected_sync_count 3 | |
49 if {$::tcl_platform(platform)!="windows"} { | |
50 ifcapable dirsync { | |
51 incr expected_sync_count | |
52 } | |
53 } | |
54 do_test walmode-1.3 { | |
55 set sqlite_sync_count | |
56 } $expected_sync_count | |
57 | |
58 do_test walmode-1.4 { | |
59 file exists test.db-wal | |
60 } {0} | |
61 do_test walmode-1.5 { | |
62 execsql { CREATE TABLE t1(a, b) } | |
63 file size test.db | |
64 } {1024} | |
65 do_test walmode-1.6 { | |
66 file exists test.db-wal | |
67 } {1} | |
68 do_test walmode-1.7 { | |
69 db close | |
70 file exists test.db-wal | |
71 } {0} | |
72 | |
73 # There is now a database file with the read and write versions set to 2 | |
74 # in the file system. This file should default to WAL mode. | |
75 # | |
76 do_test walmode-2.1 { | |
77 sqlite3 db test.db | |
78 file exists test.db-wal | |
79 } {0} | |
80 do_test walmode-2.2 { | |
81 execsql { SELECT * FROM sqlite_master } | |
82 file exists test.db-wal | |
83 } {1} | |
84 do_test walmode-2.3 { | |
85 db close | |
86 file exists test.db-wal | |
87 } {0} | |
88 | |
89 # If the first statement executed is "PRAGMA journal_mode = wal", and | |
90 # the file is already configured for WAL (read and write versions set | |
91 # to 2), then there should be no need to write the database. The | |
92 # statement should cause the client to connect to the log file. | |
93 # | |
94 set sqlite_sync_count 0 | |
95 do_test walmode-3.1 { | |
96 sqlite3 db test.db | |
97 execsql { PRAGMA journal_mode = wal } | |
98 } {wal} | |
99 do_test walmode-3.2 { | |
100 list $sqlite_sync_count [file exists test.db-wal] [file size test.db-wal] | |
101 } {0 1 0} | |
102 | |
103 # Test that changing back to journal_mode=persist works. | |
104 # | |
105 do_test walmode-4.1 { | |
106 execsql { INSERT INTO t1 VALUES(1, 2) } | |
107 execsql { PRAGMA journal_mode = persist } | |
108 } {persist} | |
109 do_test walmode-4.2 { | |
110 list [file exists test.db-journal] [file exists test.db-wal] | |
111 } {1 0} | |
112 do_test walmode-4.3 { | |
113 execsql { SELECT * FROM t1 } | |
114 } {1 2} | |
115 do_test walmode-4.4 { | |
116 db close | |
117 sqlite3 db test.db | |
118 execsql { SELECT * FROM t1 } | |
119 } {1 2} | |
120 do_test walmode-4.5 { | |
121 list [file exists test.db-journal] [file exists test.db-wal] | |
122 } {1 0} | |
123 | |
124 # Test that nothing goes wrong if a connection is prevented from changing | |
125 # from WAL to rollback mode because a second connection has the database | |
126 # open. Or from rollback to WAL. | |
127 # | |
128 do_test walmode-4.6 { | |
129 sqlite3 db2 test.db | |
130 execsql { PRAGMA main.journal_mode } db2 | |
131 } {delete} | |
132 do_test walmode-4.7 { | |
133 execsql { PRAGMA main.journal_mode = wal } db | |
134 } {wal} | |
135 do_test walmode-4.8 { | |
136 execsql { SELECT * FROM t1 } db2 | |
137 } {1 2} | |
138 do_test walmode-4.9 { | |
139 catchsql { PRAGMA journal_mode = delete } db | |
140 } {1 {database is locked}} | |
141 do_test walmode-4.10 { | |
142 execsql { PRAGMA main.journal_mode } db | |
143 } {wal} | |
144 | |
145 do_test walmode-4.11 { | |
146 db2 close | |
147 execsql { PRAGMA journal_mode = delete } db | |
148 } {delete} | |
149 do_test walmode-4.12 { | |
150 execsql { PRAGMA main.journal_mode } db | |
151 } {delete} | |
152 do_test walmode-4.13 { | |
153 list [file exists test.db-journal] [file exists test.db-wal] | |
154 } {0 0} | |
155 do_test walmode-4.14 { | |
156 sqlite3 db2 test.db | |
157 execsql { | |
158 BEGIN; | |
159 SELECT * FROM t1; | |
160 } db2 | |
161 } {1 2} | |
162 | |
163 do_test walmode-4.16 { execsql { PRAGMA main.journal_mode } db } {delete} | |
164 do_test walmode-4.17 { execsql { PRAGMA main.journal_mode } db2 } {delete} | |
165 | |
166 do_test walmode-4.17 { | |
167 catchsql { PRAGMA main.journal_mode = wal } db | |
168 } {1 {database is locked}} | |
169 do_test walmode-4.18 { | |
170 execsql { PRAGMA main.journal_mode } db | |
171 } {delete} | |
172 catch { db close } | |
173 catch { db2 close } | |
174 | |
175 # Test that it is not possible to change a temporary or in-memory database | |
176 # to WAL mode. WAL mode is for persistent file-backed databases only. | |
177 # | |
178 # walmode-5.1.*: Try to set journal_mode=WAL on [sqlite3 db :memory:] database
. | |
179 # walmode-5.2.*: Try to set journal_mode=WAL on [sqlite3 db ""] database. | |
180 # walmode-5.3.*: Try to set temp.journal_mode=WAL. | |
181 # | |
182 do_test walmode-5.1.1 { | |
183 sqlite3 db :memory: | |
184 execsql { PRAGMA main.journal_mode } | |
185 } {memory} | |
186 do_test walmode-5.1.2 { | |
187 execsql { PRAGMA main.journal_mode = wal } | |
188 } {memory} | |
189 do_test walmode-5.1.3 { | |
190 execsql { | |
191 BEGIN; | |
192 CREATE TABLE t1(a, b); | |
193 INSERT INTO t1 VALUES(1, 2); | |
194 COMMIT; | |
195 SELECT * FROM t1; | |
196 PRAGMA main.journal_mode; | |
197 } | |
198 } {1 2 memory} | |
199 do_test walmode-5.1.4 { | |
200 execsql { PRAGMA main.journal_mode = wal } | |
201 } {memory} | |
202 do_test walmode-5.1.5 { | |
203 execsql { | |
204 INSERT INTO t1 VALUES(3, 4); | |
205 SELECT * FROM t1; | |
206 PRAGMA main.journal_mode; | |
207 } | |
208 } {1 2 3 4 memory} | |
209 | |
210 if {$TEMP_STORE>=2} { | |
211 set tempJrnlMode memory | |
212 } else { | |
213 set tempJrnlMode delete | |
214 } | |
215 do_test walmode-5.2.1 { | |
216 sqlite3 db "" | |
217 execsql { PRAGMA main.journal_mode } | |
218 } $tempJrnlMode | |
219 do_test walmode-5.2.2 { | |
220 execsql { PRAGMA main.journal_mode = wal } | |
221 } $tempJrnlMode | |
222 do_test walmode-5.2.3 { | |
223 execsql { | |
224 BEGIN; | |
225 CREATE TABLE t1(a, b); | |
226 INSERT INTO t1 VALUES(1, 2); | |
227 COMMIT; | |
228 SELECT * FROM t1; | |
229 PRAGMA main.journal_mode; | |
230 } | |
231 } [list 1 2 $tempJrnlMode] | |
232 do_test walmode-5.2.4 { | |
233 execsql { PRAGMA main.journal_mode = wal } | |
234 } $tempJrnlMode | |
235 do_test walmode-5.2.5 { | |
236 execsql { | |
237 INSERT INTO t1 VALUES(3, 4); | |
238 SELECT * FROM t1; | |
239 PRAGMA main.journal_mode; | |
240 } | |
241 } [list 1 2 3 4 $tempJrnlMode] | |
242 | |
243 do_test walmode-5.3.1 { | |
244 sqlite3 db test.db | |
245 execsql { PRAGMA temp.journal_mode } | |
246 } $tempJrnlMode | |
247 do_test walmode-5.3.2 { | |
248 execsql { PRAGMA temp.journal_mode = wal } | |
249 } $tempJrnlMode | |
250 do_test walmode-5.3.3 { | |
251 execsql { | |
252 BEGIN; | |
253 CREATE TEMP TABLE t1(a, b); | |
254 INSERT INTO t1 VALUES(1, 2); | |
255 COMMIT; | |
256 SELECT * FROM t1; | |
257 PRAGMA temp.journal_mode; | |
258 } | |
259 } [list 1 2 $tempJrnlMode] | |
260 do_test walmode-5.3.4 { | |
261 execsql { PRAGMA temp.journal_mode = wal } | |
262 } $tempJrnlMode | |
263 do_test walmode-5.3.5 { | |
264 execsql { | |
265 INSERT INTO t1 VALUES(3, 4); | |
266 SELECT * FROM t1; | |
267 PRAGMA temp.journal_mode; | |
268 } | |
269 } [list 1 2 3 4 $tempJrnlMode] | |
270 | |
271 | |
272 #------------------------------------------------------------------------- | |
273 # Test changing to WAL mode from journal_mode=off or journal_mode=memory | |
274 # | |
275 foreach {tn mode} { | |
276 1 off | |
277 2 memory | |
278 3 persist | |
279 4 delete | |
280 5 truncate | |
281 } { | |
282 do_test walmode-6.$tn { | |
283 faultsim_delete_and_reopen | |
284 execsql " | |
285 PRAGMA journal_mode = $mode; | |
286 PRAGMA journal_mode = wal; | |
287 " | |
288 } [list $mode wal] | |
289 } | |
290 db close | |
291 | |
292 #------------------------------------------------------------------------- | |
293 # Test the effect of a "PRAGMA journal_mode" command being the first | |
294 # thing executed by a new connection. This means that the schema is not | |
295 # loaded when sqlite3_prepare_v2() is called to compile the statement. | |
296 # | |
297 do_test walmode-7.0 { | |
298 forcedelete test.db | |
299 sqlite3 db test.db | |
300 execsql { | |
301 PRAGMA journal_mode = WAL; | |
302 CREATE TABLE t1(a, b); | |
303 } | |
304 } {wal} | |
305 foreach {tn sql result} { | |
306 1 "PRAGMA journal_mode" wal | |
307 2 "PRAGMA main.journal_mode" wal | |
308 3 "PRAGMA journal_mode = delete" delete | |
309 4 "PRAGMA journal_mode" delete | |
310 5 "PRAGMA main.journal_mode" delete | |
311 6 "PRAGMA journal_mode = wal" wal | |
312 7 "PRAGMA journal_mode" wal | |
313 8 "PRAGMA main.journal_mode" wal | |
314 | |
315 9 "PRAGMA journal_mode" wal | |
316 10 "PRAGMA main.journal_mode" wal | |
317 11 "PRAGMA main.journal_mode = delete" delete | |
318 12 "PRAGMA journal_mode" delete | |
319 13 "PRAGMA main.journal_mode" delete | |
320 14 "PRAGMA main.journal_mode = wal" wal | |
321 15 "PRAGMA journal_mode" wal | |
322 16 "PRAGMA main.journal_mode" wal | |
323 } { | |
324 do_test walmode-7.$tn { | |
325 db close | |
326 sqlite3 db test.db | |
327 execsql $sql | |
328 } $result | |
329 } | |
330 db close | |
331 | |
332 #------------------------------------------------------------------------- | |
333 # Test the effect of a "PRAGMA journal_mode" command on an attached | |
334 # database. | |
335 # | |
336 faultsim_delete_and_reopen | |
337 do_execsql_test walmode-8.1 { | |
338 CREATE TABLE t1(a, b); | |
339 PRAGMA journal_mode = WAL; | |
340 ATTACH 'test.db2' AS two; | |
341 CREATE TABLE two.t2(a, b); | |
342 } {wal} | |
343 do_execsql_test walmode-8.2 { PRAGMA main.journal_mode } {wal} | |
344 do_execsql_test walmode-8.3 { PRAGMA two.journal_mode } {delete} | |
345 do_execsql_test walmode-8.4 { PRAGMA two.journal_mode = DELETE } {delete} | |
346 | |
347 db close | |
348 sqlite3 db test.db | |
349 do_execsql_test walmode-8.5 { ATTACH 'test.db2' AS two } {} | |
350 do_execsql_test walmode-8.6 { PRAGMA main.journal_mode } {wal} | |
351 do_execsql_test walmode-8.7 { PRAGMA two.journal_mode } {delete} | |
352 do_execsql_test walmode-8.8 { INSERT INTO two.t2 DEFAULT VALUES } {} | |
353 do_execsql_test walmode-8.9 { PRAGMA two.journal_mode } {delete} | |
354 do_execsql_test walmode-8.10 { INSERT INTO t1 DEFAULT VALUES } {} | |
355 do_execsql_test walmode-8.11 { PRAGMA main.journal_mode } {wal} | |
356 do_execsql_test walmode-8.12 { PRAGMA journal_mode } {wal} | |
357 | |
358 # Change to WAL mode on test2.db and make sure (in the tests that follow) | |
359 # that this mode change persists. | |
360 do_test walmode-8.x1 { | |
361 execsql { | |
362 PRAGMA two.journal_mode=WAL; | |
363 PRAGMA two.journal_mode; | |
364 } | |
365 } {wal wal} | |
366 | |
367 db close | |
368 sqlite3 db test.db | |
369 do_execsql_test walmode-8.13 { PRAGMA journal_mode = WAL } {wal} | |
370 do_execsql_test walmode-8.14 { ATTACH 'test.db2' AS two } {} | |
371 do_execsql_test walmode-8.15 { PRAGMA main.journal_mode } {wal} | |
372 do_execsql_test walmode-8.16 { PRAGMA two.journal_mode } {wal} | |
373 do_execsql_test walmode-8.17 { INSERT INTO two.t2 DEFAULT VALUES } {} | |
374 do_execsql_test walmode-8.18 { PRAGMA two.journal_mode } {wal} | |
375 | |
376 sqlite3 db2 test.db2 | |
377 do_test walmode-8.19 { execsql { PRAGMA main.journal_mode } db2 } {wal} | |
378 db2 close | |
379 | |
380 do_execsql_test walmode-8.20 { PRAGMA journal_mode = DELETE } {delete} | |
381 do_execsql_test walmode-8.21 { PRAGMA main.journal_mode } {delete} | |
382 do_execsql_test walmode-8.22 { PRAGMA two.journal_mode } {delete} | |
383 do_execsql_test walmode-8.21 { PRAGMA journal_mode = WAL } {wal} | |
384 do_execsql_test walmode-8.21 { PRAGMA main.journal_mode } {wal} | |
385 do_execsql_test walmode-8.22 { PRAGMA two.journal_mode } {wal} | |
386 | |
387 finish_test | |
OLD | NEW |