Add a couple of extra coverage tests for wal.c.
FossilOrigin-Name: cfe60254df50f086014b115f1a2d9e31c85d67fd
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
C Add\sfurther\stest\scases\sfor\sthe\slogic\sin\ssqlite3WalBeginReadTransaction().
|
C Add\sa\scouple\sof\sextra\scoverage\stests\sfor\swal.c.
|
||||||
D 2010-06-05T19:18:59
|
D 2010-06-07T06:11:40
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
|
F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@@ -762,8 +762,8 @@ F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
|
|||||||
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
|
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
|
||||||
F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
|
F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
|
||||||
F test/wal.test bfec61450b47cdf09f7d2269f9e9967683b8b0fc
|
F test/wal.test bfec61450b47cdf09f7d2269f9e9967683b8b0fc
|
||||||
F test/wal2.test 743d9b86041e57ba986dd7e3891c67725f9e2b2b
|
F test/wal2.test f70bbe268891a70cc40dce659efe617e548c7491
|
||||||
F test/wal3.test b82ac8268bac644d1d928d25316e5e7696ec47bf
|
F test/wal3.test 887737b05f0aa37962182bf8c5e86f7342e1d386
|
||||||
F test/wal_common.tcl 3e953ae60919281688ea73e4d0aa0e1bc94becd9
|
F test/wal_common.tcl 3e953ae60919281688ea73e4d0aa0e1bc94becd9
|
||||||
F test/walbak.test e7650a26eb4b8abeca9b145b1af1e63026dde432
|
F test/walbak.test e7650a26eb4b8abeca9b145b1af1e63026dde432
|
||||||
F test/walcksum.test 4efa8fb88c32bed8288ea4385a9cc113a5c8f0bf
|
F test/walcksum.test 4efa8fb88c32bed8288ea4385a9cc113a5c8f0bf
|
||||||
@@ -817,7 +817,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P c041c6a9786bc9ebb82527f7a2c96d255aec927f
|
P a49713db39d0d6940b368206d4e669aa69aa1fe5
|
||||||
R b34f0ea46ed4ddc81ab394ae4b47f8c2
|
R 2237cb7054d794b2f2b9d3b4c056e5fd
|
||||||
U dan
|
U dan
|
||||||
Z b9b05ea832538d97e39aa0947439a601
|
Z 13a82a94e40f48f124ae3e9a80db14d5
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
a49713db39d0d6940b368206d4e669aa69aa1fe5
|
cfe60254df50f086014b115f1a2d9e31c85d67fd
|
||||||
+37
-34
@@ -24,16 +24,20 @@ proc set_tvfs_hdr {file args} {
|
|||||||
set nHdr 40
|
set nHdr 40
|
||||||
set nInt [expr {$nHdr/4}]
|
set nInt [expr {$nHdr/4}]
|
||||||
|
|
||||||
if {[llength $args]>1} {
|
if {[llength $args]>2} {
|
||||||
return -code error {wrong # args: should be "set_tvfs_hdr fileName ?val?"}
|
error {wrong # args: should be "set_tvfs_hdr fileName ?val1? ?val2?"}
|
||||||
}
|
}
|
||||||
|
|
||||||
set blob [tvfs shm $file]
|
set blob [tvfs shm $file]
|
||||||
|
|
||||||
if {[llength $args]} {
|
if {[llength $args]} {
|
||||||
set ia [lindex $args 0]
|
set ia [lindex $args 0]
|
||||||
|
set ib $ia
|
||||||
|
if {[llength $args]==2} {
|
||||||
|
set ib [lindex $args 1]
|
||||||
|
}
|
||||||
binary scan $blob a[expr $nHdr*2]a* dummy tail
|
binary scan $blob a[expr $nHdr*2]a* dummy tail
|
||||||
set blob [binary format i${nInt}i${nInt}a* $ia $ia $tail]
|
set blob [binary format i${nInt}i${nInt}a* $ia $ib $tail]
|
||||||
tvfs shm $file $blob
|
tvfs shm $file $blob
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -844,8 +848,8 @@ db close
|
|||||||
# of the wal-index header in the wal-index do not match, the client
|
# of the wal-index header in the wal-index do not match, the client
|
||||||
# runs (or at least tries to run) database recovery.
|
# runs (or at least tries to run) database recovery.
|
||||||
#
|
#
|
||||||
|
#
|
||||||
proc get_name {method args} { set ::filename [lindex $args 0] }
|
proc get_name {method args} { set ::filename [lindex $args 0] ; tvfs filter {} }
|
||||||
testvfs tvfs
|
testvfs tvfs
|
||||||
tvfs script get_name
|
tvfs script get_name
|
||||||
tvfs filter xShmOpen
|
tvfs filter xShmOpen
|
||||||
@@ -859,40 +863,39 @@ do_test wal2-9.1 {
|
|||||||
INSERT INTO x VALUES('Barton');
|
INSERT INTO x VALUES('Barton');
|
||||||
INSERT INTO x VALUES('Deakin');
|
INSERT INTO x VALUES('Deakin');
|
||||||
}
|
}
|
||||||
set wal_index_hdr1 [string range [tvfs shm $::filename] 0 39]
|
|
||||||
|
# Set $wih(1) to the contents of the wal-index header after
|
||||||
|
# the frames associated with the first two rows in table 'x' have
|
||||||
|
# been inserted. Then insert one more row and set $wih(2)
|
||||||
|
# to the new value of the wal-index header.
|
||||||
|
#
|
||||||
|
# If the $wih(1) is written into the wal-index before running
|
||||||
|
# a read operation, the client will see only the first two rows. If
|
||||||
|
# $wih(2) is written into the wal-index, the client will see
|
||||||
|
# three rows. If an invalid header is written into the wal-index, then
|
||||||
|
# the client will run recovery and see three rows.
|
||||||
|
#
|
||||||
|
set wih(1) [set_tvfs_hdr $::filename]
|
||||||
execsql { INSERT INTO x VALUES('Watson') }
|
execsql { INSERT INTO x VALUES('Watson') }
|
||||||
} {}
|
set wih(2) [set_tvfs_hdr $::filename]
|
||||||
do_test wal2-9.2 {
|
|
||||||
sqlite3 db2 test.db -vfs tvfs
|
sqlite3 db2 test.db -vfs tvfs
|
||||||
execsql { SELECT * FROM x } db2
|
execsql { SELECT * FROM x } db2
|
||||||
} {Barton Deakin Watson}
|
} {Barton Deakin Watson}
|
||||||
do_test wal2-9.3 {
|
|
||||||
set wal_index_hdr2 [string range [tvfs shm $::filename] 0 39]
|
foreach {tn hdr1 hdr2 res} [list \
|
||||||
set content [string range [tvfs shm $::filename] 80 end]
|
3 $wih(1) $wih(1) {Barton Deakin} \
|
||||||
set w [binary format a*a*a* $wal_index_hdr1 $wal_index_hdr1 $content]
|
4 $wih(1) $wih(2) {Barton Deakin Watson} \
|
||||||
tvfs shm $::filename $w
|
5 $wih(2) $wih(1) {Barton Deakin Watson} \
|
||||||
|
6 $wih(2) $wih(2) {Barton Deakin Watson} \
|
||||||
|
7 $wih(1) $wih(1) {Barton Deakin} \
|
||||||
|
8 {0 0 0 0 0 0 0 0 0 0} {0 0 0 0 0 0 0 0 0 0} {Barton Deakin Watson} \
|
||||||
|
] {
|
||||||
|
do_test wal2-9.$tn {
|
||||||
|
set_tvfs_hdr $::filename $hdr1 $hdr2
|
||||||
execsql { SELECT * FROM x } db2
|
execsql { SELECT * FROM x } db2
|
||||||
} {Barton Deakin}
|
} $res
|
||||||
do_test wal2-9.4 {
|
}
|
||||||
set w [binary format a*a*a* $wal_index_hdr2 $wal_index_hdr2 $content]
|
|
||||||
tvfs shm $::filename $w
|
|
||||||
execsql { SELECT * FROM x } db2
|
|
||||||
} {Barton Deakin Watson}
|
|
||||||
do_test wal2-9.5 {
|
|
||||||
set w [binary format a*a*a* $wal_index_hdr1 $wal_index_hdr2 $content]
|
|
||||||
tvfs shm $::filename $w
|
|
||||||
execsql { SELECT * FROM x } db2
|
|
||||||
} {Barton Deakin Watson}
|
|
||||||
do_test wal2-9.6 {
|
|
||||||
set w [binary format a*a*a* $wal_index_hdr2 $wal_index_hdr1 $content]
|
|
||||||
tvfs shm $::filename $w
|
|
||||||
execsql { SELECT * FROM x } db2
|
|
||||||
} {Barton Deakin Watson}
|
|
||||||
do_test wal2-9.7 {
|
|
||||||
set w [binary format a*a*a* $wal_index_hdr1 $wal_index_hdr1 $content]
|
|
||||||
tvfs shm $::filename $w
|
|
||||||
execsql { SELECT * FROM x } db2
|
|
||||||
} {Barton Deakin}
|
|
||||||
|
|
||||||
db2 close
|
db2 close
|
||||||
db close
|
db close
|
||||||
|
|||||||
+131
@@ -635,5 +635,136 @@ db close
|
|||||||
db2 close
|
db2 close
|
||||||
T delete
|
T delete
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
do_test wal3-8.1 {
|
||||||
|
file delete -force test.db test.db-journal test.db wal
|
||||||
|
sqlite3 db test.db
|
||||||
|
sqlite3 db2 test.db
|
||||||
|
execsql {
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
CREATE TABLE b(c);
|
||||||
|
INSERT INTO b VALUES('Tehran');
|
||||||
|
INSERT INTO b VALUES('Qom');
|
||||||
|
INSERT INTO b VALUES('Markazi');
|
||||||
|
PRAGMA wal_checkpoint;
|
||||||
|
}
|
||||||
|
} {wal}
|
||||||
|
do_test wal3-8.2 {
|
||||||
|
execsql { SELECT * FROM b }
|
||||||
|
} {Tehran Qom Markazi}
|
||||||
|
do_test wal3-8.3 {
|
||||||
|
db eval { SELECT * FROM b } {
|
||||||
|
db eval { INSERT INTO b VALUES('Qazvin') }
|
||||||
|
set r [db2 eval { SELECT * FROM b }]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
set r
|
||||||
|
} {Tehran Qom Markazi Qazvin}
|
||||||
|
do_test wal3-8.4 {
|
||||||
|
execsql {
|
||||||
|
INSERT INTO b VALUES('Gilan');
|
||||||
|
INSERT INTO b VALUES('Ardabil');
|
||||||
|
}
|
||||||
|
} {}
|
||||||
|
db2 close
|
||||||
|
|
||||||
|
faultsim_save_and_close
|
||||||
|
testvfs T -default 1
|
||||||
|
faultsim_restore_and_reopen
|
||||||
|
T filter xShmLock
|
||||||
|
T script lock_callback
|
||||||
|
|
||||||
|
proc lock_callback {method file handle spec} {
|
||||||
|
if {$spec == "4 1 unlock exclusive"} {
|
||||||
|
T filter {}
|
||||||
|
set ::r [catchsql { SELECT * FROM b } db2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlite3 db test.db
|
||||||
|
sqlite3 db2 test.db
|
||||||
|
do_test wal3-8.5 {
|
||||||
|
execsql { SELECT * FROM b }
|
||||||
|
} {Tehran Qom Markazi Qazvin Gilan Ardabil}
|
||||||
|
do_test wal3-8.6 {
|
||||||
|
set ::r
|
||||||
|
} {1 {locking protocol}}
|
||||||
|
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
|
||||||
|
faultsim_restore_and_reopen
|
||||||
|
sqlite3 db2 test.db
|
||||||
|
T filter xShmLock
|
||||||
|
T script lock_callback
|
||||||
|
proc lock_callback {method file handle spec} {
|
||||||
|
if {$spec == "1 7 unlock exclusive"} {
|
||||||
|
T filter {}
|
||||||
|
set ::r [catchsql { SELECT * FROM b } db2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset ::r
|
||||||
|
do_test wal3-8.5 {
|
||||||
|
execsql { SELECT * FROM b }
|
||||||
|
} {Tehran Qom Markazi Qazvin Gilan Ardabil}
|
||||||
|
do_test wal3-8.6 {
|
||||||
|
set ::r
|
||||||
|
} {1 {locking protocol}}
|
||||||
|
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
T delete
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
# When a connection opens a read-lock on the database, it searches for
|
||||||
|
# an aReadMark[] slot that is already set to the mxFrame value for the
|
||||||
|
# new transaction. If it cannot find one, it attempts to obtain an
|
||||||
|
# exclusive lock on an aReadMark[] slot for the purposes of modifying
|
||||||
|
# the value, then drops back to a shared-lock for the duration of the
|
||||||
|
# transaction.
|
||||||
|
#
|
||||||
|
# This test case verifies that if an exclusive lock cannot be obtained
|
||||||
|
# on any aReadMark[] slot (because there are already several readers),
|
||||||
|
# the client takes a shared-lock on a slot without modifying the value
|
||||||
|
# and continues.
|
||||||
|
#
|
||||||
|
do_test wal3-9.0 {
|
||||||
|
file delete -force test.db test.db-journal test.db wal
|
||||||
|
sqlite3 db test.db
|
||||||
|
execsql {
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
CREATE TABLE whoami(x);
|
||||||
|
INSERT INTO whoami VALUES('nobody');
|
||||||
|
}
|
||||||
|
} {wal}
|
||||||
|
for {set i 0} {$i < 50} {incr i} {
|
||||||
|
set c db$i
|
||||||
|
do_test wal3-9.1.$i {
|
||||||
|
sqlite3 $c test.db
|
||||||
|
execsql { UPDATE whoami SET x = $c }
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM whoami
|
||||||
|
} $c
|
||||||
|
} $c
|
||||||
|
}
|
||||||
|
for {set i 0} {$i < 50} {incr i} {
|
||||||
|
set c db$i
|
||||||
|
do_test wal3-9.2.$i {
|
||||||
|
execsql { SELECT * FROM whoami } $c
|
||||||
|
} $c
|
||||||
|
}
|
||||||
|
do_test wal3-9.3 {
|
||||||
|
for {set i 0} {$i < 49} {incr i} { db$i close }
|
||||||
|
execsql { PRAGMA wal_checkpoint }
|
||||||
|
set sz1 [file size test.db]
|
||||||
|
db49 close
|
||||||
|
execsql { PRAGMA wal_checkpoint }
|
||||||
|
set sz2 [file size test.db]
|
||||||
|
expr {$sz2 > $sz1}
|
||||||
|
} {1}
|
||||||
|
|
||||||
|
db close
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user