1# 2021 November 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 13source [file join [file dirname [info script]] rbu_common.tcl] 14set ::testprefix rbuexlock 15 16db close 17sqlite3_shutdown 18sqlite3_config_uri 1 19 20# Create a simple RBU database. That expects to write to a table: 21# 22# CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 23# 24proc create_rbu {filename} { 25 forcedelete $filename 26 sqlite3 rbu1 $filename 27 rbu1 eval { 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); 37 } 38 rbu1 close 39 return $filename 40} 41 42reset_db 43 44do_execsql_test 1.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); 49} 50create_rbu rbu1.db 51 52do_test 1.1.0 { 53 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db 54 rbu step 55} SQLITE_OK 56do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}} 57 58do_test 1.2.0 { 59 for {set ii 0} {$ii < 10} {incr ii} { 60 rbu step 61 } 62 rbu step 63} SQLITE_OK 64do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}} 65do_test 1.2.2 { 66 db eval {PRAGMA journal_mode} 67} {delete} 68 69do_test 1.3.0 { 70 while {[file exists test.db-wal]==0} { 71 rbu step 72 } 73} {} 74do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}} 75do_test 1.3.2 { 76 db eval {PRAGMA journal_mode} 77} {delete} 78 79 80do_test 1.4.0 { 81 rbu step 82} SQLITE_OK 83do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}} 84do_test 1.4.2 { 85 db eval {PRAGMA journal_mode} 86} {delete} 87 88 89rbu close 90 91do_test 1.5.0 { 92 file exists test.db-wal 93} {1} 94do_test 1.5.1 { 95 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db 96 file exists test.db-wal 97} 1 98do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}} 99do_test 1.5.2 { 100 db eval {PRAGMA journal_mode} 101} {delete} 102 103 104do_test 1.6.0 { 105 rbu step 106} SQLITE_OK 107do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}} 108do_test 1.6.2 { 109 db eval {PRAGMA journal_mode} 110} {delete} 111 112do_test 1.7.0 { 113 while {[rbu step]=="SQLITE_OK"} {} 114 rbu close 115} SQLITE_DONE 116do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9} 117do_test 1.7.2 { 118 db eval {PRAGMA journal_mode} 119} {delete} 120 121reset_db 122do_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); 127} 128create_rbu rbu1.db 129 130do_test 2.1.0 { 131 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db 132 rbu step 133} SQLITE_OK 134do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}} 135 136do_test 2.2.0 { 137 for {set ii 0} {$ii < 10} {incr ii} { 138 rbu step 139 } 140 rbu step 141} SQLITE_OK 142do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}} 143 144do_test 2.3.0 { 145 while {[file exists test.db-wal]==0} { 146 rbu step 147 } 148} {} 149do_test 2.3.1 { 150 llength [db eval {SELECT * FROM t1}] 151} {27} 152do_test 2.3.2 { 153 db eval {PRAGMA journal_mode} 154} {wal} 155 156do_test 2.4.0 { 157 rbu step 158} SQLITE_OK 159do_test 2.4.1 { 160 llength [db eval {SELECT * FROM t1}] 161} {27} 162do_test 2.4.2 { 163 db eval {PRAGMA journal_mode} 164} {wal} 165 166rbu close 167 168do_test 2.5.0 { 169 db eval {PRAGMA journal_mode} 170} {wal} 171do_execsql_test 2.5.1 { 172 DELETE FROM t1; 173} {} 174 175create_rbu rbu1.db 176do_test 3.1.0 { 177 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db 178 rbu step 179} SQLITE_ERROR 180 181do_test 3.1.1 { 182 set rc [catch {rbu close} msg] 183 lappend rc $msg 184} {1 {SQLITE_ERROR - cannot update wal mode database}} 185db eval {PRAGMA journal_mode=DELETE} 186 187create_rbu rbu1.db 188do_test 3.2.0 { 189 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db 190 rbu step 191} SQLITE_OK 192 193do_test 3.3.1 { 194 set rc [catch {rbu close} msg] 195 lappend rc $msg 196} {0 SQLITE_OK} 197 198db close 199create_rbu rbu1.db 200do_test 3.4.0 { 201 sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db 202 rbu step 203} SQLITE_OK 204rbu close 205 206 207finish_test 208