Annotation of embedaddon/sqlite3/test/jrnlmode2.test, revision 1.1.1.1

1.1       misho       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>