github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/walsetlk.test (about) 1 # 2020 May 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 13 set testdir [file dirname $argv0] 14 source $testdir/tester.tcl 15 source $testdir/lock_common.tcl 16 set testprefix walsetlk 17 18 ifcapable !wal {finish_test ; return } 19 db timeout 1000 20 21 #------------------------------------------------------------------------- 22 # 1.*: Test that nothing goes wrong if recovery is forced while opening 23 # a write transaction or performing a checkpoint with blocking locks. 24 # 25 26 do_execsql_test 1.0 { 27 CREATE TABLE t1(x, y); 28 PRAGMA journal_mode = wal; 29 INSERT INTO t1 VALUES(1, 2); 30 INSERT INTO t1 VALUES(3, 4); 31 INSERT INTO t1 VALUES(5, 6); 32 INSERT INTO t1 VALUES(7, 8); 33 } {wal} 34 35 sqlite3 db2 test.db 36 db2 timeout 1000 37 38 do_execsql_test -db db2 1.1 { 39 SELECT * FROM t1 40 } {1 2 3 4 5 6 7 8} 41 42 set fd [open test.db-shm r+] 43 puts $fd "blahblahblahblah" 44 flush $fd 45 46 do_execsql_test 1.2 { 47 BEGIN; 48 INSERT INTO t1 VALUES(9, 10); 49 } 50 51 do_execsql_test -db db2 1.3 { 52 SELECT * FROM t1 53 } {1 2 3 4 5 6 7 8} 54 55 do_test 1.4 { 56 list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg 57 } {1 {database is locked}} 58 59 do_execsql_test 1.5 { COMMIT } 60 do_execsql_test -db db2 1.6 { 61 SELECT * FROM t1 62 } {1 2 3 4 5 6 7 8 9 10} 63 64 puts $fd "blahblahblahblah" 65 flush $fd 66 67 do_execsql_test -db db2 1.7 { 68 PRAGMA wal_checkpoint = TRUNCATE 69 } {0 0 0} 70 71 do_test 1.8 { 72 file size test.db-wal 73 } 0 74 75 close $fd 76 db close 77 db2 close 78 #------------------------------------------------------------------------- 79 80 do_multiclient_test tn { 81 do_test 2.$tn.1 { 82 sql1 { 83 PRAGMA journal_mode = wal; 84 CREATE TABLE t1(s, v); 85 INSERT INTO t1 VALUES(1, 2); 86 INSERT INTO t1 VALUES(3, 4); 87 INSERT INTO t1 VALUES(5, 6); 88 } 89 code1 { db timeout 2000 } 90 } {} 91 92 do_test 2.$tn.2 { 93 sql2 { 94 BEGIN; 95 INSERT INTO t1 VALUES(7, 8); 96 } 97 } {} 98 99 do_test 2.$tn.3 { 100 set us [lindex [time { catch {db eval "BEGIN EXCLUSIVE"} }] 0] 101 expr $us>1000000 && $us<4000000 102 } {1} 103 104 do_test 2.$tn.4 { 105 sql2 { COMMIT } 106 sql1 { SELECT * FROM t1 } 107 } {1 2 3 4 5 6 7 8} 108 109 do_test 2.$tn.5 { 110 sql2 { 111 BEGIN; 112 INSERT INTO t1 VALUES(9, 10); 113 } 114 } {} 115 116 do_test 2.$tn.6 { 117 set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] 118 expr $us>1000000 && $us<4000000 119 } {1} 120 121 do_test 2.$tn.7 { 122 sql2 { 123 COMMIT; 124 BEGIN; 125 SELECT * FROM t1; 126 } 127 } {1 2 3 4 5 6 7 8 9 10} 128 129 do_test 2.$tn.8 { 130 set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] 131 expr $us>1000000 && $us<4000000 132 } {1} 133 134 do_test 2.$tn.9 { 135 sql3 { 136 INSERT INTO t1 VALUES(11, 12); 137 } 138 sql2 { 139 COMMIT; 140 BEGIN; 141 SELECT * FROM t1; 142 } 143 sql3 { 144 INSERT INTO t1 VALUES(13, 14); 145 } 146 } {} 147 148 do_test 2.$tn.10 { 149 set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] 150 expr $us>1000000 && $us<4000000 151 } {1} 152 153 do_test 2.$tn.11 { 154 sql3 { 155 BEGIN; 156 SELECT * FROM t1; 157 } 158 sql1 { INSERT INTO t1 VALUES(15, 16); } 159 } {} 160 161 do_test 2.$tn.12 { 162 set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] 163 expr $us>1000000 && $us<4000000 164 } {1} 165 166 do_test 2.$tn.13 { 167 sql2 { 168 COMMIT; 169 BEGIN; 170 SELECT * FROM t1; 171 } 172 sql1 { INSERT INTO t1 VALUES(17, 18); } 173 } {} 174 175 do_test 2.$tn.14 { 176 set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] 177 expr $us>1000000 && $us<4000000 178 } {1} 179 180 } 181 182 #------------------------------------------------------------------------- 183 reset_db 184 sqlite3 db2 test.db 185 db2 timeout 1000 186 do_execsql_test 3.0 { 187 PRAGMA journal_mode = wal; 188 CREATE TABLE x1(x, y); 189 BEGIN; 190 INSERT INTO x1 VALUES(1, 2); 191 } {wal} 192 193 do_test 3.1 { 194 list [catch { db2 eval {BEGIN EXCLUSIVE} } msg] $msg 195 } {1 {database is locked}} 196 197 finish_test