summaryrefslogtreecommitdiffstats
path: root/test/tkt4018.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/tkt4018.test')
-rw-r--r--test/tkt4018.test90
1 files changed, 90 insertions, 0 deletions
diff --git a/test/tkt4018.test b/test/tkt4018.test
new file mode 100644
index 0000000..77582a5
--- /dev/null
+++ b/test/tkt4018.test
@@ -0,0 +1,90 @@
+# 2009 August 20
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library.
+#
+# This file implements tests to verify that ticket #4018 has been
+# fixed.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+do_not_use_codec
+
+proc testsql {sql} {
+ set fd [open tf_main.tcl w]
+ puts $fd [subst -nocommands {
+ sqlite3_test_control_pending_byte 0x0010000
+ sqlite3 db test.db
+ set rc [catch { db eval {$sql} } msg]
+ puts -nonewline "[set rc] {[set msg]}"
+ flush stdout
+ exit
+ }]
+ close $fd
+ set fd [open "| [info nameofexec] ./tf_main.tcl" r]
+ set res [read $fd]
+ close $fd
+ return $res
+}
+
+do_test tkt4018-1.1 {
+ execsql {
+ CREATE TABLE t1(a, b);
+ BEGIN;
+ SELECT * FROM t1;
+ }
+} {}
+
+# The database is locked by connection [db]. Open and close a second
+# connection to test.db 10000 times. If file-descriptors are not being
+# reused, then the process will quickly exceed its maximum number of
+# file descriptors (1024 by default on linux).
+do_test tkt4018-1.2 {
+ for {set i 0} {$i < 10000} {incr i} {
+ sqlite3 db2 test.db
+ db2 close
+ }
+} {}
+
+# Now check that connection [db] is still holding a SHARED lock by
+# having a second process try to write the db.
+do_test tkt4018-1.3 {
+ testsql {INSERT INTO t1 VALUES(3, 4)}
+} {1 {database is locked}}
+
+# Sanity checking. Have [db] release the lock and then retry the
+# INSERT from the previous test case.
+do_test tkt4018-1.4 {
+ db eval COMMIT
+ testsql {INSERT INTO t1 VALUES(3, 4)}
+} {0 {}}
+
+# Check that reusing a file descriptor cannot change a read-only
+# connection into a read-write connection.
+do_test tkt4018-2.1 {
+ sqlite3 db2 test.db
+ execsql {INSERT INTO t1 VALUES(1, 2)} db2
+} {}
+do_test tkt4018-2.2 {
+ execsql {
+ BEGIN;
+ SELECT * FROM t1 ORDER BY a;
+ }
+} {1 2 3 4}
+do_test tkt4018-2.3 {
+ db2 close
+ sqlite3 db2 test.db -readonly 1
+ execsql COMMIT
+ catchsql {INSERT INTO t1 VALUES(5, 6)} db2
+} {1 {attempt to write a readonly database}}
+db2 close
+
+finish_test