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
 | 
