3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 source [file join [file dirname [info script]] rbu_common.tcl]
14 set ::testprefix rbuexlock
20 # Create a simple RBU database. That expects to write to a table:
22 # CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
24 proc create_rbu {filename} {
26 sqlite3 rbu1 $filename
28 CREATE TABLE data_t1(a, b, c, rbu_control);
29 INSERT INTO data_t1 VALUES(10, random(), random(), 0);
30 INSERT INTO data_t1 VALUES(20, random(), random(), 0);
31 INSERT INTO data_t1 VALUES(30, random(), random(), 0);
32 INSERT INTO data_t1 VALUES(40, random(), random(), 0);
33 INSERT INTO data_t1 VALUES(50, random(), random(), 0);
34 INSERT INTO data_t1 VALUES(60, random(), random(), 0);
35 INSERT INTO data_t1 VALUES(70, random(), random(), 0);
36 INSERT INTO data_t1 VALUES(80, random(), random(), 0);
45 CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
46 CREATE INDEX t1b ON t1(b);
47 CREATE INDEX t1c ON t1(c);
48 INSERT INTO t1 VALUES(1, 2, 3);
53 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
56 do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
59 for {set ii 0} {$ii < 10} {incr ii} {
64 do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
66 db eval {PRAGMA journal_mode}
70 while {[file exists test.db-wal]==0} {
74 do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
76 db eval {PRAGMA journal_mode}
83 do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
85 db eval {PRAGMA journal_mode}
92 file exists test.db-wal
95 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
96 file exists test.db-wal
98 do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
100 db eval {PRAGMA journal_mode}
107 do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
109 db eval {PRAGMA journal_mode}
113 while {[rbu step]=="SQLITE_OK"} {}
116 do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
118 db eval {PRAGMA journal_mode}
122 do_execsql_test 2.0 {
123 CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
124 CREATE INDEX t1b ON t1(b);
125 CREATE INDEX t1c ON t1(c);
126 INSERT INTO t1 VALUES(1, 2, 3);
131 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
134 do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
137 for {set ii 0} {$ii < 10} {incr ii} {
142 do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
145 while {[file exists test.db-wal]==0} {
150 llength [db eval {SELECT * FROM t1}]
153 db eval {PRAGMA journal_mode}
160 llength [db eval {SELECT * FROM t1}]
163 db eval {PRAGMA journal_mode}
169 db eval {PRAGMA journal_mode}
171 do_execsql_test 2.5.1 {
177 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
182 set rc [catch {rbu close} msg]
184 } {1 {SQLITE_ERROR - cannot update wal mode database}}
185 db eval {PRAGMA journal_mode=DELETE}
189 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
194 set rc [catch {rbu close} msg]
201 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db