Annotation of embedaddon/sqlite3/test/jrnlmode3.test, revision 1.1
1.1 ! misho 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.5 2009/04/20 17:43:03 drh 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>