Work toward enhanced functionality for json_valid() with deep checking
[sqlite.git] / test / walpersist.test
blob73e6de13d42ec32caf069b5acad6f7c3e3d68580
1 # 2011 July 26
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 #***********************************************************************
12 # This file contains tests for using WAL with persistent WAL file mode.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
17 source $testdir/lock_common.tcl
18 set ::testprefix walpersist
20 ifcapable !wal {
21   finish_test
22   return
25 do_test walpersist-1.0 {
26   db eval {
27     PRAGMA journal_mode=WAL;
28     CREATE TABLE t1(a);
29     INSERT INTO t1 VALUES(randomblob(5000));
30   }
31   file exists test.db-wal
32 } {1}
33 do_test walpersist-1.1 {
34   file exists test.db-shm
35 } {1}
36 do_test walpersist-1.2 {
37   db close
38   list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
39 } {1 0 0}
40 do_test walpersist-1.3 {
41   sqlite3 db test.db
42   db eval {SELECT length(a) FROM t1}
43 } {5000}
44 do_test walpersist-1.4 {
45   list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
46 } {1 1 1}
47 do_test walpersist-1.5 {
48   file_control_persist_wal db -1
49 } {0 0}
50 do_test walpersist-1.6 {
51   file_control_persist_wal db 1
52 } {0 1}
53 do_test walpersist-1.7 {
54   file_control_persist_wal db -1
55 } {0 1}
56 do_test walpersist-1.8 {
57   file_control_persist_wal db 0
58 } {0 0}
59 do_test walpersist-1.9 {
60   file_control_persist_wal db -1
61 } {0 0}
62 do_test walpersist-1.10 {
63   file_control_persist_wal db 1
64 } {0 1}
65 do_test walpersist-1.11 {
66   db close
67   list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
68 } {1 1 1}
70 # Make sure the journal_size_limit works to limit the size of the
71 # persisted wal file.  In persistent-wal mode, any non-negative
72 # journal_size_limit causes the WAL file to be truncated to zero bytes
73 # when closing.
75 forcedelete test.db test.db-shm test.db-wal
76 do_test walpersist-2.1 {
77   sqlite3 db test.db
78   db eval {
79     PRAGMA journal_mode=WAL;
80     PRAGMA wal_autocheckpoint=OFF;
81     PRAGMA journal_size_limit=12000;
82     CREATE TABLE t1(x);
83     INSERT INTO t1 VALUES(randomblob(50000));
84     UPDATE t1 SET x=randomblob(50000);
85   }
86   expr {[file size test.db-wal]>100000}
87 } {1}
88 do_test walpersist-2.2 {
89   file_control_persist_wal db 1
90   db close
91   concat [file exists test.db-wal] [file size test.db-wal]
92 } {1 0}
93 do_test walpersist-2.3 {
94   sqlite3 db test.db
95   execsql { PRAGMA integrity_check }
96 } {ok}
98 do_test 3.1 {
99   catch {db close}
100   forcedelete test.db test.db-shm test.db-wal
101   sqlite3 db test.db
102   execsql {
103     PRAGMA page_size = 1024;
104     PRAGMA journal_mode = WAL;
105     PRAGMA wal_autocheckpoint=128;
106     PRAGMA journal_size_limit=16384;
107     CREATE TABLE t1(a, b, PRIMARY KEY(a, b));
108   }
109 } {wal 128 16384}
110 do_test 3.2 {
111   for {set i 0} {$i<200} {incr i} {
112     execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) }
113   }
114   file_control_persist_wal db 1
115   db close
116 } {}
117 do_test walpersist-3.3 { 
118   file size test.db-wal 
119 } {0}
120 do_test walpersist-3.4 { 
121   sqlite3 db test.db
122   execsql { PRAGMA integrity_check }
123 } {ok}
125 # 2023-05-07 https://sqlite.org/forum/forumpost/8130545bc6
127 reset_db
128 do_test 4.1 {
129   db eval {
130     PRAGMA journal_mode=WAL;
131     CREATE TABLE t1(x);
132   }
133   file_control_persist_wal db 1
134   db eval {
135     PRAGMA journal_mode=TRUNCATE;
136     PRAGMA journal_mode=MEMORY;
137     PRAGMA journal_mode=WAL;
138     PRAGMA journal_mode=PERSIST;
139   }
140 } {truncate memory wal persist}
142 finish_test