]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add new test file e_walauto.test.
authordan <dan@noemail.net>
Mon, 15 Dec 2014 16:27:12 +0000 (16:27 +0000)
committerdan <dan@noemail.net>
Mon, 15 Dec 2014 16:27:12 +0000 (16:27 +0000)
FossilOrigin-Name: 62ef45140cdbff5eeb8bef506db8b78ced3ace94

manifest
manifest.uuid
src/test1.c
test/e_walauto.test [new file with mode: 0644]

index 56aa9e8cb0fddf5707db601e46ac09c02ca1184a..eeea121a6ab552b85ac6e35fad031fe190a563ce 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -238,7 +238,7 @@ F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 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
@@ -478,6 +478,7 @@ F test/e_update.test 312cb8f5ccfe41515a6bb092f8ea562a9bd54d52
 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
@@ -1231,7 +1232,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 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
index 53e85dbd36b7aab49959c60f09cf76daab792bc8..2d88a004d6fb8d479758539e6ae26b35fbea1049 100644 (file)
@@ -1 +1 @@
-1d44f1b1a9fefeb2449892775c59765c46784eb1
\ No newline at end of file
+62ef45140cdbff5eeb8bef506db8b78ced3ace94
\ No newline at end of file
index 851249461cd24668956a8688c3bbe46e742618e7..40acac83606fd95696e130bf0194317c84c2ecc1 100644 (file)
@@ -5726,6 +5726,43 @@ static int test_wal_checkpoint_v2(
   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?
 */
@@ -6787,6 +6824,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 #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  },
diff --git a/test/e_walauto.test b/test/e_walauto.test
new file mode 100644 (file)
index 0000000..fc394e9
--- /dev/null
@@ -0,0 +1,201 @@
+# 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