summaryrefslogtreecommitdiff
path: root/test/jrnlmode3.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/jrnlmode3.test')
-rw-r--r--test/jrnlmode3.test149
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