Improved test coverage of tclsqlite.c (CVS 1761)

FossilOrigin-Name: 008e57dcd5e16886ed732fe1e9797a3c00e8c579
This commit is contained in:
drh 2004-06-29 12:39:08 +00:00
parent b97759ed11
commit 0f14e2ebed
7 changed files with 199 additions and 98 deletions

View File

@ -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

View File

@ -1 +1 @@
7a15391079ae9ce5360fa13e8779c8872885e789
008e57dcd5e16886ed732fe1e9797a3c00e8c579

View 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;
}

View 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}
} {}

View 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

View File

@ -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 {

View 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