11b1f30bbSdrh# 2013-12-06 21b1f30bbSdrh# 31b1f30bbSdrh# The author disclaims copyright to this source code. In place of 41b1f30bbSdrh# a legal notice, here is a blessing: 51b1f30bbSdrh# 61b1f30bbSdrh# May you do good and not evil. 71b1f30bbSdrh# May you find forgiveness for yourself and forgive others. 81b1f30bbSdrh# May you share freely, never taking more than you give. 91b1f30bbSdrh# 101b1f30bbSdrh#*********************************************************************** 111b1f30bbSdrh# 12*705a4875Sdan# Tests for the SQLITE_READONLY_DBMOVED error condition: the database file 131b1f30bbSdrh# is unlinked or renamed out from under SQLite. 141b1f30bbSdrh# 151b1f30bbSdrh 161b1f30bbSdrhif {$tcl_platform(platform)!="unix"} return 171b1f30bbSdrh 181b1f30bbSdrhset testdir [file dirname $argv0] 191b1f30bbSdrhsource $testdir/tester.tcl 201b1f30bbSdrh 21*705a4875Sdanif {[permutation]=="inmemory_journal"} { 22*705a4875Sdan finish_test 23*705a4875Sdan return 24*705a4875Sdan} 25*705a4875Sdan 263fee8a63Sdrh# Create a database file for testing 273fee8a63Sdrh# 281b1f30bbSdrhdo_execsql_test pager4-1.1 { 291b1f30bbSdrh CREATE TABLE t1(a,b,c); 301b1f30bbSdrh INSERT INTO t1 VALUES(673,'stone','philips'); 311b1f30bbSdrh SELECT * FROM t1; 321b1f30bbSdrh} {673 stone philips} 333fee8a63Sdrh 343fee8a63Sdrh# After renaming the database file while it is open, one can still 353fee8a63Sdrh# read from the database, but writing returns a READONLY error. 363fee8a63Sdrh# 371b1f30bbSdrhfile delete -force test-xyz.db 381b1f30bbSdrhfile rename test.db test-xyz.db 391b1f30bbSdrhdo_catchsql_test pager4-1.2 { 401b1f30bbSdrh SELECT * FROM t1; 413fee8a63Sdrh} {0 {673 stone philips}} 423fee8a63Sdrhdo_catchsql_test pager4-1.3 { 433fee8a63Sdrh UPDATE t1 SET a=537; 443fee8a63Sdrh} {1 {attempt to write a readonly database}} 453fee8a63Sdrh 46b959a017Sdrh# Creating a different database file with the same name of the original 47b959a017Sdrh# is detected and still leaves the database read-only. 48b959a017Sdrh# 49b959a017Sdrhsqlite3 db2 test.db 50b959a017Sdrhdb2 eval {CREATE TABLE t2(x,y,z)} 51b959a017Sdrhdo_catchsql_test pager4-1.4 { 52b959a017Sdrh UPDATE t1 SET a=948; 53b959a017Sdrh} {1 {attempt to write a readonly database}} 54b959a017Sdrh 553fee8a63Sdrh# Changing the name back clears the READONLY error 563fee8a63Sdrh# 57b959a017Sdrhdb2 close 58b959a017Sdrhfile delete -force test.db 593fee8a63Sdrhfile rename test-xyz.db test.db 60b959a017Sdrhdo_catchsql_test pager4-1.5 { 613fee8a63Sdrh SELECT * FROM t1; 623fee8a63Sdrh} {0 {673 stone philips}} 63b959a017Sdrhdo_catchsql_test pager4-1.6 { 643fee8a63Sdrh UPDATE t1 SET a=537; 653fee8a63Sdrh SELECT * FROM t1; 663fee8a63Sdrh} {0 {537 stone philips}} 673fee8a63Sdrh 683fee8a63Sdrh# We can write to a renamed database if journal_mode=OFF or 693fee8a63Sdrh# journal_mode=MEMORY. 703fee8a63Sdrh# 713fee8a63Sdrhfile rename test.db test-xyz.db 72b959a017Sdrhdo_catchsql_test pager4-1.7 { 733fee8a63Sdrh PRAGMA journal_mode=OFF; 743fee8a63Sdrh UPDATE t1 SET a=107; 753fee8a63Sdrh SELECT * FROM t1; 763fee8a63Sdrh} {0 {off 107 stone philips}} 77b959a017Sdrhdo_catchsql_test pager4-1.8 { 783fee8a63Sdrh PRAGMA journal_mode=MEMORY; 793fee8a63Sdrh UPDATE t1 SET b='magpie'; 803fee8a63Sdrh SELECT * FROM t1; 813fee8a63Sdrh} {0 {memory 107 magpie philips}} 823fee8a63Sdrh 833fee8a63Sdrh# Any other journal mode gives a READONLY error 843fee8a63Sdrh# 85b959a017Sdrhdo_catchsql_test pager4-1.9 { 863fee8a63Sdrh PRAGMA journal_mode=DELETE; 873fee8a63Sdrh UPDATE t1 SET c='jaguar'; 883fee8a63Sdrh} {1 {attempt to write a readonly database}} 89b959a017Sdrhdo_catchsql_test pager4-1.10 { 903fee8a63Sdrh PRAGMA journal_mode=TRUNCATE; 913fee8a63Sdrh UPDATE t1 SET c='jaguar'; 923fee8a63Sdrh} {1 {attempt to write a readonly database}} 93b959a017Sdrhdo_catchsql_test pager4-1.11 { 943fee8a63Sdrh PRAGMA journal_mode=PERSIST; 953fee8a63Sdrh UPDATE t1 SET c='jaguar'; 963fee8a63Sdrh} {1 {attempt to write a readonly database}} 971b1f30bbSdrh 981b1f30bbSdrh 991b1f30bbSdrhfinish_test 100