OLD | NEW |
| (Empty) |
1 # 2009 April 20 | |
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 # | |
12 # Test cases inspired by ticket #3811. Tests to make sure that | |
13 # the journal_mode can only be changed at appropriate times and that | |
14 # all reported changes are effective. | |
15 # | |
16 # $Id: jrnlmode3.test,v 1.5 2009/04/20 17:43:03 drh Exp $ | |
17 | |
18 set testdir [file dirname $argv0] | |
19 source $testdir/tester.tcl | |
20 | |
21 ifcapable {!pager_pragmas} { | |
22 finish_test | |
23 return | |
24 } | |
25 | |
26 # | |
27 # Verify that journal_mode=OFF works as long as it occurs before the first | |
28 # transaction, even if locking_mode=EXCLUSIVE is enabled. The behavior if | |
29 # journal_mode is changed after the first transaction is undefined and hence | |
30 # untested. | |
31 # | |
32 do_test jrnlmode3-1.1 { | |
33 db eval { | |
34 PRAGMA journal_mode=OFF; | |
35 PRAGMA locking_mode=EXCLUSIVE; | |
36 CREATE TABLE t1(x); | |
37 INSERT INTO t1 VALUES(1); | |
38 SELECT * FROM t1; | |
39 } | |
40 } {off exclusive 1} | |
41 do_test jrnlmode3-1.2 { | |
42 db eval { | |
43 BEGIN; | |
44 INSERT INTO t1 VALUES(2); | |
45 ROLLBACK; | |
46 SELECT * FROM t1; | |
47 } | |
48 } {1} | |
49 | |
50 db close | |
51 forcedelete test.db test.db-journal | |
52 sqlite3 db test.db | |
53 | |
54 do_test jrnlmode3-2.1 { | |
55 db eval { | |
56 PRAGMA locking_mode=EXCLUSIVE; | |
57 PRAGMA journal_mode=OFF; | |
58 CREATE TABLE t1(x); | |
59 INSERT INTO t1 VALUES(1); | |
60 SELECT * FROM t1; | |
61 } | |
62 } {exclusive off 1} | |
63 do_test jrnlmode3-2.2 { | |
64 db eval { | |
65 BEGIN; | |
66 INSERT INTO t1 VALUES(2); | |
67 ROLLBACK; | |
68 SELECT * FROM t1; | |
69 } | |
70 } {1} | |
71 | |
72 # Test cases to verify that we can move from any journal_mode | |
73 # to any other, as long as we are not in a transaction. Verify | |
74 # that we cannot change journal_mode while a transaction is active. | |
75 # | |
76 set all_journal_modes {delete persist truncate memory off} | |
77 set cnt 0 | |
78 foreach fromjmode $all_journal_modes { | |
79 foreach tojmode $all_journal_modes { | |
80 | |
81 # Skip the no-change cases | |
82 if {$fromjmode==$tojmode} continue | |
83 incr cnt | |
84 | |
85 # Start with a fresh database connection an empty database file. | |
86 # | |
87 db close | |
88 forcedelete test.db test.db-journal | |
89 sqlite3 db test.db | |
90 | |
91 # Initialize the journal mode. | |
92 # | |
93 do_test jrnlmode3-3.$cnt.1-($fromjmode-to-$tojmode) { | |
94 db eval "PRAGMA journal_mode = $fromjmode;" | |
95 } $fromjmode | |
96 | |
97 # Verify that the initial journal mode takes. | |
98 # | |
99 do_test jrnlmode3-3.$cnt.2 { | |
100 db eval {PRAGMA main.journal_mode} | |
101 } $fromjmode | |
102 | |
103 # Start a transaction and try to change the journal mode within | |
104 # the transaction. This should fail. | |
105 # | |
106 do_test jrnlmode3-3.$cnt.3 { | |
107 db eval { | |
108 CREATE TABLE t1(x); | |
109 BEGIN; | |
110 INSERT INTO t1 VALUES($cnt); | |
111 } | |
112 db eval "PRAGMA journal_mode=$tojmode" | |
113 } $fromjmode | |
114 | |
115 # Rollback the transaction. | |
116 # | |
117 do_test jrnlmode3-3.$cnt.4 { | |
118 db eval { | |
119 ROLLBACK; | |
120 SELECT * FROM t1; | |
121 } | |
122 } {} | |
123 | |
124 # Now change the journal mode again. This time the new mode | |
125 # should take. | |
126 # | |
127 do_test jrnlmode3-3.$cnt.5 { | |
128 db eval "PRAGMA journal_mode=$tojmode" | |
129 } $tojmode | |
130 | |
131 # Do a the transaction. Verify that the rollback occurred | |
132 # if journal_mode!=OFF. | |
133 # | |
134 do_test jrnlmode3-3.$cnt.6 { | |
135 db eval { | |
136 DROP TABLE IF EXISTS t1; | |
137 CREATE TABLE t1(x); | |
138 BEGIN; | |
139 INSERT INTO t1 VALUES(1); | |
140 } | |
141 db eval ROLLBACK | |
142 db eval { | |
143 SELECT * FROM t1; | |
144 } | |
145 } {} | |
146 } | |
147 } | |
148 | |
149 finish_test | |
OLD | NEW |