# 2021 November 06 # # 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. # #*********************************************************************** # source [file join [file dirname [info script]] rbu_common.tcl] if_no_rbu_support { finish_test ; return } set ::testprefix rbuexlock db close set journalmode delete if {[permutation]=="inmemory_journal"} { set journalmode memory } # Create a simple RBU database. That expects to write to a table: # # CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); # proc create_rbu {filename} { forcedelete $filename sqlite3 rbu1 $filename rbu1 eval { CREATE TABLE data_t1(a, b, c, rbu_control); INSERT INTO data_t1 VALUES(10, random(), random(), 0); INSERT INTO data_t1 VALUES(20, random(), random(), 0); INSERT INTO data_t1 VALUES(30, random(), random(), 0); INSERT INTO data_t1 VALUES(40, random(), random(), 0); INSERT INTO data_t1 VALUES(50, random(), random(), 0); INSERT INTO data_t1 VALUES(60, random(), random(), 0); INSERT INTO data_t1 VALUES(70, random(), random(), 0); INSERT INTO data_t1 VALUES(80, random(), random(), 0); } rbu1 close return $filename } reset_db do_execsql_test 1.0 { CREATE TABLE t1(a PRIMARY KEY, b INT, c INT); CREATE INDEX t1b ON t1(b); CREATE INDEX t1c ON t1(c); INSERT INTO t1 VALUES(1, 2, 3); } create_rbu rbu1.db do_test 1.1.0 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db rbu step } SQLITE_OK do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}} do_test 1.2.0 { for {set ii 0} {$ii < 10} {incr ii} { rbu step } rbu step } SQLITE_OK do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}} do_test 1.2.2 { db eval {PRAGMA journal_mode} } $journalmode do_test 1.3.0 { while {[file exists test.db-wal]==0} { rbu step } } {} do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}} do_test 1.3.2 { db eval {PRAGMA journal_mode} } $journalmode do_test 1.4.0 { rbu step } SQLITE_OK do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}} do_test 1.4.2 { db eval {PRAGMA journal_mode} } $journalmode rbu close do_test 1.5.0 { file exists test.db-wal } {1} do_test 1.5.1 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db file exists test.db-wal } 1 do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}} do_test 1.5.2 { db eval {PRAGMA journal_mode} } $journalmode do_test 1.6.0 { rbu step } SQLITE_OK do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}} do_test 1.6.2 { db eval {PRAGMA journal_mode} } $journalmode do_test 1.7.0 { while {[rbu step]=="SQLITE_OK"} {} rbu close } SQLITE_DONE do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9} do_test 1.7.2 { db eval {PRAGMA journal_mode} } $journalmode reset_db do_execsql_test 2.0 { CREATE TABLE t1(a PRIMARY KEY, b INT, c INT); CREATE INDEX t1b ON t1(b); CREATE INDEX t1c ON t1(c); INSERT INTO t1 VALUES(1, 2, 3); } create_rbu rbu1.db do_test 2.1.0 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db rbu step } SQLITE_OK do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}} do_test 2.2.0 { for {set ii 0} {$ii < 10} {incr ii} { rbu step } rbu step } SQLITE_OK do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}} do_test 2.3.0 { while {[file exists test.db-wal]==0} { rbu step } } {} do_test 2.3.1 { llength [db eval {SELECT * FROM t1}] } {27} do_test 2.3.2 { db eval {PRAGMA journal_mode} } {wal} do_test 2.4.0 { rbu step } SQLITE_OK do_test 2.4.1 { llength [db eval {SELECT * FROM t1}] } {27} do_test 2.4.2 { db eval {PRAGMA journal_mode} } {wal} rbu close do_test 2.5.0 { db eval {PRAGMA journal_mode} } {wal} do_execsql_test 2.5.1 { DELETE FROM t1; } {} create_rbu rbu1.db do_test 3.1.0 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db rbu step } SQLITE_ERROR do_test 3.1.1 { set rc [catch {rbu close} msg] lappend rc $msg } {1 {SQLITE_ERROR - cannot update wal mode database}} db eval {PRAGMA journal_mode=DELETE} create_rbu rbu1.db do_test 3.2.0 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db rbu step } SQLITE_OK do_test 3.3.1 { set rc [catch {rbu close} msg] lappend rc $msg } {0 SQLITE_OK} db close create_rbu rbu1.db do_test 3.4.0 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db rbu step } SQLITE_OK rbu close #------------------------------------------------------------------------- reset_db forcedelete rbu1.db forcedelete rbu2.db sqlite3 rbu rbu1.db do_execsql_test -db rbu 4.1 { CREATE TABLE data_t1(a, b, rbu_control); INSERT INTO data_t1 VALUES(1, 'one', 0); } rbu close sqlite3 rbu rbu2.db do_execsql_test -db rbu 4.2 { CREATE TABLE data_t1(a, b, rbu_control); INSERT INTO data_t1 VALUES(2, 'two', 0); } rbu close do_execsql_test 4.3 { CREATE TABLE t1(a PRIMARY KEY, b); } db close do_test 4.4 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db rbu step rbu state } {oal} sqlite3 cons test.db do_execsql_test -db cons 4.5 { SELECT * FROM t1 } {} do_test 4.6 { rbu step ; rbu state } {oal} do_test 4.7 { rbu step ; rbu state } {move} do_execsql_test -db cons 4.8 { SELECT * FROM t1 } {} do_test 4.9 { rbu step ; rbu state } {checkpoint} do_test 4.10 { catchsql { SELECT * FROM t1 } cons } {1 {database is locked}} do_test 4.11 { rbu step ; rbu state } {checkpoint} do_test 4.11 { rbu step ; rbu state } {done} rbu close do_test 4.12 { catchsql { SELECT * FROM t1 } cons } {0 {1 one}} do_test 4.13 { sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu2.db rbu step rbu state } {oal} do_test 4.14 { catchsql { SELECT * FROM t1 } cons } {0 {1 one}} do_test 4.15 { rbu step ; rbu state } {oal} do_test 4.16 { rbu step ; rbu state } {move} do_test 4.17 { catchsql { SELECT * FROM t1 } cons } {0 {1 one}} do_test 4.18 { rbu step ; rbu state } {checkpoint} do_test 4.19 { catchsql { SELECT * FROM t1 } cons } {1 {database is locked}} do_test 4.20 { rbu step ; rbu state } {checkpoint} do_test 4.21 { rbu step ; rbu state } {done} rbu close do_test 4.22 { catchsql { SELECT * FROM t1 } cons } {0 {1 one 2 two}} cons close finish_test