OLD | NEW |
| (Empty) |
1 # 2008 April 17 | |
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 focus | |
12 # of these tests is the journal mode pragma. | |
13 # | |
14 # $Id: jrnlmode.test,v 1.16 2009/06/05 17:09:12 drh Exp $ | |
15 | |
16 set testdir [file dirname $argv0] | |
17 source $testdir/tester.tcl | |
18 | |
19 ifcapable {!pager_pragmas} { | |
20 finish_test | |
21 return | |
22 } | |
23 | |
24 if {[info exists TEMP_STORE] && $TEMP_STORE>=2} { | |
25 set temp_persist memory | |
26 set temp_delete memory | |
27 set temp_truncate memory | |
28 set temp_off off | |
29 } else { | |
30 set temp_persist persist | |
31 set temp_delete delete | |
32 set temp_truncate truncate | |
33 set temp_off off | |
34 } | |
35 | |
36 proc temp_journal_mode {newmode} { | |
37 if {[info exists ::TEMP_STORE] && $::TEMP_STORE>=2} { | |
38 if {$newmode ne "off" && $newmode ne "memory"} { | |
39 execsql {PRAGMA temp.journal_mode} | |
40 set newmode [db one {PRAGMA temp.journal_mode}] | |
41 } | |
42 } | |
43 set newmode | |
44 } | |
45 | |
46 #---------------------------------------------------------------------- | |
47 # Test cases jrnlmode-1.X test the PRAGMA logic. | |
48 # | |
49 do_test jrnlmode-1.0 { | |
50 execsql { | |
51 PRAGMA journal_mode; | |
52 PRAGMA main.journal_mode; | |
53 PRAGMA temp.journal_mode; | |
54 } | |
55 } [list delete delete [temp_journal_mode delete]] | |
56 do_test jrnlmode-1.1 { | |
57 execsql { | |
58 PRAGMA journal_mode = persist; | |
59 } | |
60 } {persist} | |
61 do_test jrnlmode-1.2 { | |
62 execsql { | |
63 PRAGMA journal_mode; | |
64 PRAGMA main.journal_mode; | |
65 PRAGMA temp.journal_mode; | |
66 } | |
67 } [list persist persist [temp_journal_mode persist]] | |
68 do_test jrnlmode-1.4 { | |
69 execsql { | |
70 PRAGMA journal_mode = off; | |
71 } | |
72 } {off} | |
73 do_test jrnlmode-1.5 { | |
74 execsql { | |
75 PRAGMA journal_mode; | |
76 PRAGMA main.journal_mode; | |
77 PRAGMA temp.journal_mode; | |
78 } | |
79 } [list off off [temp_journal_mode off]] | |
80 do_test jrnlmode-1.6 { | |
81 execsql { | |
82 PRAGMA journal_mode = delete; | |
83 } | |
84 } {delete} | |
85 do_test jrnlmode-1.7 { | |
86 execsql { | |
87 PRAGMA journal_mode; | |
88 PRAGMA main.journal_mode; | |
89 PRAGMA Temp.journal_mode; | |
90 } | |
91 } [list delete delete [temp_journal_mode delete]] | |
92 do_test jrnlmode-1.7.1 { | |
93 execsql { | |
94 PRAGMA journal_mode = truncate; | |
95 } | |
96 } {truncate} | |
97 do_test jrnlmode-1.7.2 { | |
98 execsql { | |
99 PRAGMA journal_mode; | |
100 PRAGMA main.journal_mode; | |
101 PRAGMA temp.journal_mode; | |
102 } | |
103 } [list truncate truncate [temp_journal_mode truncate]] | |
104 do_test jrnlmode-1.8 { | |
105 execsql { | |
106 PRAGMA journal_mode = off; | |
107 PRAGMA journal_mode = invalid; | |
108 } | |
109 } {off off} | |
110 ifcapable attach { | |
111 do_test jrnlmode-1.9 { | |
112 execsql { | |
113 PRAGMA journal_mode = PERSIST; | |
114 ATTACH ':memory:' as aux1; | |
115 } | |
116 execsql { | |
117 PRAGMA main.journal_mode; | |
118 PRAGMA aux1.journal_mode; | |
119 } | |
120 } {persist memory} | |
121 do_test jrnlmode-1.10 { | |
122 execsql { | |
123 PRAGMA main.journal_mode = OFF; | |
124 } | |
125 execsql { | |
126 PRAGMA main.journal_mode; | |
127 PRAGMA temp.journal_mode; | |
128 PRAGMA aux1.journal_mode; | |
129 } | |
130 } [list off [temp_journal_mode persist] memory] | |
131 do_test jrnlmode-1.11 { | |
132 execsql { | |
133 PRAGMA journal_mode; | |
134 } | |
135 } {off} | |
136 do_test jrnlmode-1.12 { | |
137 execsql { | |
138 ATTACH ':memory:' as aux2; | |
139 } | |
140 execsql { | |
141 PRAGMA main.journal_mode; | |
142 PRAGMA aux1.journal_mode; | |
143 PRAGMA aux2.journal_mode; | |
144 } | |
145 } {off memory memory} | |
146 do_test jrnlmode-1.13 { | |
147 # The journal-mode used by in-memory databases cannot be changed. | |
148 execsql { | |
149 PRAGMA aux1.journal_mode = DELETE; | |
150 } | |
151 execsql { | |
152 PRAGMA main.journal_mode; | |
153 PRAGMA aux1.journal_mode; | |
154 PRAGMA aux2.journal_mode; | |
155 } | |
156 } {off memory memory} | |
157 do_test jrnlmode-1.14 { | |
158 execsql { | |
159 PRAGMA journal_mode = delete; | |
160 } | |
161 execsql { | |
162 PRAGMA main.journal_mode; | |
163 PRAGMA temp.journal_mode; | |
164 PRAGMA aux1.journal_mode; | |
165 PRAGMA aux2.journal_mode; | |
166 } | |
167 } [list delete [temp_journal_mode delete] memory memory] | |
168 do_test jrnlmode-1.15 { | |
169 execsql { | |
170 ATTACH ':memory:' as aux3; | |
171 } | |
172 execsql { | |
173 PRAGMA main.journal_mode; | |
174 PRAGMA temp.journal_mode; | |
175 PRAGMA aux1.journal_mode; | |
176 PRAGMA aux2.journal_mode; | |
177 PRAGMA aux3.journal_mode; | |
178 } | |
179 } [list delete [temp_journal_mode delete] memory memory memory] | |
180 do_test jrnlmode-1.16 { | |
181 execsql { | |
182 PRAGMA journal_mode = TRUNCATE; | |
183 } | |
184 execsql { | |
185 PRAGMA main.journal_mode; | |
186 PRAGMA temp.journal_mode; | |
187 PRAGMA aux1.journal_mode; | |
188 PRAGMA aux2.journal_mode; | |
189 PRAGMA aux3.journal_mode; | |
190 } | |
191 } [list truncate [temp_journal_mode truncate] memory memory memory] | |
192 | |
193 do_test jrnlmode-1.99 { | |
194 execsql { | |
195 DETACH aux1; | |
196 DETACH aux2; | |
197 DETACH aux3; | |
198 } | |
199 } {} | |
200 } | |
201 | |
202 ifcapable attach { | |
203 forcedelete test2.db | |
204 do_test jrnlmode-2.1 { | |
205 execsql { | |
206 ATTACH 'test2.db' AS aux; | |
207 PRAGMA main.journal_mode = persist; | |
208 PRAGMA aux.journal_mode = persist; | |
209 CREATE TABLE abc(a, b, c); | |
210 CREATE TABLE aux.def(d, e, f); | |
211 } | |
212 execsql { | |
213 BEGIN; | |
214 INSERT INTO abc VALUES(1, 2, 3); | |
215 INSERT INTO def VALUES(4, 5, 6); | |
216 COMMIT; | |
217 } | |
218 list [file exists test.db-journal] [file exists test2.db-journal] | |
219 } {1 1} | |
220 | |
221 do_test jrnlmode-2.2 { | |
222 file size test.db-journal | |
223 } {0} | |
224 | |
225 do_test jrnlmode-2.3 { | |
226 execsql { | |
227 SELECT * FROM abc; | |
228 } | |
229 } {1 2 3} | |
230 | |
231 do_test jrnlmode-2.4 { | |
232 file size test.db-journal | |
233 } {0} | |
234 | |
235 do_test jrnlmode-2.5 { | |
236 execsql { | |
237 SELECT * FROM def; | |
238 } | |
239 } {4 5 6} | |
240 | |
241 #---------------------------------------------------------------------- | |
242 # Test caes jrnlmode-3.X verify that ticket #3127 has been fixed. | |
243 # | |
244 db close | |
245 forcedelete test2.db | |
246 forcedelete test.db | |
247 sqlite3 db test.db | |
248 | |
249 do_test jrnlmode-3.1 { | |
250 execsql { | |
251 CREATE TABLE x(n INTEGER); | |
252 ATTACH 'test2.db' AS a; | |
253 create table a.x ( n integer ); | |
254 insert into a.x values(1); | |
255 insert into a.x values (2); | |
256 insert into a.x values (3); | |
257 insert into a.x values (4); | |
258 } | |
259 } {} | |
260 | |
261 do_test jrnlmode-3.2 { | |
262 execsql { PRAGMA journal_mode=off; } | |
263 execsql { | |
264 BEGIN IMMEDIATE; | |
265 INSERT OR IGNORE INTO main.x SELECT * FROM a.x; | |
266 COMMIT; | |
267 } | |
268 } {} | |
269 } | |
270 | |
271 ifcapable autovacuum&&pragma { | |
272 db close | |
273 forcedelete test.db | |
274 sqlite3 db test.db | |
275 do_test jrnlmode-4.1 { | |
276 execsql { | |
277 PRAGMA cache_size = 1; | |
278 PRAGMA auto_vacuum = 1; | |
279 CREATE TABLE abc(a, b, c); | |
280 } | |
281 execsql { PRAGMA page_count } | |
282 } {3} | |
283 | |
284 do_test jrnlmode-4.2 { | |
285 execsql { PRAGMA journal_mode = off } | |
286 } {off} | |
287 | |
288 do_test jrnlmode-4.3 { | |
289 execsql { INSERT INTO abc VALUES(1, 2, randomblob(2000)) } | |
290 } {} | |
291 | |
292 # This will attempt to truncate the database file. Check that this | |
293 # is not a problem when journal_mode=off. | |
294 do_test jrnlmode-4.4 { | |
295 execsql { DELETE FROM abc } | |
296 } {} | |
297 | |
298 integrity_check jrnlmode-4.5 | |
299 } | |
300 | |
301 #------------------------------------------------------------------------ | |
302 # The following test caes, jrnlmode-5.*, test the journal_size_limit | |
303 # pragma. | |
304 ifcapable pragma { | |
305 db close | |
306 forcedelete test.db test2.db test3.db | |
307 sqlite3 db test.db | |
308 | |
309 do_test jrnlmode-5.1 { | |
310 execsql {pragma page_size=1024} | |
311 execsql {pragma journal_mode=persist} | |
312 } {persist} | |
313 | |
314 do_test jrnlmode-5.2 { | |
315 execsql { PRAGMA journal_size_limit } | |
316 } {-1} | |
317 do_test jrnlmode-5.3 { | |
318 execsql { | |
319 ATTACH 'test2.db' AS aux; | |
320 PRAGMA aux.journal_mode=persist; | |
321 PRAGMA aux.journal_size_limit; | |
322 } | |
323 } {persist -1} | |
324 do_test jrnlmode-5.4.1 { | |
325 execsql { PRAGMA aux.journal_size_limit = 999999999999 } | |
326 } {999999999999} | |
327 do_test jrnlmode-5.4.2 { | |
328 execsql { PRAGMA aux.journal_size_limit = 10240 } | |
329 } {10240} | |
330 do_test jrnlmode-5.5 { | |
331 execsql { PRAGMA main.journal_size_limit = 20480 } | |
332 } {20480} | |
333 do_test jrnlmode-5.6 { | |
334 execsql { PRAGMA journal_size_limit } | |
335 } {20480} | |
336 do_test jrnlmode-5.7 { | |
337 execsql { PRAGMA aux.journal_size_limit } | |
338 } {10240} | |
339 | |
340 do_test jrnlmode-5.8 { | |
341 execsql { | |
342 ATTACH 'test3.db' AS aux2; | |
343 PRAGMA aux2.journal_mode=persist; | |
344 } | |
345 } {persist} | |
346 | |
347 do_test jrnlmode-5.9 { | |
348 execsql { | |
349 CREATE TABLE main.t1(a, b, c); | |
350 CREATE TABLE aux.t2(a, b, c); | |
351 CREATE TABLE aux2.t3(a, b, c); | |
352 } | |
353 } {} | |
354 do_test jrnlmode-5.10 { | |
355 list \ | |
356 [file exists test.db-journal] \ | |
357 [file exists test2.db-journal] \ | |
358 [file exists test3.db-journal] | |
359 } {1 1 1} | |
360 do_test jrnlmode-5.11 { | |
361 execsql { | |
362 BEGIN; | |
363 INSERT INTO t3 VALUES(randomblob(1000),randomblob(1000),randomblob(1000)); | |
364 INSERT INTO t3 | |
365 SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3; | |
366 INSERT INTO t3 | |
367 SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3; | |
368 INSERT INTO t3 | |
369 SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3; | |
370 INSERT INTO t3 | |
371 SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3; | |
372 INSERT INTO t3 | |
373 SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3; | |
374 INSERT INTO t2 SELECT * FROM t3; | |
375 INSERT INTO t1 SELECT * FROM t2; | |
376 COMMIT; | |
377 } | |
378 list \ | |
379 [file exists test.db-journal] \ | |
380 [file exists test2.db-journal] \ | |
381 [file exists test3.db-journal] \ | |
382 [file size test.db-journal] \ | |
383 [file size test2.db-journal] \ | |
384 [file size test3.db-journal] | |
385 } {1 1 1 0 0 0} | |
386 | |
387 do_test jrnlmode-5.12 { | |
388 execsql { | |
389 BEGIN; | |
390 UPDATE t1 SET a = randomblob(1000); | |
391 } | |
392 expr {[file size test.db-journal]>30000} | |
393 } {1} | |
394 do_test jrnlmode-5.13 { | |
395 execsql COMMIT | |
396 file size test.db-journal | |
397 } {20480} | |
398 | |
399 do_test jrnlmode-5.14 { | |
400 execsql { | |
401 BEGIN; | |
402 UPDATE t2 SET a = randomblob(1000); | |
403 } | |
404 expr {[file size test2.db-journal]>30000} | |
405 } {1} | |
406 do_test jrnlmode-5.15 { | |
407 execsql COMMIT | |
408 file size test2.db-journal | |
409 } {10240} | |
410 | |
411 do_test jrnlmode-5.16 { | |
412 execsql { | |
413 BEGIN; | |
414 UPDATE t3 SET a = randomblob(1000); | |
415 } | |
416 set journalsize [file size test3.db-journal] | |
417 expr {$journalsize>30000} | |
418 } {1} | |
419 do_test jrnlmode-5.17 { | |
420 execsql COMMIT | |
421 set sz [file size test3.db-journal] | |
422 expr {$sz>=$journalsize} | |
423 } {1} | |
424 | |
425 do_test jrnlmode-5.18 { | |
426 execsql { | |
427 PRAGMA journal_size_limit = -4; | |
428 BEGIN; | |
429 UPDATE t1 SET a = randomblob(1000); | |
430 } | |
431 set journalsize [file size test.db-journal] | |
432 expr {$journalsize>30000} | |
433 } {1} | |
434 do_test jrnlmode-5.19 { | |
435 execsql COMMIT | |
436 set sz [file size test.db-journal] | |
437 expr {$sz>=$journalsize} | |
438 } {1} | |
439 | |
440 # Test a size-limit of 0. | |
441 # | |
442 do_test jrnlmode-5.20 { | |
443 execsql { | |
444 PRAGMA journal_size_limit = 0; | |
445 BEGIN; | |
446 UPDATE t1 SET a = randomblob(1000); | |
447 } | |
448 } {0} | |
449 do_test jrnlmode-5.21 { | |
450 expr {[file size test.db-journal] > 1024} | |
451 } {1} | |
452 do_test jrnlmode-5.22 { | |
453 execsql COMMIT | |
454 list [file exists test.db-journal] [file size test.db-journal] | |
455 } {1 0} | |
456 } | |
457 | |
458 ifcapable pragma { | |
459 # These tests are not run as part of the "journaltest" permutation, | |
460 # as the test_journal.c layer is incompatible with in-memory journaling. | |
461 if {[permutation] ne "journaltest"} { | |
462 | |
463 do_test jrnlmode-6.1 { | |
464 execsql { | |
465 PRAGMA journal_mode = truncate; | |
466 CREATE TABLE t4(a, b); | |
467 BEGIN; | |
468 INSERT INTO t4 VALUES(1, 2); | |
469 PRAGMA journal_mode = memory; | |
470 } | |
471 } {truncate truncate} | |
472 do_test jrnlmode-6.2 { | |
473 file exists test.db-journal | |
474 } {1} | |
475 do_test jrnlmode-6.3 { | |
476 execsql { | |
477 COMMIT; | |
478 SELECT * FROM t4; | |
479 } | |
480 } {1 2} | |
481 do_test jrnlmode-6.4 { | |
482 file exists test.db-journal | |
483 } {1} | |
484 do_test jrnlmode-6.5 { | |
485 execsql { | |
486 PRAGMA journal_mode = MEMORY; | |
487 BEGIN; | |
488 INSERT INTO t4 VALUES(3, 4); | |
489 } | |
490 file exists test.db-journal | |
491 } {0} | |
492 do_test jrnlmode-6.7 { | |
493 execsql { | |
494 COMMIT; | |
495 SELECT * FROM t4; | |
496 } | |
497 } {1 2 3 4} | |
498 do_test jrnlmode-6.8 { | |
499 file exists test.db-journal | |
500 } {0} | |
501 do_test jrnlmode-6.9 { | |
502 execsql { | |
503 PRAGMA journal_mode = DELETE; | |
504 BEGIN IMMEDIATE; INSERT INTO t4 VALUES(1,2); COMMIT; | |
505 } | |
506 file exists test.db-journal | |
507 } {0} | |
508 } | |
509 } | |
510 | |
511 ifcapable pragma { | |
512 catch { db close } | |
513 do_test jrnlmode-7.1 { | |
514 foreach f [glob -nocomplain test.db*] { forcedelete $f } | |
515 sqlite3 db test.db | |
516 execsql { | |
517 PRAGMA journal_mode = memory; | |
518 PRAGMA auto_vacuum = 0; | |
519 PRAGMA page_size = 1024; | |
520 PRAGMA user_version = 5; | |
521 PRAGMA user_version; | |
522 } | |
523 } {memory 5} | |
524 do_test jrnlmode-7.2 { file size test.db } {1024} | |
525 } | |
526 | |
527 do_execsql_test jrnlmode-8.1 { PRAGMA locking_mode=EXCLUSIVE } {exclusive} | |
528 do_execsql_test jrnlmode-8.2 { CREATE TABLE t1(x) } {} | |
529 do_execsql_test jrnlmode-8.3 { INSERT INTO t1 VALUES(123) } {} | |
530 do_execsql_test jrnlmode-8.4 { SELECT * FROM t1 } {123} | |
531 do_execsql_test jrnlmode-8.5 { PRAGMA journal_mode=PERSIST } {persist} | |
532 do_execsql_test jrnlmode-8.6 { PRAGMA journal_mode=DELETE } {delete} | |
533 do_execsql_test jrnlmode-8.7 { PRAGMA journal_mode=TRUNCATE } {truncate} | |
534 do_execsql_test jrnlmode-8.8 { PRAGMA journal_mode=DELETE } {delete} | |
535 do_execsql_test jrnlmode-8.9 { CREATE TABLE t2(y) } {} | |
536 do_execsql_test jrnlmode-8.10 { INSERT INTO t2 VALUES(456) } {} | |
537 do_execsql_test jrnlmode-8.11 { SELECT * FROM t1, t2 } {123 456} | |
538 do_execsql_test jrnlmode-8.12 { PRAGMA locking_mode=NORMAL } {normal} | |
539 do_execsql_test jrnlmode-8.13 { PRAGMA journal_mode=PERSIST } {persist} | |
540 do_execsql_test jrnlmode-8.14 { PRAGMA journal_mode=TRUNCATE } {truncate} | |
541 do_execsql_test jrnlmode-8.15 { PRAGMA journal_mode=PERSIST } {persist} | |
542 do_execsql_test jrnlmode-8.16 { PRAGMA journal_mode=DELETE } {delete} | |
543 do_execsql_test jrnlmode-8.17 { PRAGMA journal_mode=TRUNCATE } {truncate} | |
544 do_execsql_test jrnlmode-8.18 { PRAGMA locking_mode=EXCLUSIVE } {exclusive} | |
545 do_execsql_test jrnlmode-8.19 { CREATE TABLE t3(z) } {} | |
546 do_execsql_test jrnlmode-8.20 { BEGIN IMMEDIATE } {} | |
547 do_execsql_test jrnlmode-8.21 { PRAGMA journal_mode=DELETE } {delete} | |
548 do_execsql_test jrnlmode-8.22 { COMMIT } {} | |
549 do_execsql_test jrnlmode-8.23 { PRAGMA journal_mode=DELETE } {delete} | |
550 do_execsql_test jrnlmode-8.24 { PRAGMA journal_mode=TRUNCATE } {truncate} | |
551 do_execsql_test jrnlmode-8.25 { PRAGMA locking_mode=NORMAL } {normal} | |
552 do_execsql_test jrnlmode-8.26 { CREATE TABLE t4(w) } {} | |
553 do_execsql_test jrnlmode-8.27 { BEGIN IMMEDIATE } {} | |
554 do_execsql_test jrnlmode-8.28 { PRAGMA journal_mode=DELETE } {delete} | |
555 do_execsql_test jrnlmode-8.29 { COMMIT } {} | |
556 do_execsql_test jrnlmode-8.30 { PRAGMA journal_mode=DELETE } {delete} | |
557 | |
558 finish_test | |
OLD | NEW |