]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improved test coverage of tclsqlite.c (CVS 1761)
authordrh <drh@noemail.net>
Tue, 29 Jun 2004 12:39:08 +0000 (12:39 +0000)
committerdrh <drh@noemail.net>
Tue, 29 Jun 2004 12:39:08 +0000 (12:39 +0000)
FossilOrigin-Name: 008e57dcd5e16886ed732fe1e9797a3c00e8c579

manifest
manifest.uuid
src/tclsqlite.c
test/auth.test
test/hook.test
test/progress.test
test/tclsqlite.test

index dc275b0f7e94e4dac0e5b61fb14b297b14a62448..ec76987897d2bfeaa7fa818ac50ef525835a7e81 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stesting\sfor\ssqlite3_trace()\sand\sfix\sa\sbug.\s(CVS\s1760)
-D 2004-06-29T11:26:59
+C Improved\stest\scoverage\sof\stclsqlite.c\s(CVS\s1761)
+D 2004-06-29T12:39:08
 F Makefile.in cb7a9889c38723f72b2506c4236ff30a05ff172b
 F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -61,7 +61,7 @@ F src/shell.c 24b641700c9d90f361fcfa4f432c5b4aff704e6d
 F src/sqlite.h.in b70fded2bdfeaddfb06adea3888118b722975136
 F src/sqliteInt.h 4f8d44f04cc51cb421bf3c195247353a5be2e98f
 F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
-F src/tclsqlite.c a3b2acfe61677d9b49b199bfe043cc212d747412
+F src/tclsqlite.c 7648310ff0034213f3e58e7272328ed306507e9f
 F src/test1.c 0eca68f6e70069aad7ad0fd91fda886926646786
 F src/test2.c dafd8bd314a554bf376c6d3a8c83fd69219f5a40
 F src/test3.c bacc42bf41fa04d6faf7dd104b595b8bafb9aec9
@@ -84,7 +84,7 @@ F test/all.test d591e074013248176402a16a0fb6fc82d241bad5
 F test/attach.test 3acdffccbf5f78b07746771b9490758718e28856
 F test/attach2.test 3cd1d4a69e0ec307d0b68a44a96c9c8e1e253d65
 F test/attach3.test c4cc0b806783ce3d860af6b80c947f93ffb14270
-F test/auth.test a211eab0542ec024b578d771b09242dd9bb1aba3
+F test/auth.test 23d1dbf2235635409fee36535a344edc7494aea2
 F test/bigfile.test a1101b46528ad7282fb9b323d25da18672a3bd0a
 F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
 F test/bind.test ca031e902f63fb7d69545b4a47b0c7aea8747ffe
@@ -114,7 +114,7 @@ F test/enc3.test 315f302ed9a6042be76710eb6aa70e4551e9aa73
 F test/expr.test b4e945265c4c697bf5213b72558914ba10a989cc
 F test/fkey1.test d65c824459916249bee501532d6154ddab0b5db7
 F test/func.test db369afc9e77c4b40863e55497c8f0e449a43e79
-F test/hook.test c4102c672d67f8fb60ea459842805abcba69a747
+F test/hook.test f8605cde4c77b2c6a4a73723bf6c507796a64dda
 F test/in.test b92a2df9162e1cbd33c6449a29a05e6955b1741a
 F test/index.test b6941dd532815f278042b85f79b1a6dc16c4d729
 F test/insert.test ebbab63db4ad69395a058514bccb3cdb0a029d48
@@ -144,7 +144,7 @@ F test/pager.test 059cc5c58d3b5a851343dff8c56cf7286425d03a
 F test/pager2.test 55469c7c1c1a54d6b32d7b3cc99001e90101a1ce
 F test/pragma.test 212d810e02a51c0ff9784a19d55e35d23382005d
 F test/printf.test 1eb584b7272d1abdfe117b2ef7cf3376ae8e4e06
-F test/progress.test 7542a6ac7894a1b7730c1f9a27f3f8b9388a4d25 x
+F test/progress.test 76c722f090b1ccb575e7e4e203a71608c5763beb x
 F test/quick.test 4c0b3eabe2e0e606622d63d7d61ef6efb3ce156b
 F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d
 F test/rowid.test b3d059f5c8d8874fa1c31030e0636f67405d20ea
