1# 2013-12-06 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12# Tests for the SQLITE_READONLY_DBMOVED error condition: the database file 13# is unlinked or renamed out from under SQLite. 14# 15 16if {$tcl_platform(platform)!="unix"} return 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21if {[permutation]=="inmemory_journal"} { 22 finish_test 23 return 24} 25 26# Create a database file for testing 27# 28do_execsql_test pager4-1.1 { 29 CREATE TABLE t1(a,b,c); 30 INSERT INTO t1 VALUES(673,'stone','philips'); 31 SELECT * FROM t1; 32} {673 stone philips} 33 34# After renaming the database file while it is open, one can still 35# read from the database, but writing returns a READONLY error. 36# 37file delete -force test-xyz.db 38file rename test.db test-xyz.db 39do_catchsql_test pager4-1.2 { 40 SELECT * FROM t1; 41} {0 {673 stone philips}} 42do_catchsql_test pager4-1.3 { 43 UPDATE t1 SET a=537; 44} {1 {attempt to write a readonly database}} 45 46# Creating a different database file with the same name of the original 47# is detected and still leaves the database read-only. 48# 49sqlite3 db2 test.db 50db2 eval {CREATE TABLE t2(x,y,z)} 51do_catchsql_test pager4-1.4 { 52 UPDATE t1 SET a=948; 53} {1 {attempt to write a readonly database}} 54 55# Changing the name back clears the READONLY error 56# 57db2 close 58file delete -force test.db 59file rename test-xyz.db test.db 60do_catchsql_test pager4-1.5 { 61 SELECT * FROM t1; 62} {0 {673 stone philips}} 63do_catchsql_test pager4-1.6 { 64 UPDATE t1 SET a=537; 65 SELECT * FROM t1; 66} {0 {537 stone philips}} 67 68# We can write to a renamed database if journal_mode=OFF or 69# journal_mode=MEMORY. 70# 71file rename test.db test-xyz.db 72do_catchsql_test pager4-1.7 { 73 PRAGMA journal_mode=OFF; 74 UPDATE t1 SET a=107; 75 SELECT * FROM t1; 76} {0 {off 107 stone philips}} 77do_catchsql_test pager4-1.8 { 78 PRAGMA journal_mode=MEMORY; 79 UPDATE t1 SET b='magpie'; 80 SELECT * FROM t1; 81} {0 {memory 107 magpie philips}} 82 83# Any other journal mode gives a READONLY error 84# 85do_catchsql_test pager4-1.9 { 86 PRAGMA journal_mode=DELETE; 87 UPDATE t1 SET c='jaguar'; 88} {1 {attempt to write a readonly database}} 89do_catchsql_test pager4-1.10 { 90 PRAGMA journal_mode=TRUNCATE; 91 UPDATE t1 SET c='jaguar'; 92} {1 {attempt to write a readonly database}} 93do_catchsql_test pager4-1.11 { 94 PRAGMA journal_mode=PERSIST; 95 UPDATE t1 SET c='jaguar'; 96} {1 {attempt to write a readonly database}} 97 98 99finish_test 100