Prevent deep recursions on nested COLLATE operators.
[sqlite.git] / test / jrnlmode.test
blob3112f6184e5b81dfcf12c7e705c2bfe564414b69
1 # 2008 April 17
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 #***********************************************************************
11 # This file implements regression tests for SQLite library. The focus
12 # of these tests is the journal mode pragma.
14 # $Id: jrnlmode.test,v 1.16 2009/06/05 17:09:12 drh Exp $
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
19 ifcapable {!pager_pragmas} {
20   finish_test
21   return
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
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
46 #----------------------------------------------------------------------
47 # Test cases jrnlmode-1.X test the PRAGMA logic.
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]
193   do_test jrnlmode-1.99 {
194     execsql {
195       DETACH aux1;
196       DETACH aux2;
197       DETACH aux3;
198     }
199   } {}
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}
221   do_test jrnlmode-2.2 {
222     file size test.db-journal
223   } {0}
225   do_test jrnlmode-2.3 {
226     execsql {
227       SELECT * FROM abc;
228     }
229   } {1 2 3}
231   do_test jrnlmode-2.4 {
232     file size test.db-journal
233   } {0}
235   do_test jrnlmode-2.5 {
236     execsql {
237       SELECT * FROM def;
238     }
239   } {4 5 6}
241 #----------------------------------------------------------------------
242 # Test caes jrnlmode-3.X verify that ticket #3127 has been fixed.
244   db close
245   forcedelete test2.db
246   forcedelete test.db
247   sqlite3 db test.db
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   } {}
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}
284   do_test jrnlmode-4.2 {
285     execsql { PRAGMA journal_mode = off }
286   } {off}
288   do_test jrnlmode-4.3 {
289     execsql { INSERT INTO abc VALUES(1, 2, randomblob(2000)) }
290   } {}
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   } {}
298   integrity_check jrnlmode-4.5
301 #------------------------------------------------------------------------
302 # The following test caes, jrnlmode-5.*, test the journal_size_limit
303 # pragma.
304 ifcapable pragma {
305 if {[atomic_batch_write test.db]==0} {
306   db close
307   forcedelete test.db test2.db test3.db
308   sqlite3 db test.db
310   do_test jrnlmode-5.1 {
311     execsql {pragma page_size=1024}
312     execsql {pragma journal_mode=persist}
313   } {persist}
315   do_test jrnlmode-5.2 {
316     execsql { PRAGMA journal_size_limit }
317   } {-1}
318   do_test jrnlmode-5.3 {
319     execsql { 
320       ATTACH 'test2.db' AS aux;
321       PRAGMA aux.journal_mode=persist;
322       PRAGMA aux.journal_size_limit;
323     }
324   } {persist -1}
325   do_test jrnlmode-5.4.1 {
326     execsql { PRAGMA aux.journal_size_limit = 999999999999 }
327   } {999999999999}
328   do_test jrnlmode-5.4.2 {
329     execsql { PRAGMA aux.journal_size_limit = 10240 }
330   } {10240}
331   do_test jrnlmode-5.5 {
332     execsql { PRAGMA main.journal_size_limit = 20480 }
333   } {20480}
334   do_test jrnlmode-5.6 {
335     execsql { PRAGMA journal_size_limit }
336   } {20480}
337   do_test jrnlmode-5.7 {
338     execsql { PRAGMA aux.journal_size_limit }
339   } {10240}
341   do_test jrnlmode-5.8 {
342     execsql {
343       ATTACH 'test3.db' AS aux2;
344       PRAGMA aux2.journal_mode=persist;
345     }
346   } {persist}
348   do_test jrnlmode-5.9 {
349     execsql {
350       CREATE TABLE main.t1(a, b, c);
351       CREATE TABLE aux.t2(a, b, c);
352       CREATE TABLE aux2.t3(a, b, c);
353     }
354   } {}
355   do_test jrnlmode-5.10 {
356     list \
357       [file exists test.db-journal]  \
358       [file exists test2.db-journal] \
359       [file exists test3.db-journal]
360   } {1 1 1}
361   do_test jrnlmode-5.11 {
362     execsql {
363       BEGIN;
364       INSERT INTO t3 VALUES(randomblob(1000),randomblob(1000),randomblob(1000));
365       INSERT INTO t3 
366           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
367       INSERT INTO t3 
368           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
369       INSERT INTO t3 
370           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
371       INSERT INTO t3 
372           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
373       INSERT INTO t3 
374           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
375       INSERT INTO t2 SELECT * FROM t3;
376       INSERT INTO t1 SELECT * FROM t2;
377       COMMIT;
378     }
379     list \
380       [file exists test.db-journal]  \
381       [file exists test2.db-journal] \
382       [file exists test3.db-journal] \
383       [file size test.db-journal]    \
384       [file size test2.db-journal]   \
385       [file size test3.db-journal]
386   } {1 1 1 0 0 0}
388   do_test jrnlmode-5.12 {
389     execsql {
390       BEGIN;
391       UPDATE t1 SET a = randomblob(1000);
392     }
393     expr {[file size test.db-journal]>30000}
394   } {1}
395   do_test jrnlmode-5.13 {
396     execsql COMMIT
397     file size test.db-journal
398   } {20480}
400   do_test jrnlmode-5.14 {
401     execsql {
402       BEGIN;
403       UPDATE t2 SET a = randomblob(1000);
404     }
405     expr {[file size test2.db-journal]>30000}
406   } {1}
407   do_test jrnlmode-5.15 {
408     execsql COMMIT
409     file size test2.db-journal
410   } {10240}
412   do_test jrnlmode-5.16 {
413     execsql {
414       BEGIN;
415       UPDATE t3 SET a = randomblob(1000);
416     }
417     set journalsize [file size test3.db-journal]
418     expr {$journalsize>30000}
419   } {1}
420   do_test jrnlmode-5.17 {
421     execsql COMMIT
422     set sz [file size test3.db-journal]
423     expr {$sz>=$journalsize}
424   } {1}
426   do_test jrnlmode-5.18 {
427     execsql {
428       PRAGMA journal_size_limit = -4;
429       BEGIN;
430       UPDATE t1 SET a = randomblob(1000);
431     }
432     set journalsize [file size test.db-journal]
433     expr {$journalsize>30000}
434   } {1}
435   do_test jrnlmode-5.19 {
436     execsql COMMIT
437     set sz [file size test.db-journal]
438     expr {$sz>=$journalsize}
439   } {1}
441   # Test a size-limit of 0.
442   #
443   do_test jrnlmode-5.20 {
444     execsql {
445       PRAGMA journal_size_limit = 0;
446       BEGIN;
447       UPDATE t1 SET a = randomblob(1000);
448     }
449   } {0}
450   do_test jrnlmode-5.21 {
451     expr {[file size test.db-journal] > 1024}
452   } {1}
453   do_test jrnlmode-5.22 {
454     execsql COMMIT
455     list [file exists test.db-journal] [file size test.db-journal]
456   } {1 0}
460 ifcapable pragma {
461 if {[atomic_batch_write test.db]==0} {
462   # These tests are not run as part of the "journaltest" permutation,
463   # as the test_journal.c layer is incompatible with in-memory journaling.
464   if {[permutation] ne "journaltest"} {
466     do_test jrnlmode-6.1 {
467       execsql {
468         PRAGMA journal_mode = truncate;
469         CREATE TABLE t4(a, b);
470         BEGIN;
471           INSERT INTO t4 VALUES(1, 2);
472           PRAGMA journal_mode = memory;
473       }
474     } {truncate truncate}
475     do_test jrnlmode-6.2 {
476       file exists test.db-journal
477     } {1}
478     do_test jrnlmode-6.3 {
479       execsql {
480         COMMIT;
481         SELECT * FROM t4;
482       }
483     } {1 2}
484     do_test jrnlmode-6.4 {
485       file exists test.db-journal
486     } {1}
487     do_test jrnlmode-6.5 {
488       execsql {
489         PRAGMA journal_mode = MEMORY;
490         BEGIN;
491           INSERT INTO t4 VALUES(3, 4);
492       }
493       file exists test.db-journal
494     } {0}
495     do_test jrnlmode-6.7 {
496       execsql {
497         COMMIT;
498         SELECT * FROM t4;
499       }
500     } {1 2 3 4}
501     do_test jrnlmode-6.8 {
502       file exists test.db-journal
503     } {0}
504     do_test jrnlmode-6.9 {
505       execsql {
506         PRAGMA journal_mode = DELETE;
507         BEGIN IMMEDIATE; INSERT INTO t4 VALUES(1,2); COMMIT;
508       }
509       file exists test.db-journal
510     } {0}
511   }
515 ifcapable pragma {
516   catch { db close }
517   do_test jrnlmode-7.1 {
518     foreach f [glob -nocomplain test.db*] { forcedelete $f }
519     sqlite3 db test.db
520     execsql {
521       PRAGMA journal_mode = memory;
522       PRAGMA auto_vacuum = 0;
523       PRAGMA page_size = 1024;
524       PRAGMA user_version = 5;
525       PRAGMA user_version;
526     }
527   } {memory 5}
528   do_test jrnlmode-7.2 { file size test.db } {1024}
531 do_execsql_test jrnlmode-8.1  { PRAGMA locking_mode=EXCLUSIVE } {exclusive}
532 do_execsql_test jrnlmode-8.2  { CREATE TABLE t1(x) }            {}
533 do_execsql_test jrnlmode-8.3  { INSERT INTO t1 VALUES(123) }    {}
534 do_execsql_test jrnlmode-8.4  { SELECT * FROM t1 }              {123}
535 do_execsql_test jrnlmode-8.5  { PRAGMA journal_mode=PERSIST }   {persist}
536 do_execsql_test jrnlmode-8.6  { PRAGMA journal_mode=DELETE }    {delete}
537 do_execsql_test jrnlmode-8.7  { PRAGMA journal_mode=TRUNCATE }  {truncate}
538 do_execsql_test jrnlmode-8.8  { PRAGMA journal_mode=DELETE }    {delete}
539 do_execsql_test jrnlmode-8.9  { CREATE TABLE t2(y) }            {}
540 do_execsql_test jrnlmode-8.10 { INSERT INTO t2 VALUES(456) }    {}
541 do_execsql_test jrnlmode-8.11 { SELECT * FROM t1, t2 }          {123 456}
542 do_execsql_test jrnlmode-8.12 { PRAGMA locking_mode=NORMAL }    {normal}
543 do_execsql_test jrnlmode-8.13 { PRAGMA journal_mode=PERSIST }   {persist}
544 do_execsql_test jrnlmode-8.14 { PRAGMA journal_mode=TRUNCATE }  {truncate}
545 do_execsql_test jrnlmode-8.15 { PRAGMA journal_mode=PERSIST }   {persist}
546 do_execsql_test jrnlmode-8.16 { PRAGMA journal_mode=DELETE }    {delete}
547 do_execsql_test jrnlmode-8.17 { PRAGMA journal_mode=TRUNCATE }  {truncate}
548 do_execsql_test jrnlmode-8.18 { PRAGMA locking_mode=EXCLUSIVE } {exclusive}
549 do_execsql_test jrnlmode-8.19 { CREATE TABLE t3(z) }            {}
550 do_execsql_test jrnlmode-8.20 { BEGIN IMMEDIATE }               {}
551 do_execsql_test jrnlmode-8.21 { PRAGMA journal_mode=DELETE }    {delete}
552 do_execsql_test jrnlmode-8.22 { COMMIT }                        {}
553 do_execsql_test jrnlmode-8.23 { PRAGMA journal_mode=DELETE }    {delete}
554 do_execsql_test jrnlmode-8.24 { PRAGMA journal_mode=TRUNCATE }  {truncate}
555 do_execsql_test jrnlmode-8.25 { PRAGMA locking_mode=NORMAL }    {normal}
556 do_execsql_test jrnlmode-8.26 { CREATE TABLE t4(w) }            {}
557 do_execsql_test jrnlmode-8.27 { BEGIN IMMEDIATE }               {}
558 do_execsql_test jrnlmode-8.28 { PRAGMA journal_mode=DELETE }    {delete}
559 do_execsql_test jrnlmode-8.29 { COMMIT }                        {}
560 do_execsql_test jrnlmode-8.30 { PRAGMA journal_mode=DELETE }    {delete}
562 # Assertion fault on 2015-05-01
563 do_test jrnlmode-9.1 {
564   forcedelete test2.db
565   sqlite3 db2 test2.db
566   db2 eval {CREATE TEMP TABLE t(l); PRAGMA journal_mode=off;}
567   db2 close
568 } {}
569 do_execsql_test jrnlmode-9.2 {
570   PRAGMA locking_mode = exclusive;
571   CREATE TABLE tx(a);
572   PRAGMA journal_mode = off;
573 } {exclusive off}
576 finish_test