@@ -158,7 +158,7 @@ F test/sort.test 30fb9ea782a78da849a562d53233ec62d421bf61
 F test/subselect.test f0fea8cf9f386d416d64d152e3c65f9116d0f50f
 F test/table.test b6d07f04c4157d1f2a37fb7febe36b250d468e31
 F test/tableapi.test b21ab097e87a5484bb61029e69e1a4e5c5e65ede
-F test/tclsqlite.test 2517b10ee2c806fb700548f54540aec7d62ed14a
+F test/tclsqlite.test 7a773d270a2c35af1d0295c18a9ee26859ddbf1f
 F test/temptable.test 63a16e3ad19adf073cfbcdf7624c92ac5236522c
 F test/tester.tcl f36cc22d0532725073ca78272d7834d56dceb6d9
 F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
@@ -232,7 +232,7 @@ F www/tclsqlite.tcl 19191cf2a1010eaeff74c51d83fd5f5a4d899075
 F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
 F www/version3.tcl 563ba3ac02f64da27ab17f3edbe8e56bfd0293fb
 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P 20db8124ace5fbfa99035ae28e5c98f4c5fcde00
-R d22897a28d331f978222e91e9a697838
+P 7a15391079ae9ce5360fa13e8779c8872885e789
+R 6d1cc0ec8c79803128be2f6b6916c2d6
 U drh
-Z 73e3d176ba77297dc04534c51f5da9eb
+Z 724b6a206741f085ef273c2e8d104b2e
index ee6616ad320b15ee00107c00dd1886376e7906c1..824121abd9f547f5e85c35b43abd8e77e9310acc 100644 (file)
@@ -1 +1 @@
-7a15391079ae9ce5360fa13e8779c8872885e789
\ No newline at end of file
+008e57dcd5e16886ed732fe1e9797a3c00e8c579
\ No newline at end of file
index ab08ad4f1e429f19a70ccb5e658ae3a0e777f418..a73a8805010172f4df14eb76e7ca7f7b86d57f95 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** A TCL Interface to SQLite
 **
-** $Id: tclsqlite.c,v 1.91 2004/06/29 11:26:59 drh Exp $
+** $Id: tclsqlite.c,v 1.92 2004/06/29 12:39:08 drh Exp $
 */
 #ifndef NO_TCL     /* Omit this whole file if TCL is unavailable */
 
