150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 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
 | 
