gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/jrnlmode3.test (about)

     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