Index: third_party/sqlite/sqlite-src-3080704/test/nolock.test |
diff --git a/third_party/sqlite/sqlite-src-3080704/test/nolock.test b/third_party/sqlite/sqlite-src-3080704/test/nolock.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..331af08ad74e235a28ae8acb02ca81d32bc2f36c |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/test/nolock.test |
@@ -0,0 +1,185 @@ |
+# 2014-05-07 |
+# |
+# 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 file is testing the nolock=1 and immutable=1 query |
+# parameters and the SQLITE_IOCAP_IMMUTABLE device characteristic. |
+# |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+ |
+unset -nocomplain tvfs_calls |
+proc tvfs_reset {} { |
+ global tvfs_calls |
+ array set tvfs_calls {xLock 0 xUnlock 0 xCheckReservedLock 0 xAccess 0} |
+} |
+proc tvfs_callback {op args} { |
+ global tvfs_calls |
+ incr tvfs_calls($op) |
+ return SQLITE_OK |
+} |
+tvfs_reset |
+ |
+testvfs tvfs |
+tvfs script tvfs_callback |
+tvfs filter {xLock xUnlock xCheckReservedLock xAccess} |
+ |
+############################################################################ |
+# Verify that the nolock=1 query parameter for URI filenames disables all |
+# calls to xLock and xUnlock for rollback databases. |
+# |
+do_test nolock-1.0 { |
+ db close |
+ forcedelete test.db |
+ tvfs_reset |
+ sqlite db test.db -vfs tvfs |
+ db eval {CREATE TABLE t1(a,b,c); INSERT INTO t1 VALUES(1,2,3);} |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) |
+} {xLock 7 xUnlock 5 xCheckReservedLock 0} |
+ |
+do_test nolock-1.1 { |
+ db close |
+ forcedelete test.db |
+ tvfs_reset |
+ sqlite db file:test.db?nolock=0 -vfs tvfs -uri 1 |
+ db eval {CREATE TABLE t1(a,b,c); INSERT INTO t1 VALUES(1,2,3);} |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) |
+} {xLock 7 xUnlock 5 xCheckReservedLock 0} |
+ |
+do_test nolock-1.2 { |
+ db close |
+ forcedelete test.db |
+ tvfs_reset |
+ sqlite db file:test.db?nolock=1 -vfs tvfs -uri 1 |
+ db eval {CREATE TABLE t1(a,b,c); INSERT INTO t1 VALUES(1,2,3);} |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0} |
+ |
+do_test nolock-1.3 { |
+ db close |
+ tvfs_reset |
+ sqlite db file:test.db?nolock=0 -vfs tvfs -uri 1 -readonly 1 |
+ db eval {SELECT * FROM t1} |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) |
+} {xLock 2 xUnlock 2 xCheckReservedLock 0} |
+ |
+do_test nolock-1.4 { |
+ db close |
+ tvfs_reset |
+ sqlite db file:test.db?nolock=1 -vfs tvfs -uri 1 -readonly 1 |
+ db eval {SELECT * FROM t1} |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0} |
+ |
+############################################################################# |
+# Verify that immutable=1 disables both locking and xAccess calls to the |
+# journal files. |
+# |
+do_test nolock-2.0 { |
+ db close |
+ forcedelete test.db |
+ # begin by creating a test database |
+ sqlite3 db test.db |
+ db eval { |
+ CREATE TABLE t1(a,b); |
+ INSERT INTO t1 VALUES('hello','world'); |
+ CREATE TABLE t2(x,y); |
+ INSERT INTO t2 VALUES(12345,67890); |
+ SELECT * FROM t1, t2; |
+ } |
+} {hello world 12345 67890} |
+do_test nolock-2.1 { |
+ tvfs_reset |
+ sqlite3 db2 test.db -vfs tvfs |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-2.2 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 2 xUnlock 2 xCheckReservedLock 0 xAccess 4} |
+ |
+ |
+do_test nolock-2.11 { |
+ db2 close |
+ tvfs_reset |
+ sqlite3 db2 file:test.db?immutable=0 -vfs tvfs -uri 1 |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-2.12 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 2 xUnlock 2 xCheckReservedLock 0 xAccess 4} |
+ |
+ |
+do_test nolock-2.21 { |
+ db2 close |
+ tvfs_reset |
+ sqlite3 db2 file:test.db?immutable=1 -vfs tvfs -uri 1 |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-2.22 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0 xAccess 0} |
+ |
+do_test nolock-2.31 { |
+ db2 close |
+ tvfs_reset |
+ sqlite3 db2 file:test.db?immutable=1 -vfs tvfs -uri 1 -readonly 1 |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-2.32 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0 xAccess 0} |
+ |
+############################################################################ |
+# Verify that the SQLITE_IOCAP_IMMUTABLE flag works |
+# |
+do_test nolock-3.1 { |
+ db2 close |
+ tvfs devchar immutable |
+ tvfs_reset |
+ sqlite3 db2 test.db -vfs tvfs |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-3.2 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0 xAccess 0} |
+ |
+do_test nolock-3.11 { |
+ db2 close |
+ tvfs_reset |
+ sqlite3 db2 test.db -vfs tvfs -readonly 1 |
+ db2 eval {SELECT * FROM t1, t2} |
+} {hello world 12345 67890} |
+do_test nolock-3.12 { |
+ list xLock $::tvfs_calls(xLock) xUnlock $::tvfs_calls(xUnlock) \ |
+ xCheckReservedLock $::tvfs_calls(xCheckReservedLock) \ |
+ xAccess $::tvfs_calls(xAccess) |
+} {xLock 0 xUnlock 0 xCheckReservedLock 0 xAccess 0} |
+ |
+db2 close |
+db close |
+tvfs delete |
+finish_test |