File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / jrnlmode2.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, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>