Index: third_party/sqlite/src/test/wal2.test |
diff --git a/third_party/sqlite/src/test/wal2.test b/third_party/sqlite/src/test/wal2.test |
index 82234330fadcd12baec9acb9eeb7b64f5d30a53e..9d45444d6a4b5d0d3afaae0f8adc4683686b43b1 100644 |
--- a/third_party/sqlite/src/test/wal2.test |
+++ b/third_party/sqlite/src/test/wal2.test |
@@ -23,6 +23,18 @@ set testprefix wal2 |
ifcapable !wal {finish_test ; return } |
+set sqlite_sync_count 0 |
+proc cond_incr_sync_count {adj} { |
+ global sqlite_sync_count |
+ if {$::tcl_platform(platform) == "windows"} { |
+ incr sqlite_sync_count $adj |
+ } { |
+ ifcapable !dirsync { |
+ incr sqlite_sync_count $adj |
+ } |
+ } |
+} |
+ |
proc set_tvfs_hdr {file args} { |
# Set $nHdr to the number of bytes in the wal-index header: |
@@ -34,6 +46,7 @@ proc set_tvfs_hdr {file args} { |
} |
set blob [tvfs shm $file] |
+ if {$::tcl_platform(byteOrder)=="bigEndian"} {set fmt I} {set fmt i} |
if {[llength $args]} { |
set ia [lindex $args 0] |
@@ -42,11 +55,11 @@ proc set_tvfs_hdr {file args} { |
set ib [lindex $args 1] |
} |
binary scan $blob a[expr $nHdr*2]a* dummy tail |
- set blob [binary format i${nInt}i${nInt}a* $ia $ib $tail] |
+ set blob [binary format ${fmt}${nInt}${fmt}${nInt}a* $ia $ib $tail] |
tvfs shm $file $blob |
} |
- binary scan $blob i${nInt} ints |
+ binary scan $blob ${fmt}${nInt} ints |
return $ints |
} |
@@ -73,7 +86,7 @@ proc incr_tvfs_hdr {file idx incrval} { |
# |
# 2. Attempt to read the database using the reader. Before the reader |
# has a chance to snapshot the wal-index header, increment one |
-# of the the integer fields (so that the reader ends up with a corrupted |
+# of the integer fields (so that the reader ends up with a corrupted |
# header). |
# |
# 3. Check that the reader recovers the wal-index and reads the correct |
@@ -113,9 +126,11 @@ set RECOVER [list \ |
{1 7 unlock exclusive} {0 1 unlock exclusive} \ |
] |
set READ [list \ |
- {4 1 lock exclusive} {4 1 unlock exclusive} \ |
{4 1 lock shared} {4 1 unlock shared} \ |
] |
+set INITSLOT [list \ |
+ {4 1 lock exclusive} {4 1 unlock exclusive} \ |
+] |
foreach {tn iInsert res wal_index_hdr_mod wal_locks} " |
2 5 {5 15} 0 {$RECOVER $READ} |
@@ -128,7 +143,7 @@ foreach {tn iInsert res wal_index_hdr_mod wal_locks} " |
9 12 {12 78} 7 {$RECOVER $READ} |
10 13 {13 91} 8 {$RECOVER $READ} |
11 14 {14 105} 9 {$RECOVER $READ} |
- 12 15 {15 120} -1 {$READ} |
+ 12 15 {15 120} -1 {$INITSLOT $READ} |
" { |
do_test wal2-1.$tn.1 { |
@@ -152,7 +167,7 @@ foreach {tn iInsert res wal_index_hdr_mod wal_locks} " |
db close |
db2 close |
tvfs delete |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
#------------------------------------------------------------------------- |
# This test case is very similar to the previous one, except, after |
@@ -259,7 +274,7 @@ foreach {tn iInsert res0 res1 wal_index_hdr_mod} { |
db close |
db2 close |
tvfs delete |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
if 0 { |
@@ -332,7 +347,7 @@ do_test wal2-3.5 { |
} {0 0} |
db close |
tvfs delete |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
} |
@@ -349,7 +364,9 @@ do_test wal2-4.1 { |
INSERT INTO data VALUES('need xShmOpen to see this'); |
PRAGMA wal_checkpoint; |
} |
-} {wal 0 5 5} |
+ # Three pages in the WAL file at this point: One copy of page 1 and two |
+ # of the root page for table "data". |
+} {wal 0 3 3} |
do_test wal2-4.2 { |
db close |
testvfs tvfs -noshm 1 |
@@ -429,7 +446,7 @@ tvfs delete |
# connection silently remains in exclusive mode. |
# |
do_test wal2-6.1.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 |
execsql { |
Pragma Journal_Mode = Wal; |
@@ -472,7 +489,7 @@ do_test wal2-6.1.6 { |
db close |
do_test wal2-6.2.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 |
execsql { |
Pragma Locking_Mode = Exclusive; |
@@ -540,7 +557,7 @@ do_test wal2-6.2.9 { |
db close |
do_test wal2-6.3.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 |
execsql { |
PRAGMA journal_mode = WAL; |
@@ -585,7 +602,7 @@ db close |
# as expected when a WAL database is used with locking_mode=exclusive. |
# |
do_test wal2-6.4.1 { |
- file delete -force test.db test.db-wal test.db-journal |
+ forcedelete test.db test.db-wal test.db-journal |
proc tvfs_cb {method args} { |
set ::shm_file [lindex $args 0] |
if {$method == "xShmLock"} { lappend ::locks [lindex $args 2] } |
@@ -594,6 +611,7 @@ do_test wal2-6.4.1 { |
testvfs tvfs |
tvfs script tvfs_cb |
sqlite3 db test.db -vfs tvfs |
+ set {} {} |
} {} |
set RECOVERY { |
@@ -717,7 +735,7 @@ do_test wal2-6.5.1 { |
INSERT INTO t2 VALUES('I', 'II'); |
PRAGMA journal_mode; |
} |
-} {wal exclusive 0 3 3 wal} |
+} {wal exclusive 0 2 2 wal} |
do_test wal2-6.5.2 { |
execsql { |
PRAGMA locking_mode = normal; |
@@ -728,7 +746,7 @@ do_test wal2-6.5.2 { |
} {normal exclusive I II III IV} |
do_test wal2-6.5.3 { |
execsql { PRAGMA wal_checkpoint } |
-} {0 4 4} |
+} {0 2 2} |
db close |
proc lock_control {method filename handle spec} { |
@@ -780,7 +798,7 @@ T delete |
# Test a theory about the checksum algorithm. Theory was false and this |
# test did not provoke a bug. |
# |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
do_test wal2-7.1.1 { |
sqlite3 db test.db |
execsql { |
@@ -791,9 +809,15 @@ do_test wal2-7.1.1 { |
file size test.db |
} {4096} |
do_test wal2-7.1.2 { |
- file copy -force test.db test2.db |
- file copy -force test.db-wal test2.db-wal |
- hexio_write test2.db-wal 48 FF |
+ forcecopy test.db test2.db |
+ forcecopy test.db-wal test2.db-wal |
+ # The first 32 bytes of the WAL file contain the WAL header. Offset 48 |
+ # is the first byte of the checksum for the first frame in the WAL. |
+ # The following three lines replaces the contents of that byte with |
+ # a different value. |
+ set newval FF |
+ if {$newval == [hexio_read test2.db-wal 48 1]} { set newval 00 } |
+ hexio_write test2.db-wal 48 $newval |
} {1} |
do_test wal2-7.1.3 { |
sqlite3 db2 test2.db |
@@ -802,7 +826,7 @@ do_test wal2-7.1.3 { |
} {} |
db close |
db2 close |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
do_test wal2-8.1.2 { |
sqlite3 db test.db |
execsql { |
@@ -858,7 +882,7 @@ testvfs tvfs |
tvfs script get_name |
tvfs filter xShmOpen |
-file delete -force test.db test.db-wal test.db-journal |
+forcedelete test.db test.db-wal test.db-journal |
do_test wal2-9.1 { |
sqlite3 db test.db -vfs tvfs |
execsql { |
@@ -1027,7 +1051,10 @@ tvfs delete |
# |
if {$::tcl_platform(platform) == "unix"} { |
faultsim_delete_and_reopen |
- set umask [exec /bin/sh -c umask] |
+ # Changed on 2012-02-13: umask is deliberately ignored for -wal files. |
+ #set umask [exec /bin/sh -c umask] |
+ set umask 0 |
+ |
do_test wal2-12.1 { |
sqlite3 db test.db |
@@ -1163,14 +1190,15 @@ if {$::tcl_platform(platform) == "unix"} { |
# Test that "PRAGMA checkpoint_fullsync" appears to be working. |
# |
foreach {tn sql reslist} { |
- 1 { } {8 0 3 0 5 0} |
- 2 { PRAGMA checkpoint_fullfsync = 1 } {8 4 3 2 5 2} |
- 3 { PRAGMA checkpoint_fullfsync = 0 } {8 0 3 0 5 0} |
+ 1 { } {10 0 4 0 6 0} |
+ 2 { PRAGMA checkpoint_fullfsync = 1 } {10 4 4 2 6 2} |
+ 3 { PRAGMA checkpoint_fullfsync = 0 } {10 0 4 0 6 0} |
} { |
faultsim_delete_and_reopen |
execsql {PRAGMA auto_vacuum = 0} |
execsql $sql |
+ do_execsql_test wal2-14.$tn.0 { PRAGMA page_size = 4096 } {} |
do_execsql_test wal2-14.$tn.1 { PRAGMA journal_mode = WAL } {wal} |
set sqlite_sync_count 0 |
@@ -1179,16 +1207,17 @@ foreach {tn sql reslist} { |
do_execsql_test wal2-14.$tn.2 { |
PRAGMA wal_autocheckpoint = 10; |
CREATE TABLE t1(a, b); -- 2 wal syncs |
- INSERT INTO t1 VALUES(1, 2); -- 1 wal sync |
+ INSERT INTO t1 VALUES(1, 2); -- 2 wal sync |
PRAGMA wal_checkpoint; -- 1 wal sync, 1 db sync |
BEGIN; |
INSERT INTO t1 VALUES(3, 4); |
INSERT INTO t1 VALUES(5, 6); |
- COMMIT; -- 1 wal sync |
+ COMMIT; -- 2 wal sync |
PRAGMA wal_checkpoint; -- 1 wal sync, 1 db sync |
- } {10 0 5 5 0 2 2} |
+ } {10 0 3 3 0 1 1} |
do_test wal2-14.$tn.3 { |
+ cond_incr_sync_count 1 |
list $sqlite_sync_count $sqlite_fullsync_count |
} [lrange $reslist 0 1] |
@@ -1219,22 +1248,22 @@ catch { db close } |
# PRAGMA fullfsync |
# PRAGMA synchronous |
# |
-foreach {tn settings commit_sync ckpt_sync} { |
- 1 {0 0 off} {0 0} {0 0} |
- 2 {0 0 normal} {0 0} {2 0} |
- 3 {0 0 full} {1 0} {2 0} |
- |
- 4 {0 1 off} {0 0} {0 0} |
- 5 {0 1 normal} {0 0} {0 2} |
- 6 {0 1 full} {0 1} {0 2} |
- |
- 7 {1 0 off} {0 0} {0 0} |
- 8 {1 0 normal} {0 0} {0 2} |
- 9 {1 0 full} {1 0} {0 2} |
- |
- 10 {1 1 off} {0 0} {0 0} |
- 11 {1 1 normal} {0 0} {0 2} |
- 12 {1 1 full} {0 1} {0 2} |
+foreach {tn settings restart_sync commit_sync ckpt_sync} { |
+ 1 {0 0 off} {0 0} {0 0} {0 0} |
+ 2 {0 0 normal} {1 0} {0 0} {2 0} |
+ 3 {0 0 full} {2 0} {1 0} {2 0} |
+ |
+ 4 {0 1 off} {0 0} {0 0} {0 0} |
+ 5 {0 1 normal} {0 1} {0 0} {0 2} |
+ 6 {0 1 full} {0 2} {0 1} {0 2} |
+ |
+ 7 {1 0 off} {0 0} {0 0} {0 0} |
+ 8 {1 0 normal} {1 0} {0 0} {0 2} |
+ 9 {1 0 full} {2 0} {1 0} {0 2} |
+ |
+ 10 {1 1 off} {0 0} {0 0} {0 0} |
+ 11 {1 1 normal} {0 1} {0 0} {0 2} |
+ 12 {1 1 full} {0 2} {0 1} {0 2} |
} { |
forcedelete test.db |
@@ -1247,30 +1276,39 @@ foreach {tn settings commit_sync ckpt_sync} { |
sqlite3 db test.db |
do_execsql_test 15.$tn.1 " |
+ PRAGMA page_size = 4096; |
CREATE TABLE t1(x); |
+ PRAGMA wal_autocheckpoint = OFF; |
PRAGMA journal_mode = WAL; |
PRAGMA checkpoint_fullfsync = [lindex $settings 0]; |
PRAGMA fullfsync = [lindex $settings 1]; |
PRAGMA synchronous = [lindex $settings 2]; |
- " {wal} |
+ " {0 wal} |
do_test 15.$tn.2 { |
set sync(normal) 0 |
set sync(full) 0 |
execsql { INSERT INTO t1 VALUES('abc') } |
list $::sync(normal) $::sync(full) |
- } $commit_sync |
+ } $restart_sync |
do_test 15.$tn.3 { |
set sync(normal) 0 |
set sync(full) 0 |
- execsql { INSERT INTO t1 VALUES('def') } |
+ execsql { INSERT INTO t1 VALUES('abc') } |
list $::sync(normal) $::sync(full) |
} $commit_sync |
do_test 15.$tn.4 { |
set sync(normal) 0 |
set sync(full) 0 |
+ execsql { INSERT INTO t1 VALUES('def') } |
+ list $::sync(normal) $::sync(full) |
+ } $commit_sync |
+ |
+ do_test 15.$tn.5 { |
+ set sync(normal) 0 |
+ set sync(full) 0 |
execsql { PRAGMA wal_checkpoint } |
list $::sync(normal) $::sync(full) |
} $ckpt_sync |