File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / jrnlmode3.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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.1.1.1 2012/02/21 17:04:16 misho 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>