| Index: third_party/sqlite/src/test/wal.test
|
| diff --git a/third_party/sqlite/src/test/wal.test b/third_party/sqlite/src/test/wal.test
|
| index 1aa70e0525154568a542ab46bf655b043e0710b8..675be73791a7946c97f32de73dd154c8fb32ee2e 100644
|
| --- a/third_party/sqlite/src/test/wal.test
|
| +++ b/third_party/sqlite/src/test/wal.test
|
| @@ -25,7 +25,7 @@ ifcapable !wal {finish_test ; return }
|
|
|
| proc reopen_db {} {
|
| catch { db close }
|
| - file delete -force test.db test.db-wal test.db-wal-summary
|
| + forcedelete test.db test.db-wal test.db-wal-summary
|
| sqlite3_wal db test.db
|
| }
|
|
|
| @@ -211,8 +211,8 @@ do_test wal-4.4.5 {
|
| execsql { SELECT count(*) FROM t2 }
|
| } {1}
|
| do_test wal-4.4.6 {
|
| - file copy -force test.db test2.db
|
| - file copy -force test.db-wal test2.db-wal
|
| + forcecopy test.db test2.db
|
| + forcecopy test.db-wal test2.db-wal
|
| sqlite3 db2 test2.db
|
| execsql { SELECT count(*) FROM t2 ; SELECT count(*) FROM t1 } db2
|
| } {1 2}
|
| @@ -269,8 +269,8 @@ do_test wal-4.5.5 {
|
| execsql { SELECT count(*) FROM t2 ; SELECT count(*) FROM t1 }
|
| } {1 2}
|
| do_test wal-4.5.6 {
|
| - file copy -force test.db test2.db
|
| - file copy -force test.db-wal test2.db-wal
|
| + forcecopy test.db test2.db
|
| + forcecopy test.db-wal test2.db-wal
|
| sqlite3 db2 test2.db
|
| execsql { SELECT count(*) FROM t2 ; SELECT count(*) FROM t1 } db2
|
| } {1 2}
|
| @@ -322,7 +322,7 @@ do_test wal-5.4 {
|
| INSERT INTO t3 VALUES('abc');
|
| }
|
| catchsql { INSERT INTO t3 VALUES('abc') }
|
| -} {1 {column x is not unique}}
|
| +} {1 {UNIQUE constraint failed: t3.x}}
|
| do_test wal-5.5 {
|
| execsql {
|
| COMMIT;
|
| @@ -334,7 +334,7 @@ db close
|
| foreach sector {512 4096} {
|
| sqlite3_simulate_device -sectorsize $sector
|
| foreach pgsz {512 1024 2048 4096} {
|
| - file delete -force test.db test.db-wal
|
| + forcedelete test.db test.db-wal
|
| do_test wal-6.$sector.$pgsz.1 {
|
| sqlite3 db test.db -vfs devsym
|
| execsql "
|
| @@ -357,7 +357,7 @@ foreach sector {512 4096} {
|
| }
|
|
|
| do_test wal-7.1 {
|
| - file delete -force test.db test.db-wal
|
| + forcedelete test.db test.db-wal
|
| sqlite3_wal db test.db
|
| execsql {
|
| PRAGMA page_size = 1024;
|
| @@ -377,7 +377,7 @@ do_test wal-7.2 {
|
| do_test wal-8.1 {
|
| reopen_db
|
| catch { db close }
|
| - file delete -force test.db test.db-wal
|
| + forcedelete test.db test.db-wal
|
|
|
| sqlite3 db test.db
|
| db function blob blob
|
| @@ -416,6 +416,7 @@ do_test wal-8.3 {
|
| do_test wal-9.1 {
|
| reopen_db
|
| execsql {
|
| + PRAGMA cache_size=2000;
|
| CREATE TABLE t1(x PRIMARY KEY);
|
| INSERT INTO t1 VALUES(blob(900));
|
| INSERT INTO t1 VALUES(blob(900));
|
| @@ -435,9 +436,9 @@ do_test wal-9.2 {
|
| } {ok}
|
|
|
| do_test wal-9.3 {
|
| - file delete -force test2.db test2.db-wal
|
| - file copy test.db test2.db
|
| - file copy test.db-wal test2.db-wal
|
| + forcedelete test2.db test2.db-wal
|
| + copy_file test.db test2.db
|
| + copy_file test.db-wal test2.db-wal
|
| sqlite3_wal db3 test2.db
|
| execsql {PRAGMA integrity_check } db3
|
| } {ok}
|
| @@ -545,7 +546,7 @@ do_multiclient_test tn {
|
| } {1 2 3 4 5 6 7 8 9 10}
|
| do_test wal-10.$tn.12 {
|
| catchsql { PRAGMA wal_checkpoint }
|
| - } {0 {0 13 13}} ;# Reader no longer block checkpoints
|
| + } {0 {0 7 7}} ;# Reader no longer block checkpoints
|
| do_test wal-10.$tn.13 {
|
| execsql { INSERT INTO t1 VALUES(11, 12) }
|
| sql2 {SELECT * FROM t1}
|
| @@ -555,7 +556,7 @@ do_multiclient_test tn {
|
| #
|
| do_test wal-10.$tn.14 {
|
| catchsql { PRAGMA wal_checkpoint }
|
| - } {0 {0 15 13}}
|
| + } {0 {0 8 7}}
|
|
|
| # The following series of test cases used to verify another blocking
|
| # case in WAL - a case which no longer blocks.
|
| @@ -565,10 +566,10 @@ do_multiclient_test tn {
|
| } {1 2 3 4 5 6 7 8 9 10 11 12}
|
| do_test wal-10.$tn.16 {
|
| catchsql { PRAGMA wal_checkpoint }
|
| - } {0 {0 15 15}}
|
| + } {0 {0 8 8}}
|
| do_test wal-10.$tn.17 {
|
| execsql { PRAGMA wal_checkpoint }
|
| - } {0 15 15}
|
| + } {0 8 8}
|
| do_test wal-10.$tn.18 {
|
| sql3 { BEGIN; SELECT * FROM t1 }
|
| } {1 2 3 4 5 6 7 8 9 10 11 12}
|
| @@ -591,13 +592,13 @@ do_multiclient_test tn {
|
| #
|
| do_test wal-10.$tn.23 {
|
| execsql { PRAGMA wal_checkpoint }
|
| - } {0 17 17}
|
| + } {0 9 9}
|
| do_test wal-10.$tn.24 {
|
| sql2 { BEGIN; SELECT * FROM t1; }
|
| } {1 2 3 4 5 6 7 8 9 10 11 12 13 14}
|
| do_test wal-10.$tn.25 {
|
| execsql { PRAGMA wal_checkpoint }
|
| - } {0 17 17}
|
| + } {0 9 9}
|
| do_test wal-10.$tn.26 {
|
| catchsql { INSERT INTO t1 VALUES(15, 16) }
|
| } {0 {}}
|
| @@ -614,11 +615,11 @@ do_multiclient_test tn {
|
| do_test wal-10.$tn.29 {
|
| execsql { INSERT INTO t1 VALUES(19, 20) }
|
| catchsql { PRAGMA wal_checkpoint }
|
| - } {0 {0 6 0}}
|
| + } {0 {0 3 0}}
|
| do_test wal-10.$tn.30 {
|
| code3 { sqlite3_finalize $::STMT }
|
| execsql { PRAGMA wal_checkpoint }
|
| - } {0 6 0}
|
| + } {0 3 0}
|
|
|
| # At one point, if a reader failed to upgrade to a writer because it
|
| # was reading an old snapshot, the write-locks were not being released.
|
| @@ -657,7 +658,7 @@ do_multiclient_test tn {
|
| } {a b c d}
|
| do_test wal-10.$tn.36 {
|
| catchsql { PRAGMA wal_checkpoint }
|
| - } {0 {0 16 16}}
|
| + } {0 {0 8 8}}
|
| do_test wal-10.$tn.36 {
|
| sql3 { INSERT INTO t1 VALUES('e', 'f') }
|
| sql2 { SELECT * FROM t1 }
|
| @@ -665,7 +666,7 @@ do_multiclient_test tn {
|
| do_test wal-10.$tn.37 {
|
| sql2 COMMIT
|
| execsql { PRAGMA wal_checkpoint }
|
| - } {0 18 18}
|
| + } {0 9 9}
|
| }
|
|
|
| #-------------------------------------------------------------------------
|
| @@ -726,6 +727,9 @@ do_test wal-11.9 {
|
| list [expr [file size test.db]/1024] [log_deleted test.db-wal]
|
| } {37 1}
|
| sqlite3_wal db test.db
|
| +set nWal 39
|
| +if {[permutation]!="mmap"} {set nWal 37}
|
| +ifcapable !mmap {set nWal 37}
|
| do_test wal-11.10 {
|
| execsql {
|
| PRAGMA cache_size = 10;
|
| @@ -734,7 +738,7 @@ do_test wal-11.10 {
|
| SELECT count(*) FROM t1;
|
| }
|
| list [expr [file size test.db]/1024] [file size test.db-wal]
|
| -} [list 37 [wal_file_size 37 1024]]
|
| +} [list 37 [wal_file_size $nWal 1024]]
|
| do_test wal-11.11 {
|
| execsql {
|
| SELECT count(*) FROM t1;
|
| @@ -744,7 +748,7 @@ do_test wal-11.11 {
|
| } {32 16}
|
| do_test wal-11.12 {
|
| list [expr [file size test.db]/1024] [file size test.db-wal]
|
| -} [list 37 [wal_file_size 37 1024]]
|
| +} [list 37 [wal_file_size $nWal 1024]]
|
| do_test wal-11.13 {
|
| execsql {
|
| INSERT INTO t1 VALUES( blob(900) );
|
| @@ -754,7 +758,7 @@ do_test wal-11.13 {
|
| } {17 ok}
|
| do_test wal-11.14 {
|
| list [expr [file size test.db]/1024] [file size test.db-wal]
|
| -} [list 37 [wal_file_size 37 1024]]
|
| +} [list 37 [wal_file_size $nWal 1024]]
|
|
|
|
|
| #-------------------------------------------------------------------------
|
| @@ -786,8 +790,8 @@ do_test wal-12.3 {
|
| list [expr [file size test.db]/1024] [expr [file size test.db-wal]/1044]
|
| } {3 2}
|
| do_test wal-12.4 {
|
| - file copy -force test.db test2.db
|
| - file copy -force test.db-wal test2.db-wal
|
| + forcecopy test.db test2.db
|
| + forcecopy test.db-wal test2.db-wal
|
| sqlite3_wal db2 test2.db
|
| execsql { SELECT * FROM t2 } db2
|
| } {B 1}
|
| @@ -804,8 +808,8 @@ do_test wal-12.5 {
|
| execsql { SELECT * FROM t2 }
|
| } {B 2}
|
| do_test wal-12.6 {
|
| - file copy -force test.db test2.db
|
| - file copy -force test.db-wal test2.db-wal
|
| + forcecopy test.db test2.db
|
| + forcecopy test.db-wal test2.db-wal
|
| sqlite3_wal db2 test2.db
|
| execsql { SELECT * FROM t2 } db2
|
| } {B 2}
|
| @@ -848,7 +852,6 @@ do_test wal-13.1.2 {
|
| sqlite3 db test.db
|
| execsql { SELECT * FROM t2 }
|
| } {B 2}
|
| -breakpoint
|
| do_test wal-13.1.3 {
|
| db close
|
| file exists test.db-wal
|
| @@ -909,7 +912,7 @@ do_multiclient_test tn {
|
| catch { db close }
|
| catch { db2 close }
|
| catch { db3 close }
|
| -file delete -force test.db test.db-wal
|
| +forcedelete test.db test.db-wal
|
| sqlite3 db test.db
|
| sqlite3 db2 test.db
|
| do_test wal-14 {
|
| @@ -947,7 +950,7 @@ catch { db2 close }
|
| # The following block of tests - wal-15.* - focus on testing the
|
| # implementation of the sqlite3_wal_checkpoint() interface.
|
| #
|
| -file delete -force test.db test.db-wal
|
| +forcedelete test.db test.db-wal
|
| sqlite3 db test.db
|
| do_test wal-15.1 {
|
| execsql {
|
| @@ -1039,12 +1042,12 @@ foreach {tn ckpt_cmd ckpt_res ckpt_main ckpt_aux} {
|
| 5 {sqlite3_wal_checkpoint db aux} SQLITE_OK 0 1
|
| 6 {sqlite3_wal_checkpoint db temp} SQLITE_OK 0 0
|
| 7 {db eval "PRAGMA main.wal_checkpoint"} {0 10 10} 1 0
|
| - 8 {db eval "PRAGMA aux.wal_checkpoint"} {0 16 16} 0 1
|
| + 8 {db eval "PRAGMA aux.wal_checkpoint"} {0 13 13} 0 1
|
| 9 {db eval "PRAGMA temp.wal_checkpoint"} {0 -1 -1} 0 0
|
| } {
|
| do_test wal-16.$tn.1 {
|
| - file delete -force test2.db test2.db-wal test2.db-journal
|
| - file delete -force test.db test.db-wal test.db-journal
|
| + forcedelete test2.db test2.db-wal test2.db-journal
|
| + forcedelete test.db test.db-wal test.db-journal
|
|
|
| sqlite3 db test.db
|
| execsql {
|
| @@ -1053,7 +1056,8 @@ foreach {tn ckpt_cmd ckpt_res ckpt_main ckpt_aux} {
|
| PRAGMA aux.auto_vacuum = 0;
|
| PRAGMA main.journal_mode = WAL;
|
| PRAGMA aux.journal_mode = WAL;
|
| - PRAGMA synchronous = NORMAL;
|
| + PRAGMA main.synchronous = NORMAL;
|
| + PRAGMA aux.synchronous = NORMAL;
|
| }
|
| } {wal wal}
|
|
|
| @@ -1071,7 +1075,7 @@ foreach {tn ckpt_cmd ckpt_res ckpt_main ckpt_aux} {
|
| } [list [expr 1*1024] [wal_file_size 10 1024]]
|
| do_test wal-16.$tn.3 {
|
| list [file size test2.db] [file size test2.db-wal]
|
| - } [list [expr 1*1024] [wal_file_size 16 1024]]
|
| + } [list [expr 1*1024] [wal_file_size 13 1024]]
|
|
|
| do_test wal-16.$tn.4 [list eval $ckpt_cmd] $ckpt_res
|
|
|
| @@ -1081,7 +1085,7 @@ foreach {tn ckpt_cmd ckpt_res ckpt_main ckpt_aux} {
|
|
|
| do_test wal-16.$tn.6 {
|
| list [file size test2.db] [file size test2.db-wal]
|
| - } [list [expr ($ckpt_aux ? 7 : 1)*1024] [wal_file_size 16 1024]]
|
| + } [list [expr ($ckpt_aux ? 7 : 1)*1024] [wal_file_size 13 1024]]
|
|
|
| catch { db close }
|
| }
|
| @@ -1116,7 +1120,7 @@ foreach {tn sectorsize logsize} "
|
| 6 4096 [wal_file_size 176 512]
|
| 7 8192 [wal_file_size 184 512]
|
| " {
|
| - file delete -force test.db test.db-wal test.db-journal
|
| + forcedelete test.db test.db-wal test.db-journal
|
| sqlite3_simulate_device -sectorsize $sectorsize
|
| sqlite3 db test.db -vfs devsym
|
|
|
| @@ -1124,6 +1128,7 @@ foreach {tn sectorsize logsize} "
|
| execsql {
|
| PRAGMA auto_vacuum = 0;
|
| PRAGMA page_size = 512;
|
| + PRAGMA cache_size = -2000;
|
| PRAGMA journal_mode = WAL;
|
| PRAGMA synchronous = FULL;
|
| }
|
| @@ -1160,7 +1165,7 @@ sqlite3_test_control_pending_byte $old_pending_byte
|
| # wal-18.2.* When the page-size field that occurs at the start of a log
|
| # file is a power of 2 greater than 16384 or smaller than 512.
|
| #
|
| -file delete -force test.db test.db-wal test.db-journal
|
| +forcedelete test.db test.db-wal test.db-journal
|
| do_test wal-18.0 {
|
| sqlite3 db test.db
|
| execsql {
|
| @@ -1178,8 +1183,8 @@ do_test wal-18.0 {
|
| INSERT INTO t1 VALUES(5, 6); -- frames 5 and 6
|
| }
|
|
|
| - file copy -force test.db testX.db
|
| - file copy -force test.db-wal testX.db-wal
|
| + forcecopy test.db testX.db
|
| + forcecopy test.db-wal testX.db-wal
|
| db close
|
| list [file size testX.db] [file size testX.db-wal]
|
| } [list [expr 3*1024] [wal_file_size 6 1024]]
|
| @@ -1195,8 +1200,8 @@ foreach {nFrame result} {
|
| 6 {0 0 1 2 3 4 5 6}
|
| } {
|
| do_test wal-18.1.$nFrame {
|
| - file copy -force testX.db test.db
|
| - file copy -force testX.db-wal test.db-wal
|
| + forcecopy testX.db test.db
|
| + forcecopy testX.db-wal test.db-wal
|
|
|
| hexio_write test.db-wal [expr 24 + $nFrame*(24+1024) + 20] 00000000
|
|
|
| @@ -1220,10 +1225,11 @@ proc logcksum {ckv1 ckv2 blob} {
|
| upvar $ckv1 c1
|
| upvar $ckv2 c2
|
|
|
| - set scanpattern I*
|
| - if {$::tcl_platform(byteOrder) eq "littleEndian"} {
|
| - set scanpattern i*
|
| - }
|
| + # Since the magic number at the start of the -wal file header is
|
| + # 931071618 that indicates that the content should always be read as
|
| + # little-endian.
|
| + #
|
| + set scanpattern i*
|
|
|
| binary scan $blob $scanpattern values
|
| foreach {v1 v2} $values {
|
| @@ -1232,7 +1238,7 @@ proc logcksum {ckv1 ckv2 blob} {
|
| }
|
| }
|
|
|
| -file copy -force test.db testX.db
|
| +forcecopy test.db testX.db
|
| foreach {tn pgsz works} {
|
| 1 128 0
|
| 2 256 0
|
| @@ -1253,8 +1259,8 @@ foreach {tn pgsz works} {
|
| }
|
|
|
| for {set pg 1} {$pg <= 3} {incr pg} {
|
| - file copy -force testX.db test.db
|
| - file delete -force test.db-wal
|
| + forcecopy testX.db test.db
|
| + forcedelete test.db-wal
|
|
|
| # Check that the database now exists and consists of three pages. And
|
| # that there is no associated wal file.
|
| @@ -1321,7 +1327,7 @@ foreach {tn pgsz works} {
|
| # snapshot.
|
| #
|
| do_test wal-19.1 {
|
| - file delete -force test.db test.db-wal test.db-journal
|
| + forcedelete test.db test.db-wal test.db-journal
|
| sqlite3 db test.db
|
| sqlite3 db2 test.db
|
| execsql {
|
| @@ -1370,7 +1376,7 @@ do_test wal-19.4 {
|
| #
|
| do_test wal-20.1 {
|
| catch {db close}
|
| - file delete -force test.db test.db-wal test.db-journal
|
| + forcedelete test.db test.db-wal test.db-journal
|
| sqlite3 db test.db
|
| execsql {
|
| PRAGMA journal_mode = WAL;
|
| @@ -1474,9 +1480,13 @@ foreach pgsz {512 1024 2048 4096 8192 16384 32768 65536} {
|
| # Test that when 1 or more pages are recovered from a WAL file,
|
| # sqlite3_log() is invoked to report this to the user.
|
| #
|
| -set walfile [file nativename [file join [pwd] test.db-wal]]
|
| +ifcapable curdir {
|
| + set walfile [file nativename [file join [get_pwd] test.db-wal]]
|
| +} else {
|
| + set walfile test.db-wal
|
| +}
|
| catch {db close}
|
| -file delete -force test.db
|
| +forcedelete test.db
|
| do_test wal-23.1 {
|
| faultsim_delete_and_reopen
|
| execsql {
|
| @@ -1501,10 +1511,10 @@ do_test wal-23.3 {
|
| faultsim_restore_and_reopen
|
| execsql { SELECT * FROM t1 }
|
| } {1 2 3 4}
|
| -set nPage [expr 2+$AUTOVACUUM]
|
| do_test wal-23.4 {
|
| set ::log
|
| -} [list SQLITE_OK "Recovered $nPage frames from WAL file $walfile"]
|
| +} [list SQLITE_NOTICE_RECOVER_WAL \
|
| + "recovered 2 frames from WAL file $walfile"]
|
|
|
|
|
| ifcapable autovacuum {
|
| @@ -1550,9 +1560,13 @@ ifcapable autovacuum {
|
| }
|
| file size test.db
|
| } [expr 3 * 1024]
|
| +
|
| + # WAL file now contains a single frame - the new root page for table t1.
|
| + # It would be two frames (the new root page and a padding frame) if the
|
| + # ZERO_DAMAGE flag were not set.
|
| do_test 24.5 {
|
| file size test.db-wal
|
| - } 2128
|
| + } [wal_file_size 1 1024]
|
| }
|
|
|
| db close
|
| @@ -1560,4 +1574,17 @@ sqlite3_shutdown
|
| test_sqlite3_log
|
| sqlite3_initialize
|
|
|
| +# Make sure PRAGMA journal_mode=WAL works with ATTACHED databases in
|
| +# all journal modes.
|
| +#
|
| +foreach mode {OFF MEMORY PERSIST DELETE TRUNCATE WAL} {
|
| + delete_file test.db test2.db
|
| + sqlite3 db test.db
|
| + do_test wal-25.$mode {
|
| + db eval "PRAGMA journal_mode=$mode"
|
| + db eval {ATTACH 'test2.db' AS t2; PRAGMA journal_mode=WAL;}
|
| + } {wal}
|
| + db close
|
| +}
|
| +
|
| finish_test
|
|
|