Annotation of embedaddon/sqlite3/test/jrnlmode.test, revision 1.1.1.1
1.1 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>