186 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# 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
 |