diff options
author | drh <drh@noemail.net> | 2005-05-05 10:30:29 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2005-05-05 10:30:29 +0000 |
commit | c7f269d551893cc80829a320b474104cad5ad56e (patch) | |
tree | 621196164783826a28712aa45484c6ea5d297ad4 /src/tclsqlite.c | |
parent | c96d8530ca54c7ec7c6ca52b9e7f01f33f0c4235 (diff) | |
download | sqlite-c7f269d551893cc80829a320b474104cad5ad56e.tar.gz sqlite-c7f269d551893cc80829a320b474104cad5ad56e.zip |
In the TCL interface, user-defined functions preserve the datatype returned
by the Tcl procedure. (CVS 2453)
FossilOrigin-Name: 99dcba1fb1fdaa2b8bc85046b00c14f6af596e8f
Diffstat (limited to 'src/tclsqlite.c')
-rw-r--r-- | src/tclsqlite.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 3f76bdae6..bc23cc9b4 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -11,7 +11,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.123 2005/04/28 19:03:37 drh Exp $ +** $Id: tclsqlite.c,v 1.124 2005/05/05 10:30:30 drh Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ @@ -271,12 +271,33 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){ Tcl_DStringAppendElement(&cmd, sqlite3_value_text(argv[i])); } } - rc = Tcl_Eval(p->interp, Tcl_DStringValue(&cmd)); - if( rc ){ + rc = Tcl_EvalEx(p->interp, Tcl_DStringValue(&cmd), Tcl_DStringLength(&cmd), + TCL_EVAL_DIRECT); + if( rc && rc!=TCL_RETURN ){ sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1); }else{ - sqlite3_result_text(context, Tcl_GetStringResult(p->interp), -1, - SQLITE_TRANSIENT); + Tcl_Obj *pVar = Tcl_GetObjResult(p->interp); + int n; + u8 *data; + char *zType = pVar->typePtr ? pVar->typePtr->name : ""; + char c = zType[0]; + if( c=='b' && strcmp(zType,"bytearray")==0 ){ + data = Tcl_GetByteArrayFromObj(pVar, &n); + sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT); + Tcl_IncrRefCount(pVar); + }else if( (c=='b' && strcmp(zType,"boolean")==0) || + (c=='i' && strcmp(zType,"int")==0) ){ + Tcl_GetIntFromObj(0, pVar, &n); + sqlite3_result_int(context, n); + }else if( c=='d' && strcmp(zType,"double")==0 ){ + double r; + Tcl_GetDoubleFromObj(0, pVar, &r); + sqlite3_result_double(context, r); + }else{ + data = Tcl_GetStringFromObj(pVar, &n); + sqlite3_result_text(context, data, n, SQLITE_TRANSIENT); + Tcl_IncrRefCount(pVar); + } } } |