Annotation of embedaddon/sqlite3/test/jrnlmode3.test, revision 1.1.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>