diff options
Diffstat (limited to 'test/jrnlmode3.test')
-rw-r--r-- | test/jrnlmode3.test | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/test/jrnlmode3.test b/test/jrnlmode3.test new file mode 100644 index 0000000..43da657 --- /dev/null +++ b/test/jrnlmode3.test @@ -0,0 +1,149 @@ +# 2009 April 20 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases inspired by ticket #3811. Tests to make sure that +# the journal_mode can only be changed at appropriate times and that +# all reported changes are effective. +# +# $Id: jrnlmode3.test,v 1.5 2009/04/20 17:43:03 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable {!pager_pragmas} { + finish_test + return +} + +# +# Verify that journal_mode=OFF works as long as it occurs before the first +# transaction, even if locking_mode=EXCLUSIVE is enabled. The behavior if +# journal_mode is changed after the first transaction is undefined and hence +# untested. +# +do_test jrnlmode3-1.1 { + db eval { + PRAGMA journal_mode=OFF; + PRAGMA locking_mode=EXCLUSIVE; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1); + SELECT * FROM t1; + } +} {off exclusive 1} +do_test jrnlmode3-1.2 { + db eval { + BEGIN; + INSERT INTO t1 VALUES(2); + ROLLBACK; + SELECT * FROM t1; + } +} {1} + +db close +forcedelete test.db test.db-journal +sqlite3 db test.db + +do_test jrnlmode3-2.1 { + db eval { + PRAGMA locking_mode=EXCLUSIVE; + PRAGMA journal_mode=OFF; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1); + SELECT * FROM t1; + } +} {exclusive off 1} +do_test jrnlmode3-2.2 { + db eval { + BEGIN; + INSERT INTO t1 VALUES(2); + ROLLBACK; + SELECT * FROM t1; + } +} {1} + +# Test cases to verify that we can move from any journal_mode +# to any other, as long as we are not in a transaction. Verify +# that we cannot change journal_mode while a transaction is active. +# +set all_journal_modes {delete persist truncate memory off} +set cnt 0 +foreach fromjmode $all_journal_modes { + foreach tojmode $all_journal_modes { + + # Skip the no-change cases + if {$fromjmode==$tojmode} continue + incr cnt + + # Start with a fresh database connection an empty database file. + # + db close + forcedelete test.db test.db-journal + sqlite3 db test.db + + # Initialize the journal mode. + # + do_test jrnlmode3-3.$cnt.1-($fromjmode-to-$tojmode) { + db eval "PRAGMA journal_mode = $fromjmode;" + } $fromjmode + + # Verify that the initial journal mode takes. + # + do_test jrnlmode3-3.$cnt.2 { + db eval {PRAGMA main.journal_mode} + } $fromjmode + + # Start a transaction and try to change the journal mode within + # the transaction. This should fail. + # + do_test jrnlmode3-3.$cnt.3 { + db eval { + CREATE TABLE t1(x); + BEGIN; + INSERT INTO t1 VALUES($cnt); + } + db eval "PRAGMA journal_mode=$tojmode" + } $fromjmode + + # Rollback the transaction. + # + do_test jrnlmode3-3.$cnt.4 { + db eval { + ROLLBACK; + SELECT * FROM t1; + } + } {} + + # Now change the journal mode again. This time the new mode + # should take. + # + do_test jrnlmode3-3.$cnt.5 { + db eval "PRAGMA journal_mode=$tojmode" + } $tojmode + + # Do a the transaction. Verify that the rollback occurred + # if journal_mode!=OFF. + # + do_test jrnlmode3-3.$cnt.6 { + db eval { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x); + BEGIN; + INSERT INTO t1 VALUES(1); + } + db eval ROLLBACK + db eval { + SELECT * FROM t1; + } + } {} + } +} + +finish_test |