Annotation of embedaddon/sqlite3/test/jrnlmode2.test, revision 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>