-C Fix\serrors\sin\sthreadtest3\stests\scaused\sby\searlier\stests\sneglecting\sto\sclose\sdatabase\shandles.
-D 2014-12-15T08:46:17.172
+C Add\snew\stest\sfile\se_walauto.test.
+D 2014-12-15T16:27:12.622
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/status.c 81712116e826b0089bb221b018929536b2b5406f
F src/table.c f142bba7903e93ca8d113a5b8877a108ad1a27dc
F src/tclsqlite.c c6a21c64da1490e14d53cdc2062d1e2e57942622
-F src/test1.c 7e806af12d7915445e46407d32b275d8ca9db4e7
+F src/test1.c 56e33bf6b1827c6ca7520c189131ddd778fb2267
F src/test2.c 98049e51a17dc62606a99a9eb95ee477f9996712
F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c
F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df
F test/e_uri.test 5ae33760fb2039c61aa2d90886f1664664173585
F test/e_vacuum.test 5bfbdc21b65c0abf24398d0ba31dc88d93ca77a9
F test/e_wal.test 0967f0b8f1dfda871dc7b9b5574198f1f4f7d69a
+F test/e_walauto.test a1fa9d36c160cc4001a934d1e009aae597b440b7
F test/e_walckpt.test 3116a98fa0dd9b2c9e493de7c59730adfe436746
F test/e_walhook.test da3ea8b3483d1af72190337bda50155a91a4b664
F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ba772cff602ca7c3c0c91451e701f52a872e7a14
-R ed0c57369d0ec456d80773711d0601f8
+P 1d44f1b1a9fefeb2449892775c59765c46784eb1
+R 10b3e0524cfe98a487f450c2b23f40b1
U dan
-Z bfcc45ad20cf310717047c8b8c88d22b
+Z 762d85cad7a4c7a6623b46eb7c11e324
return TCL_OK;
}
+/*
+** tclcmd: sqlite3_wal_autocheckpoint db VALUE
+*/
+static int test_wal_autocheckpoint(
+ ClientData clientData, /* Unused */
+ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
+ int objc, /* Number of arguments */
+ Tcl_Obj *CONST objv[] /* Command arguments */
+){
+ sqlite3 *db;
+ int rc;
+ int iVal;
+
+
+ if( objc!=3 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "DB VALUE");
+ return TCL_ERROR;
+ }
+
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db)
+ || Tcl_GetIntFromObj(0, objv[2], &iVal)
+ ){
+ return TCL_ERROR;
+ }
+
+ rc = sqlite3_wal_autocheckpoint(db, iVal);
+ Tcl_ResetResult(interp);
+ if( rc!=SQLITE_OK ){
+ const char *zErrCode = sqlite3ErrName(rc);
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(zErrCode, -1));
+ return TCL_ERROR;
+ }
+
+ return TCL_OK;
+}
+
+
/*
** tclcmd: test_sqlite3_log ?SCRIPT?
*/
#endif
{ "sqlite3_wal_checkpoint", test_wal_checkpoint, 0 },
{ "sqlite3_wal_checkpoint_v2",test_wal_checkpoint_v2, 0 },
+ { "sqlite3_wal_autocheckpoint",test_wal_autocheckpoint, 0 },
{ "test_sqlite3_log", test_sqlite3_log, 0 },
#ifndef SQLITE_OMIT_EXPLAIN
{ "print_explain_query_plan", test_print_eqp, 0 },
--- /dev/null
+# 2014 December 04
+#
+# 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.
+#
+#***********************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/wal_common.tcl
+set testprefix e_walauto
+
+
+proc read_nbackfill {} {
+ seek $::shmfd 96
+ binary scan [read $::shmfd 4] i nBackfill
+ set nBackfill
+}
+proc read_mxframe {} {
+ seek $::shmfd 16
+ binary scan [read $::shmfd 4] i mxFrame
+ set mxFrame
+}
+
+# Assuming that the main db for database handle
+#
+proc do_autocommit_threshold_test {tn value} {
+
+ set nBackfillSaved [read_nbackfill]
+ while {1} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ if {[read_mxframe] >= $value} break
+ }
+
+ set nBackfillNew [read_nbackfill]
+ uplevel [list do_test $tn "expr $nBackfillNew > $nBackfillSaved" 1]
+}
+
+# EVIDENCE-OF: R-30135-06439 The wal_autocheckpoint pragma can be used
+# to invoke this interface from SQL.
+#
+# All tests in this file are run twice - once using the
+# sqlite3_wal_autocheckpoint() API, and once using "PRAGMA
+# wal_autocheckpoint".
+#
+foreach {tn code} {
+ 1 {
+ proc autocheckpoint {db value} {
+ uplevel [list $db eval "PRAGMA wal_autocheckpoint = $value"]
+ }
+ }
+
+ 2 {
+ proc autocheckpoint {db value} {
+ uplevel [list sqlite3_wal_autocheckpoint $db $value]
+ return $value
+ }
+ }
+} {
+
+ eval $code
+
+ reset_db
+ do_execsql_test 1.$tn.0 { PRAGMA journal_mode = WAL } {wal}
+ do_execsql_test 1.$tn.1 { CREATE TABLE t1(a, b) }
+ set shmfd [open "test.db-shm"]
+
+ # EVIDENCE-OF: R-41531-51083 Every new database connection defaults to
+ # having the auto-checkpoint enabled with a threshold of 1000 or
+ # SQLITE_DEFAULT_WAL_AUTOCHECKPOINT pages.
+ #
+ do_autocommit_threshold_test 1.$tn.2 1000
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ do_autocommit_threshold_test 1.$tn.3 1000
+
+ # EVIDENCE-OF: R-38128-34102 The sqlite3_wal_autocheckpoint(D,N) is a
+ # wrapper around sqlite3_wal_hook() that causes any database on database
+ # connection D to automatically checkpoint after committing a
+ # transaction if there are N or more frames in the write-ahead log file.
+ #
+ do_test 1.$tn.4 {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ autocheckpoint db 100
+ } {100}
+ do_autocommit_threshold_test 1.$tn.5 100
+
+ do_test 1.$tn.6 {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ autocheckpoint db 500
+ } {500}
+ do_autocommit_threshold_test 1.$tn.7 500
+
+ # EVIDENCE-OF: R-26993-43540 Passing zero or a negative value as the
+ # nFrame parameter disables automatic checkpoints entirely.
+ #
+ do_test 1.$tn.7 {
+ autocheckpoint db 0 ;# Set to zero
+ for {set i 0} {$i < 10000} {incr i} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ }
+ expr {[file size test.db-wal] > (5 * 1024 * 1024)}
+ } 1
+ do_test 1.$tn.8 {
+ sqlite3_wal_checkpoint_v2 db truncate
+ file size test.db-wal
+ } 0
+ do_test 1.$tn.9 {
+ autocheckpoint db -4 ;# Set to a negative value
+ for {set i 0} {$i < 10000} {incr i} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ }
+ expr {[file size test.db-wal] > (5 * 1024 * 1024)}
+ } 1
+
+ # EVIDENCE-OF: R-10203-42688 The callback registered by this function
+ # replaces any existing callback registered using sqlite3_wal_hook().
+ #
+ set ::wal_hook_callback 0
+ proc wal_hook_callback {args} { incr ::wal_hook_callback ; return 0 }
+ do_test 1.$tn.10.1 {
+ db wal_hook wal_hook_callback
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ set ::wal_hook_callback
+ } 2
+ do_test 1.$tn.10.2 {
+ autocheckpoint db 100
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ set ::wal_hook_callback
+ } 2
+
+ # EVIDENCE-OF: R-17497-43474 Likewise, registering a callback using
+ # sqlite3_wal_hook() disables the automatic checkpoint mechanism
+ # configured by this function.
+ do_test 1.$tn.11.1 {
+ sqlite3_wal_checkpoint_v2 db truncate
+ file size test.db-wal
+ } 0
+ do_test 1.$tn.11.2 {
+ autocheckpoint db 100
+ for {set i 0} {$i < 1000} {incr i} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ }
+ expr {[file size test.db-wal] < (1 * 1024 * 1024)}
+ } 1
+ do_test 1.$tn.11.3 {
+ db wal_hook wal_hook_callback
+ for {set i 0} {$i < 1000} {incr i} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ }
+ expr {[file size test.db-wal] < (1 * 1024 * 1024)}
+ } 0
+
+ # EVIDENCE-OF: R-33080-59193 Checkpoints initiated by this mechanism
+ # are PASSIVE.
+ #
+ set ::busy_callback_count 0
+ proc busy_callback {args} {
+ puts Hello
+ incr ::busy_callback_count
+ return 0
+ }
+ do_test 1.$tn.12.1 {
+ sqlite3_wal_checkpoint_v2 db truncate
+ autocheckpoint db 100
+ db busy busy_callback
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ } {}
+ do_test 1.$tn.12.2 {
+ sqlite3 db2 test.db
+ db2 eval { BEGIN; SELECT * FROM t1 LIMIT 10; }
+ read_nbackfill
+ } {0}
+ do_test 1.$tn.12.3 {
+ for {set i 0} {$i < 1000} {incr i} {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ }
+ read_nbackfill
+ } {2}
+ do_test 1.$tn.12.4 {
+ set ::busy_callback_count
+ } {0}
+ db2 close
+
+ do_test 1.$tn.12.5 {
+ db eval { INSERT INTO t1 VALUES(randomblob(100), randomblob(100)) }
+ read_nbackfill
+ } {1559}
+
+ db close
+ close $shmfd
+}
+
+finish_test