@@ -391,22 +391,21 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
   int choice;
   int rc = TCL_OK;
   static const char *DB_strs[] = {
-    "authorizer",         "busy",                   "changes",
-    "close",              "commit_hook",            "complete",
-    "errorcode",          "eval",                   "function",
-    "last_insert_rowid",  "onecolumn",
-    "progress",           "rekey",                  "timeout",
-    "trace",              "collate",                "collation_needed",
-    "total_changes",      0                    
+    "authorizer",         "busy",              "changes",
+    "close",              "collate",           "collation_needed",
+    "commit_hook",        "complete",          "errorcode",
+    "eval",               "function",          "last_insert_rowid",
+    "onecolumn",          "progress",          "rekey",
+    "timeout",            "total_changes",     "trace",
+    0                    
   };
   enum DB_enum {
-    DB_AUTHORIZER,        DB_BUSY,                   DB_CHANGES,
-    DB_CLOSE,             DB_COMMIT_HOOK,            DB_COMPLETE,
-    DB_ERRORCODE,         DB_EVAL,                   DB_FUNCTION,
-    DB_LAST_INSERT_ROWID, DB_ONECOLUMN,        
-    DB_PROGRESS,          DB_REKEY,                  DB_TIMEOUT,
-    DB_TRACE,             DB_COLLATE,                DB_COLLATION_NEEDED,
-    DB_TOTAL_CHANGES
+    DB_AUTHORIZER,        DB_BUSY,             DB_CHANGES,
+    DB_CLOSE,             DB_COLLATE,          DB_COLLATION_NEEDED,
+    DB_COMMIT_HOOK,       DB_COMPLETE,         DB_ERRORCODE,
+    DB_EVAL,              DB_FUNCTION,         DB_LAST_INSERT_ROWID,
+    DB_ONECOLUMN,         DB_PROGRESS,         DB_REKEY,
+    DB_TIMEOUT,           DB_TOTAL_CHANGES,    DB_TRACE,
   };
 
   if( objc<2 ){
@@ -440,6 +439,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
   case DB_AUTHORIZER: {
     if( objc>3 ){
       Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");
+      return TCL_ERROR;
     }else if( objc==2 ){
       if( pDb->zAuth ){
         Tcl_AppendResult(interp, pDb->zAuth, 0);
@@ -583,6 +583,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
   case DB_COMMIT_HOOK: {
     if( objc>3 ){
       Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");
+      return TCL_ERROR;
     }else if( objc==2 ){
       if( pDb->zCommit ){
         Tcl_AppendResult(interp, pDb->zCommit, 0);
@@ -610,6 +611,57 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
     break;
   }
 
+  /*
+  **     $db collate NAME SCRIPT
+  **
+  ** Create a new SQL collation function called NAME.  Whenever
+  ** that function is called, invoke SCRIPT to evaluate the function.
+  */
+  case DB_COLLATE: {
+    SqlCollate *pCollate;
+    char *zName;
+    char *zScript;
+    int nScript;
+    if( objc!=4 ){
+      Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT");
+      return TCL_ERROR;
+    }
+    zName = Tcl_GetStringFromObj(objv[2], 0);
+    zScript = Tcl_GetStringFromObj(objv[3], &nScript);
+    pCollate = (SqlCollate*)Tcl_Alloc( sizeof(*pCollate) + nScript + 1 );
+    if( pCollate==0 ) return TCL_ERROR;
+    pCollate->interp = interp;
+    pCollate->pNext = pDb->pCollate;
+    pCollate->zScript = (char*)&pCollate[1];
+    pDb->pCollate = pCollate;
+    strcpy(pCollate->zScript, zScript);
+    if( sqlite3_create_collation(pDb->db, zName, SQLITE_UTF8, 
+        pCollate, tclSqlCollate) ){
+      return TCL_ERROR;
+    }
+    break;
+  }
+
+  /*
+  **     $db collation_needed SCRIPT
+  **
+  ** Create a new SQL collation function called NAME.  Whenever
+  ** that function is called, invoke SCRIPT to evaluate the function.
+  */
+  case DB_COLLATION_NEEDED: {
+    if( objc!=3 ){
+      Tcl_WrongNumArgs(interp, 2, objv, "SCRIPT");
+      return TCL_ERROR;
+    }
+    if( pDb->pCollateNeeded ){
+      Tcl_DecrRefCount(pDb->pCollateNeeded);
+    }
+    pDb->pCollateNeeded = Tcl_DuplicateObj(objv[2]);
+    Tcl_IncrRefCount(pDb->pCollateNeeded);
+    sqlite3_collation_needed(pDb->db, pDb, tclCollateNeeded);
+    break;
+  }
+
   /*    $db complete SQL
   **
   ** Return TRUE if SQL is a complete SQL statement.  Return FALSE if
@@ -759,6 +811,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
     pFunc->interp = interp;
     pFunc->pNext = pDb->pFunc;
     pFunc->zScript = (char*)&pFunc[1];
+    pDb->pFunc = pFunc;
     strcpy(pFunc->zScript, zScript);
     sqlite3_create_function(pDb->db, zName, -1, SQLITE_UTF8,
         pFunc, tclSqlFunc, 0, 0);
@@ -849,6 +902,23 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
     break;
   }
 
+  /*
+  **     $db total_changes
+  **
+  ** Return the number of rows that were modified, inserted, or deleted 
+  ** since the database handle was created.
+  */
+  case DB_TOTAL_CHANGES: {
+    Tcl_Obj *pResult;
+    if( objc!=2 ){
+      Tcl_WrongNumArgs(interp, 2, objv, "");
+      return TCL_ERROR;
+    }
+    pResult = Tcl_GetObjResult(interp);
+    Tcl_SetIntObj(pResult, sqlite3_total_changes(pDb->db));
+    break;
+  }
+
   /*    $db trace ?CALLBACK?
   **
   ** Make arrangements to invoke the CALLBACK routine for each SQL statement
@@ -886,73 +956,6 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
     break;
   }
 
-  /*
-  **     $db collate NAME SCRIPT
-  **
-  ** Create a new SQL collation function called NAME.  Whenever
-  ** that function is called, invoke SCRIPT to evaluate the function.
-  */
-  case DB_COLLATE: {
-    SqlCollate *pCollate;
-    char *zName;
-    char *zScript;
-    int nScript;
-    if( objc!=4 ){
-      Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT");
-      return TCL_ERROR;
-    }
-    zName = Tcl_GetStringFromObj(objv[2], 0);
-    zScript = Tcl_GetStringFromObj(objv[3], &nScript);
-    pCollate = (SqlCollate*)Tcl_Alloc( sizeof(*pCollate) + nScript + 1 );
-    if( pCollate==0 ) return TCL_ERROR;
-    pCollate->interp = interp;
-    pCollate->pNext = pDb->pCollate;
-    pCollate->zScript = (char*)&pCollate[1];
-    strcpy(pCollate->zScript, zScript);
-    if( sqlite3_create_collation(pDb->db, zName, SQLITE_UTF8, 
-        pCollate, tclSqlCollate) ){
-      return TCL_ERROR;
-    }
-    break;
-  }
-
-  /*
-  **     $db collate_needed SCRIPT
-  **
-  ** Create a new SQL collation function called NAME.  Whenever
-  ** that function is called, invoke SCRIPT to evaluate the function.
-  */
-  case DB_COLLATION_NEEDED: {
-    if( objc!=3 ){
-      Tcl_WrongNumArgs(interp, 2, objv, "SCRIPT");
-      return TCL_ERROR;
-    }
-    if( pDb->pCollateNeeded ){
-      Tcl_DecrRefCount(pDb->pCollateNeeded);
-    }
-    pDb->pCollateNeeded = Tcl_DuplicateObj(objv[2]);
-    Tcl_IncrRefCount(pDb->pCollateNeeded);
-    sqlite3_collation_needed(pDb->db, pDb, tclCollateNeeded);
-    break;
-  }
-
-  /*
-  **     $db total_changes
-  **
-  ** Return the number of rows that were modified, inserted, or deleted 
-  ** since the database handle was created.
-  */
-  case DB_TOTAL_CHANGES: {
-    Tcl_Obj *pResult;
-    if( objc!=2 ){
-      Tcl_WrongNumArgs(interp, 2, objv, "");
-      return TCL_ERROR;
-    }
-    pResult = Tcl_GetObjResult(interp);
-    Tcl_SetIntObj(pResult, sqlite3_total_changes(pDb->db));
-    break;
-  }
-
   } /* End of the SWITCH statement */
   return rc;
 }
index 1a1bffc155103b02615ff48534af00b073c2b3fd..5f0bfebdde45d270b44561e7c2be38ad7d3906ae 100644 (file)
@@ -12,7 +12,7 @@
 # focus of this script is testing the ATTACH and DETACH commands
 # and related functionality.
 #
-# $Id: auth.test,v 1.15 2004/06/19 00:16:31 drh Exp $
+# $Id: auth.test,v 1.16 2004/06/29 12:39:08 drh Exp $
 #
 
 set testdir [file dirname $argv0]
@@ -36,6 +36,9 @@ do_test auth-1.1.1 {
 do_test auth-1.1.2 {
   db errorcode
 } {23}
+do_test auth-1.1.3 {
+  db authorizer
+} {::auth}
 do_test auth-1.2 {
   execsql {SELECT name FROM sqlite_master}
 } {}
index c037c04dc278f8c1f1af7bc957510f0bd3fe63f9..da445f64e2fc87a9574d1e588144d5d14d5c9c73 100644 (file)
@@ -15,7 +15,7 @@
 #
 #      sqlite_commit_hook
 #
-# $Id: hook.test,v 1.4 2004/05/31 08:26:49 danielk1977 Exp $
+# $Id: hook.test,v 1.5 2004/06/29 12:39:08 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -79,5 +79,15 @@ do_test hook-3.8 {
   execsql {SELECT * FROM t2}
 } {1 2 2 3 3 4 4 5 5 6}
 
+# Test turnning off the commit hook
+#
+do_test hook-3.9 {
+  db commit_hook {}
+  set ::commit_cnt {}
+  execsql {
+    INSERT INTO t2 VALUES(7,8);
+  }
+  set ::commit_cnt
+} {}
 
 finish_test
index 90bb63d2f390fdd6121d3cdb25f7f76562092bf9..293f4390091e478f31d2ae52744a53aef0994956 100755 (executable)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the 'progress callback'.
 #
-# $Id: progress.test,v 1.2 2004/05/31 08:26:50 danielk1977 Exp $
+# $Id: progress.test,v 1.3 2004/06/29 12:39:08 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -44,6 +44,13 @@ do_test progress-1.0 {
   }
   expr $counter > 1
 } 1
+do_test progress-1.0.1 {
+  db progress
+} {::namespace inscope :: {incr counter} ; expr 0}
+do_test progress-1.0.2 {
+  set v [catch {db progress xyz bogus} msg]
+  lappend v $msg
+} {1 {expected integer but got "xyz"}}
 
 # Test that the query is abandoned when the progress callback returns non-zero
 do_test progress1.1 {
index 8533a256a9e72d62f144950b1471fac93436bb19..00f294b50d9f3efc7d40bc3ad0ab2be683bce7b4 100644 (file)
@@ -15,7 +15,7 @@
 # interface is pretty well tested.  This file contains some addition
 # tests for fringe issues that the main test suite does not cover.
 #
-# $Id: tclsqlite.test,v 1.25 2004/06/21 06:50:29 danielk1977 Exp $
+# $Id: tclsqlite.test,v 1.26 2004/06/29 12:39:08 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -34,7 +34,7 @@ do_test tcl-1.1 {
 do_test tcl-1.2 {
   set v [catch {db bogus} msg]
   lappend v $msg
-} {1 {bad option "bogus": must be authorizer, busy, changes, close, commit_hook, complete, errorcode, eval, function, last_insert_rowid, onecolumn, progress, rekey, timeout, trace, collate, collation_needed, or total_changes}}
+} {1 {bad option "bogus": must be authorizer, busy, changes, close, collate, collation_needed, commit_hook, complete, errorcode, eval, function, last_insert_rowid, onecolumn, progress, rekey, timeout, total_changes, or trace}}
 do_test tcl-1.3 {
   execsql {CREATE TABLE t1(a int, b int)}
   execsql {INSERT INTO t1 VALUES(10,20)}
@@ -70,6 +70,67 @@ do_test tcl-1.6 {
   regsub {:.*$} $msg {} msg
   lappend v $msg
 } {1 {syntax error in expression "x*"}}
+do_test tcl-1.7 {
+  set v [catch {db} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db SUBCOMMAND ..."}}
+do_test tcl-1.8 {
+  set v [catch {db authorizer 1 2 3} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db authorizer ?CALLBACK?"}}
+do_test tcl-1.9 {
+  set v [catch {db busy 1 2 3} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db busy CALLBACK"}}
+do_test tcl-1.10 {
+  set v [catch {db progress 1} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db progress N CALLBACK"}}
+do_test tcl-1.11 {
+  set v [catch {db changes xyz} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db changes "}}
+do_test tcl-1.12 {
+  set v [catch {db commit_hook a b c} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db commit_hook ?CALLBACK?"}}
+do_test tcl-1.13 {
+  set v [catch {db complete} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db complete SQL"}}
+do_test tcl-1.14 {
+  set v [catch {db eval} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db eval SQL ?ARRAY-NAME CODE?"}}
+do_test tcl-1.15 {
+  set v [catch {db function} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db function NAME SCRIPT"}}
+do_test tcl-1.14 {
+  set v [catch {db last_insert_rowid xyz} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db last_insert_rowid "}}
+do_test tcl-1.15 {
+  set v [catch {db rekey} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db rekey KEY"}}
+do_test tcl-1.16 {
+  set v [catch {db timeout} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db timeout MILLISECONDS"}}
+do_test tcl-1.17 {
+  set v [catch {db collate} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db collate NAME SCRIPT"}}
+do_test tcl-1.18 {
+  set v [catch {db collation_needed} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db collation_needed SCRIPT"}}
+do_test tcl-1.19 {
+  set v [catch {db total_changes xyz} msg]
+  lappend v $msg
+} {1 {wrong # args: should be "db total_changes "}}
+
 
 if {[sqlite3 -tcl-uses-utf]} {
   do_test tcl-2.1 {
@@ -102,6 +163,23 @@ do_test tcl-3.3 {
   set rc [catch {db onecolumn} errmsg]
   lappend rc $errmsg
 } {1 {wrong # args: should be "db onecolumn SQL"}}
+do_test tcl-3.4 {
+  set rc [catch {db onecolumn {SELECT bogus}} errmsg]
+  lappend rc $errmsg
+} {1 {no such column: bogus}}
 
+# Turn the busy handler on and off
+#
+do_test tcl-4.1 {
+  proc busy_callback {cnt} {
+    break
+  }
+  db busy busy_callback
+  db busy
+} {busy_callback}
+do_test tcl-4.2 {
+  db busy {}
+  db busy
+} {}
 
 finish_test