Index: third_party/sqlite/sqlite-src-3080704/test/server1.test |
diff --git a/third_party/sqlite/sqlite-src-3080704/test/server1.test b/third_party/sqlite/sqlite-src-3080704/test/server1.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..90673ef00011a3dd2221c280527c6f4a827d4486 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/test/server1.test |
@@ -0,0 +1,171 @@ |
+# 2006 January 09 |
+# |
+# 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. The |
+# focus of this script is testing the server mode of SQLite. |
+# |
+# This file is derived from thread1.test |
+# |
+# $Id: server1.test,v 1.5 2007/08/29 18:20:17 drh Exp $ |
+ |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+ |
+# Skip this whole file if the server testing code is not enabled |
+# |
+if {[llength [info command client_step]]==0 || [sqlite3 -has-codec]} { |
+ finish_test |
+ return |
+} |
+ |
+# The sample server implementation does not work right when memory |
+# management is enabled. |
+# |
+ifcapable (memorymanage||mutex_noop) { |
+ finish_test |
+ return |
+} |
+ |
+# Create some data to work with |
+# |
+do_test server1-1.1 { |
+ execsql { |
+ CREATE TABLE t1(a,b); |
+ INSERT INTO t1 VALUES(1,'abcdefgh'); |
+ INSERT INTO t1 SELECT a+1, b||b FROM t1; |
+ INSERT INTO t1 SELECT a+2, b||b FROM t1; |
+ INSERT INTO t1 SELECT a+4, b||b FROM t1; |
+ SELECT count(*), max(length(b)) FROM t1; |
+ } |
+} {8 64} |
+ |
+# Interleave two threads on read access. Then make sure a third |
+# thread can write the database. In other words: |
+# |
+# read-lock A |
+# read-lock B |
+# unlock A |
+# unlock B |
+# write-lock C |
+# |
+do_test server1-1.2 { |
+ client_create A test.db |
+ client_create B test.db |
+ client_create C test.db |
+ client_compile A {SELECT a FROM t1} |
+ client_step A |
+ client_result A |
+} SQLITE_ROW |
+do_test server1-1.3 { |
+ client_argc A |
+} 1 |
+do_test server1-1.4 { |
+ client_argv A 0 |
+} 1 |
+do_test server1-1.5 { |
+ client_compile B {SELECT b FROM t1} |
+ client_step B |
+ client_result B |
+} SQLITE_ROW |
+do_test server1-1.6 { |
+ client_argc B |
+} 1 |
+do_test server1-1.7 { |
+ client_argv B 0 |
+} abcdefgh |
+do_test server1-1.8 { |
+ client_finalize A |
+ client_result A |
+} SQLITE_OK |
+do_test server1-1.9 { |
+ client_finalize B |
+ client_result B |
+} SQLITE_OK |
+do_test server1-1.10 { |
+ client_compile C {CREATE TABLE t2(x,y)} |
+ client_step C |
+ client_result C |
+} SQLITE_DONE |
+do_test server1-1.11 { |
+ client_finalize C |
+ client_result C |
+} SQLITE_OK |
+do_test server1-1.12 { |
+ catchsql {SELECT name FROM sqlite_master} |
+ execsql {SELECT name FROM sqlite_master} |
+} {t1 t2} |
+ |
+ |
+# Read from table t1. Do not finalize the statement. This |
+# will leave the lock pending. |
+# |
+do_test server1-2.1 { |
+ client_halt * |
+ client_create A test.db |
+ client_compile A {SELECT a FROM t1} |
+ client_step A |
+ client_result A |
+} SQLITE_ROW |
+ |
+# Read from the same table from another thread. This is allows. |
+# |
+do_test server1-2.2 { |
+ client_create B test.db |
+ client_compile B {SELECT b FROM t1} |
+ client_step B |
+ client_result B |
+} SQLITE_ROW |
+ |
+# Write to a different table from another thread. This is allowed |
+# because in server mode with a shared cache we have table-level locking. |
+# |
+do_test server1-2.3 { |
+ client_create C test.db |
+ client_compile C {INSERT INTO t2 VALUES(98,99)} |
+ client_step C |
+ client_result C |
+ client_finalize C |
+ client_result C |
+} SQLITE_OK |
+ |
+# But we cannot insert into table t1 because threads A and B have it locked. |
+# |
+do_test server1-2.4 { |
+ client_compile C {INSERT INTO t1 VALUES(98,99)} |
+ client_step C |
+ client_result C |
+ client_finalize C |
+ client_result C |
+} SQLITE_LOCKED |
+do_test server1-2.5 { |
+ client_finalize B |
+ client_wait B |
+ client_compile C {INSERT INTO t1 VALUES(98,99)} |
+ client_step C |
+ client_result C |
+ client_finalize C |
+ client_result C |
+} SQLITE_LOCKED |
+ |
+# Insert into t1 is successful after finishing the other two threads. |
+do_test server1-2.6 { |
+ client_finalize A |
+ client_wait A |
+ client_compile C {INSERT INTO t1 VALUES(98,99)} |
+ client_step C |
+ client_result C |
+ client_finalize C |
+ client_result C |
+} SQLITE_OK |
+ |
+client_halt * |
+sqlite3_enable_shared_cache 0 |
+finish_test |