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.1.1.1 2012/02/21 17:04:16 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>