Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / sqlite / src / test / walmode.test
blob4e14d54d4f71551a04f0f9a0d8aceb87ebf987a8
1 # 2010 April 19
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
12 # focus of this file is testing the operation of the library in
13 # "PRAGMA journal_mode=WAL" mode.
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
18 source $testdir/malloc_common.tcl
20 # If the library was compiled without WAL support, check that the 
21 # "PRAGMA journal_mode=WAL" treats "WAL" as an unrecognized mode.
23 ifcapable !wal {
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}
35   finish_test
36   return
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}
48 set expected_sync_count 3
49 if {$::tcl_platform(platform)!="windows"} {
50   ifcapable dirsync {
51     incr expected_sync_count
52   }
54 do_test walmode-1.3 {
55   set sqlite_sync_count
56 } $expected_sync_count
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}
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.
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}
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.
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}
103 # Test that changing back to journal_mode=persist works.
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}
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.
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}
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}
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}
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 }
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.
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.
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}
210 if {$TEMP_STORE>=2} {
211   set tempJrnlMode memory
212 } else {
213   set tempJrnlMode delete
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]
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]
272 #-------------------------------------------------------------------------
273 # Test changing to WAL mode from journal_mode=off or journal_mode=memory
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]
290 db close
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.
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
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
330 db close
332 #-------------------------------------------------------------------------
333 # Test the effect of a "PRAGMA journal_mode" command on an attached 
334 # database.
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}
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}
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}
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}
376 sqlite3 db2 test.db2
377 do_test walmode-8.19 { execsql { PRAGMA main.journal_mode } db2 }  {wal}
378 db2 close
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}
387 finish_test