modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/jrnlmode2.test (about)

     1  # 2009 March 24
     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  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  
    16  ifcapable {!pager_pragmas} {
    17    finish_test
    18    return
    19  }
    20  
    21  #-------------------------------------------------------------------------
    22  # The tests in this file check that the following two bugs (both now fixed)
    23  # do not reappear.
    24  #
    25  # jrnlmode2-1.*: Demonstrate bug #3745:
    26  #
    27  #     In persistent journal mode, if:
    28  #
    29  #       * There is a persistent journal in the file-system, AND
    30  #       * there exists a connection with a shared lock on the db file, 
    31  #
    32  #     then a second connection cannot open a read-transaction on the database.
    33  #     The reason is because while determining that the persistent-journal is
    34  #     not a hot-journal, SQLite currently grabs an exclusive lock on the
    35  #     database file. If this fails because another connection has a shared
    36  #     lock, then SQLITE_BUSY is returned to the user.  
    37  #
    38  # jrnlmode2-2.*: Demonstrate bug #3751:
    39  #
    40  #     If a connection is opened in SQLITE_OPEN_READONLY mode, the underlying
    41  #     unix file descriptor on the database file is opened in O_RDONLY mode.
    42  #
    43  #     When SQLite queries the database file for the schema in order to compile
    44  #     the SELECT statement, it sees the empty journal in the file system, it
    45  #     attempts to obtain an exclusive lock on the database file (this is a
    46  #     bug). The attempt to obtain an exclusive (write) lock on a read-only file
    47  #     fails at the OS level. Under unix, fcntl() reports an EBADF - "Bad file
    48  #     descriptor" - error. 
    49  #
    50  
    51  do_test jrnlmode2-1.1 {
    52    execsql {
    53      PRAGMA journal_mode = persist;
    54      CREATE TABLE t1(a, b);
    55      INSERT INTO t1 VALUES(1, 2);
    56    }
    57  } {persist}
    58  
    59  do_test jrnlmode2-1.2 {
    60    file exists test.db-journal
    61  } {1}
    62  
    63  do_test jrnlmode2-1.3 {
    64    sqlite3 db2 test.db
    65    execsql { SELECT * FROM t1 } db2
    66  } {1 2}
    67  
    68  do_test jrnlmode2-1.4 {
    69    execsql {
    70      INSERT INTO t1 VALUES(3, 4);
    71    }
    72    execsql {
    73      BEGIN;
    74      SELECT * FROM t1;
    75    }
    76    execsql { PRAGMA lock_status }
    77  } {main shared temp closed}
    78  
    79  do_test jrnlmode2-1.5 {
    80    file exists test.db-journal
    81  } {1}
    82  
    83  do_test jrnlmode2-1.6 {
    84    catchsql { SELECT * FROM t1 } db2
    85  } {0 {1 2 3 4}}
    86  
    87  do_test jrnlmode2-1.7 {
    88    execsql { COMMIT }
    89    catchsql { SELECT * FROM t1 } db2
    90  } {0 {1 2 3 4}}
    91  
    92  
    93  
    94  do_test jrnlmode2-2.1 {
    95    db2 close
    96    execsql { PRAGMA journal_mode = truncate }
    97    execsql { INSERT INTO t1 VALUES(5, 6) }
    98  } {}
    99  
   100  do_test jrnlmode2-2.2 {
   101    file exists test.db-journal
   102  } {1}
   103  
   104  do_test jrnlmode2-2.3 {
   105    file size test.db-journal
   106  } {0}
   107  
   108  do_test jrnlmode2-2.4 {
   109    sqlite3 db2 test.db -readonly 1
   110    catchsql { SELECT * FROM t1 } db2
   111  } {0 {1 2 3 4 5 6}}
   112  
   113  do_test jrnlmode2-2.5 {
   114    db close
   115    delete_file test.db-journal
   116  } {}
   117  do_test jrnlmode2-2.6 {
   118    sqlite3 db2 test.db -readonly 1
   119    catchsql { SELECT * FROM t1 } db2
   120  } {0 {1 2 3 4 5 6}}
   121  
   122  catch { db2 close }
   123  finish_test