123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- # 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
|