-C Add\sfurther\stests\sfor\swal2\smode.
-D 2018-12-14T19:53:39.654
+C Further\stest\scases\sfor\swal2\smode.
+D 2018-12-15T20:20:13.338
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c
F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2
F src/test_fs.c 35a2f7dd8a915900873386331386d9ba1ae1b5026d74fd20c2807bc76221f291
F src/test_func.c d12d805953bcb3bb19f71d29cdc93383b7b7a3369504d2b7e398a1bd77376294
-F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d
+F src/test_hexio.c 1a70ba996c8c8c028469b428ceca0d2c9c84fae68589984022ed3fc6e706eaf7
F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664
F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71
F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7
F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 1deb1d320b5de56407172ac21577d2bbf5c6ea52dcc0f5315a8d926d4839146e
+F src/wal.c beca1487f7cecd1d6a965ba899a5a6b8868b3eb80580d33b2a73f8e37ab4901b
F src/wal.h d2a69695c84137f76e19a247a342cb02ab0131001b6f58153d94b71195bbd84d
F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e
F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
-F test/permutations.test f97a5613430a62ef5fb5aafeb37d4e857dea44e47c31064f154c7049c25b292b
+F test/permutations.test c7090c0136224e2ca400f1e0a085dad13a4f40a03387881e26f1a4cd1344d557
F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30
F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867
F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477
F test/wal2.test 155b9efa999bdb38ce1cd729b9a4fcdbffd6b88be27f039bad1d2929d287d918
F test/wal2big.test 0b4ec526f9ca4bbabc355042c38045ae2e253fb46eb327bb7693d0122bc6968b
-F test/wal2recover.test 64155a1f13ac434ebb374f109b9daa2b52c3ca69db9199be0bcbabb9727cae4e
+F test/wal2lock.test 0ef98d72dc6bcf7711dedd684760488400d9a9a6eec0dc5d3822060437793552
+F test/wal2recover.test da390d40c955a74b8a049d41248f92f928a5a5ee6bbcca33cb665c95b736c11c
+F test/wal2recover2.test 98749381c2e61574e181a2e288295a3bf93d12f57769db50ecea7fc211d9ad5c
F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c
F test/wal2savepoint.test 29725383e7eb8b78fed46333d69dc45b4ed321db43ecc81766aadea991874bef
F test/wal2simple.test 96206c98bf64ab20ec00a1c0f6c709e258b98b39f2149889361f31966ce5a703
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 34f56f8a4239781071edf6317723d0a7333249551c2c1ce7ed39fc116d53d780
-R cabac54018fcd32b9b9c7e5679bc38f9
+P 54e628f902a5508badc8941ceda1bec12fe8f58969c91c670a37888ef2681880
+R e2c9e8287795c59cafc4b6dc4a5ee2a2
U dan
-Z be9d783248b67e630efcf341b29cd59e
+Z 964094b4a0f5d261b4d47067580a5ce8
-54e628f902a5508badc8941ceda1bec12fe8f58969c91c670a37888ef2681880
\ No newline at end of file
+9cb5f8dab685f5ea36ad142cfa588dee82e87f3a89e8dcf84e0ee124bb29bc7f
\ No newline at end of file
}
/*
-** USAGE: hexio_get_int HEXDATA
+** USAGE: hexio_get_int [-littleendian] HEXDATA
**
** Interpret the HEXDATA argument as a big-endian integer. Return
** the value of that integer. HEXDATA can contain between 2 and 8
const unsigned char *zIn;
unsigned char *aOut;
unsigned char aNum[4];
+ int bLittle = 0;
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "HEXDATA");
+ if( objc==3 ){
+ int n;
+ char *z = Tcl_GetStringFromObj(objv[1], &n);
+ if( n>=2 && n<=13 && memcmp(z, "-littleendian", n)==0 ){
+ bLittle = 1;
+ }
+ }
+ if( (objc-bLittle)!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "[-littleendian] HEXDATA");
return TCL_ERROR;
}
- zIn = (const unsigned char *)Tcl_GetStringFromObj(objv[1], &nIn);
+ zIn = (const unsigned char *)Tcl_GetStringFromObj(objv[1+bLittle], &nIn);
aOut = sqlite3_malloc( nIn/2 );
if( aOut==0 ){
return TCL_ERROR;
memcpy(&aNum[4-nOut], aOut, nOut);
}
sqlite3_free(aOut);
- val = (aNum[0]<<24) | (aNum[1]<<16) | (aNum[2]<<8) | aNum[3];
+ if( bLittle ){
+ val = (aNum[3]<<24) | (aNum[2]<<16) | (aNum[1]<<8) | aNum[0];
+ }else{
+ val = (aNum[0]<<24) | (aNum[1]<<16) | (aNum[2]<<8) | aNum[3];
+ }
Tcl_SetObjResult(interp, Tcl_NewIntObj(val));
return TCL_OK;
}
rc = walLockShared(pWal, WAL_READ_LOCK(eLock));
if( rc!=SQLITE_OK ){
- return rc;
+ return (rc==SQLITE_BUSY ? WAL_RETRY : rc);
}
walShmBarrier(pWal);
if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){
waloverwrite.test walpersist.test walprotocol2.test
walprotocol.test walro2.test walrofault.test walro.test
walshared.test walslow.test wal.test
-wal2savepoint.test
+wal2savepoint.test wal2lock.test wal2recover2.test
}
test_suite "coverage-pager" -description {
--- /dev/null
+# 2018 December 15
+#
+# 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 the operation of the library in
+# "PRAGMA journal_mode=WAL2" mode.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/lock_common.tcl
+source $testdir/malloc_common.tcl
+source $testdir/wal_common.tcl
+
+set testprefix wal2lock
+ifcapable !wal {finish_test ; return }
+
+db close
+testvfs tvfs
+sqlite3 db test.db -vfs tvfs
+
+do_execsql_test 1.0 {
+ PRAGMA journal_mode = wal2;
+ CREATE TABLE y1(y, yy);
+ CREATE INDEX y1y ON y1(y);
+ CREATE INDEX y1yy ON y1(yy);
+ INSERT INTO y1 VALUES(1, 2), (3, 4), (5, 6);
+} {wal2}
+
+tvfs script vfs_callback
+tvfs filter xShmLock
+
+set ::lock [list]
+proc vfs_callback {func file name lock} {
+ lappend ::lock $lock
+ return SQLITE_OK
+}
+
+do_execsql_test 1.1.1 {
+ SELECT * FROM y1
+} {1 2 3 4 5 6}
+do_test 1.1.2 {
+ set ::lock
+} {{4 1 lock shared} {4 1 unlock shared}}
+
+set ::bFirst 1
+proc vfs_callback {func file name lock} {
+ if {$::bFirst} {
+ set ::bFirst 0
+ return SQLITE_BUSY
+ }
+ return SQLITE_OK
+}
+do_execsql_test 1.2 {
+ SELECT * FROM y1
+} {1 2 3 4 5 6}
+
+set ::bFirst 1
+proc vfs_callback {func file name lock} {
+ if {$::bFirst} {
+ set ::bFirst 0
+ return SQLITE_IOERR
+ }
+ return SQLITE_OK
+}
+do_catchsql_test 1.3 {
+ SELECT * FROM y1
+} {1 {disk I/O error}}
+
+puts "# Warning: This next test case causes SQLite to call xSleep(1) 100 times."
+puts "# Normally this equates to a delay of roughly 10 seconds, but if SQLite"
+puts "# is built on unix without HAVE_USLEEP defined, it may be much longer."
+proc vfs_callback {func file name lock} { return SQLITE_BUSY }
+do_catchsql_test 1.4 {
+ SELECT * FROM y1
+} {1 {locking protocol}}
+proc vfs_callback {func file name lock} { return SQLITE_OK }
+
+sqlite3 db2 test.db -vfs tvfs
+set ::bFirst 1
+
+proc vfs_callback {func file name lock} {
+ if {$::bFirst} {
+ set ::bFirst 0
+ db2 eval { INSERT INTO y1 VALUES(7, 8) }
+ }
+}
+
+do_execsql_test 1.5.1 {
+ SELECT * FROM y1
+} {1 2 3 4 5 6 7 8}
+do_execsql_test 1.5.2 {
+ SELECT * FROM y1
+} {1 2 3 4 5 6 7 8}
+
+db close
+db2 close
+tvfs delete
+finish_test
list [file size test.db] [file size test.db-wal] [file size test.db-wal2]
} {5120 15752 18896}
-#-------------------------------------------------------------------------
-#
-reset_db
-do_execsql_test 4.0 {
- PRAGMA journal_mode = wal2;
- CREATE TABLE xyz(x, y, z);
- INSERT INTO xyz VALUES('x', 'y', 'z');
-} {wal2}
-db close
-do_test 4.1 {
- close [open test.db-wal w]
- file mkdir test.db-wal2
- sqlite3 db test.db
- catchsql { SELECT * FROM xyz }
-} {1 {unable to open database file}}
-db close
-file delete test.db-wal2
-
-do_test 4.2 {
- sqlite3 db test.db
- execsql {
- INSERT INTO xyz VALUES('a', 'b', 'c');
- }
- forcecopy test.db test.db2
- forcecopy test.db-wal test.db2-wal
- forcedelete test.db2-wal2
- file mkdir test.db2-wal2
- sqlite3 db2 test.db2
- catchsql { SELECT * FROM xyz } db2
-} {1 {unable to open database file}}
-db2 close
-file delete test.db2-wal2
-
-
finish_test
--- /dev/null
+# 2018 December 13
+#
+# 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 the operation of the library in
+# "PRAGMA journal_mode=WAL2" mode.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/lock_common.tcl
+source $testdir/malloc_common.tcl
+source $testdir/wal_common.tcl
+
+set testprefix wal2recover2
+ifcapable !wal {finish_test ; return }
+
+do_execsql_test 1.0 {
+ CREATE TABLE t1(x);
+ CREATE TABLE t2(x);
+ WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1500 )
+ INSERT INTO t1 SELECT i FROM s;
+ WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1500 )
+ INSERT INTO t2 SELECT i FROM s;
+
+ PRAGMA journal_mode = wal2;
+ PRAGMA journal_size_limit = 10000;
+} {wal2 10000}
+
+set ::L 1125750
+set ::M 1126500
+set ::H 1127250
+
+do_execsql_test 1.1 {
+ UPDATE t1 SET x=x+1;
+ UPDATE t2 SET x=x+1 WHERE rowid<=750;
+
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+} [list $H $M]
+
+do_test 1.2 {
+ list [file size test.db] [file size test.db-wal] [file size test.db-wal2]
+} {31744 14704 7368}
+
+proc cksum {zIn data} {
+ if {[string length $zIn]==0} {
+ set s0 0
+ set s1 0
+ } else {
+ set s0 [hexio_get_int [string range $zIn 0 7]]
+ set s1 [hexio_get_int [string range $zIn 8 15]]
+ }
+ set n [expr [string length $data] / 8]
+
+ for {set i 0} {$i < $n} {incr i 2} {
+ set x0 [hexio_get_int -l [string range $data [expr $i*8] [expr $i*8+7]]]
+ set x1 [hexio_get_int -l [string range $data [expr $i*8+8] [expr $i*8+8+7]]]
+
+ set s0 [expr ($s0 + $x0 + $s1) & 0xFFFFFFFF]
+ set s1 [expr ($s1 + $x1 + $s0) & 0xFFFFFFFF]
+ }
+
+ return "[hexio_render_int32 $s0][hexio_render_int32 $s1]"
+}
+
+proc fix_wal_cksums {file} {
+ # Fix the checksum on the wal header.
+ set data [hexio_read $file 0 32]
+ set cksum [cksum {} [string range $data 0 47]]
+ set salt [hexio_read $file 16 8]
+ hexio_write $file 24 $cksum
+
+ # Fix the checksums for all pages in the wal file.
+ set pgsz [hexio_get_int [hexio_read $file 8 4]]
+ set sz [file size $file]
+ for {set off 32} {$off < $sz} {incr off [expr $pgsz+24]} {
+ set e [hexio_read $file $off 8]
+ set cksum [cksum $cksum $e]
+
+ set p [hexio_read $file [expr $off+24] $pgsz]
+ set cksum [cksum $cksum $p]
+
+ hexio_write $file [expr $off+8] $salt
+ hexio_write $file [expr $off+16] $cksum
+ }
+}
+
+proc wal_incr_hdrfield {file field} {
+ switch -- $field {
+ nCkpt { set offset 12 }
+ salt0 { set offset 16 }
+ salt1 { set offset 20 }
+ default {
+ error "unknown field $field - should be \"nCkpt\", \"salt0\" or \"salt1\""
+ }
+ }
+
+ # Increment the value in the wal header.
+ set v [hexio_get_int [hexio_read $file $offset 4]]
+ incr v
+ hexio_write $file $offset [hexio_render_int32 $v]
+
+ # Fix various checksums
+ fix_wal_cksums $file
+}
+
+proc wal_set_nckpt {file val} {
+ # Increment the value in the wal header.
+ hexio_write $file 12 [hexio_render_int32 $val]
+
+ # Fix various checksums
+ fix_wal_cksums $file
+}
+
+proc wal_set_follow {file prevfile} {
+ set pgsz [hexio_get_int [hexio_read $prevfile 8 4]]
+ set sz [file size $prevfile]
+ set cksum [hexio_read $prevfile [expr $sz-$pgsz-8] 8]
+
+ hexio_write $file 16 $cksum
+ fix_wal_cksums $file
+}
+
+foreach {tn file field} {
+ 1 test.db2-wal salt0
+ 2 test.db2-wal salt1
+ 3 test.db2-wal nCkpt
+ 4 test.db2-wal2 salt0
+ 5 test.db2-wal2 salt1
+ 6 test.db2-wal2 nCkpt
+} {
+ do_test 1.3.$tn {
+ forcecopy test.db test.db2
+ forcecopy test.db-wal test.db2-wal
+ forcecopy test.db-wal2 test.db2-wal2
+ wal_incr_hdrfield $file $field
+ sqlite3 db2 test.db2
+ execsql {
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+ } db2
+ } [list $H $L]
+ db2 close
+}
+
+do_test 1.4 {
+ forcecopy test.db test.db2
+ forcecopy test.db-wal2 test.db2-wal
+ forcedelete test.db2-wal2
+ sqlite3 db2 test.db2
+ execsql {
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+ } db2
+} [list $L $M]
+
+do_test 1.5 {
+ forcecopy test.db test.db2
+ forcecopy test.db-wal2 test.db2-wal
+ forcecopy test.db-wal test.db2-wal2
+ sqlite3 db2 test.db2
+ execsql {
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+ } db2
+} [list $H $M]
+
+foreach {tn file field} {
+ 1 test.db2-wal salt0
+ 2 test.db2-wal salt1
+ 3 test.db2-wal2 salt0
+ 4 test.db2-wal2 salt1
+} {
+ do_test 1.6.$tn {
+ forcecopy test.db test.db2
+ forcecopy test.db-wal2 test.db2-wal
+ forcecopy test.db-wal test.db2-wal2
+ wal_incr_hdrfield $file $field
+ breakpoint
+ sqlite3 db2 test.db2
+ execsql {
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+ } db2
+ } [list $H $L]
+ db2 close
+}
+
+foreach {tn nCkpt1 nCkpt2 res} [list \
+ 1 2 1 "$H $M" \
+ 2 2 2 "$L $M" \
+ 3 3 1 "$H $L" \
+ 4 15 14 "$H $M" \
+ 5 0 15 "$H $M" \
+ 6 1 15 "$L $M" \
+] {
+ do_test 1.7.$tn {
+ forcecopy test.db test.db2
+ forcecopy test.db-wal2 test.db2-wal
+ forcecopy test.db-wal test.db2-wal2
+
+ wal_set_nckpt test.db2-wal2 $nCkpt2
+ wal_set_nckpt test.db2-wal $nCkpt1
+ wal_set_follow test.db2-wal test.db2-wal2
+
+ if {$tn==1} breakpoint
+
+ sqlite3 db2 test.db2
+ execsql {
+ SELECT sum(x) FROM t1;
+ SELECT sum(x) FROM t2;
+ } db2
+ } $res
+ db2 close
+}
+
+
+finish_test
+