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