The first assert() added in [0ebc65481f4a3e79] is not necessarily true in a
[sqlite.git] / test / jrnlmode3.test
blob43da6579abc1c032053ffc64c1917e6b08754b61
1 # 2009 April 20
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 # 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.
16 # $Id: jrnlmode3.test,v 1.5 2009/04/20 17:43:03 drh Exp $
18 set testdir [file dirname $argv0]
19 source $testdir/tester.tcl
21 ifcapable {!pager_pragmas} {
22   finish_test
23   return
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.
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}
50 db close
51 forcedelete test.db test.db-journal
52 sqlite3 db test.db
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}
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.
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 {
81     # Skip the no-change cases
82     if {$fromjmode==$tojmode} continue
83     incr cnt
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
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
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
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
115     # Rollback the transaction.  
116     #
117     do_test jrnlmode3-3.$cnt.4 {
118       db eval {
119         ROLLBACK;
120         SELECT * FROM t1;
121       }
122     } {}
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
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   }
149 finish_test