# 2026-03-03 # # 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. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing a race condition in WAL restart. # set testdir [file dirname $argv0] source $testdir/tester.tcl if {$::tcl_platform(platform) ne "unix"} { # This test only works on unix finish_test return } set testprefix walrestart if {[permutation]=="memsubsys1"} { # memsubsys1 configures a very small page-cache, which causes different # numbers of frames to be written to the wal file for some transactions, # which causes some of the tests in this file to fail. finish_test return } db close sqlite3_shutdown proc faultsim {n} { return 0 } sqlite3_test_control_fault_install faultsim # Populate database. Create a large wal file and checkpoint it. # reset_db do_execsql_test 1.0 { PRAGMA auto_vacuum = 0; PRAGMA journal_mode = wal; CREATE TABLE t1(a INTEGER PRIMARY KEY, b); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<20 ) INSERT INTO t1 SELECT NULL, randomblob(600) FROM s; CREATE INDEX i1 ON t1(b); PRAGMA wal_checkpoint; } {wal 0 49 49} do_execsql_test 1.1 { UPDATE t1 SET b=randomblob(600); PRAGMA wal_checkpoint; } {0 45 45} # We have a completely checkpointed wal file on disk. mxFrame=$large, # nBackfill=$large. Do another checkpoint with [db]. This time, after [db] # reads mxFrame but before it reads nBackfill, write to the db such # that 0 < mxFrame < large. # proc faultsim {n} { if {$n==660} { db2 eval { UPDATE t1 SET b=randomblob(600) WHERE a<5 } } return 0 } sqlite3 db2 test.db do_execsql_test 1.2 { PRAGMA wal_checkpoint; } {0 45 0} # Now write another big update to the wal file and checkpoint it. # do_execsql_test -db db2 1.3 { UPDATE t1 SET b=randomblob(600); } proc faultsim {n} { return 0 } do_execsql_test 1.4 { PRAGMA wal_checkpoint; } {/0 5. 5./} do_catchsql_test 1.5 { PRAGMA integrity_check } {0 ok} sqlite3_test_control_fault_install finish_test