In the TCL interface, user-defined functions preserve the datatype returned
by the Tcl procedure. (CVS 2453) FossilOrigin-Name: 99dcba1fb1fdaa2b8bc85046b00c14f6af596e8f
This commit is contained in:
parent
c96d8530ca
commit
c7f269d551
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C Make\ssure\sall\sdata\sstructures\shave\s8-byte\salignment\s-\snecessary\sfor\sthe\nsparc\sarchitecture\sand\shelpful\son\sother\s64-bit\splatforms.\s\sTicket\s#1232.\nAlso\supdate\ssome\scomments\sin\sbuild.c.\s(CVS\s2452)
|
||||
D 2005-05-03T12:30:34
|
||||
C In\sthe\sTCL\sinterface,\suser-defined\sfunctions\spreserve\sthe\sdatatype\sreturned\nby\sthe\sTcl\sprocedure.\s(CVS\s2453)
|
||||
D 2005-05-05T10:30:30
|
||||
F Makefile.in 5c00d0037104de2a50ac7647a5f12769795957a3
|
||||
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
|
||||
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
||||
@ -63,7 +63,7 @@ F src/shell.c 25b3217d7c64e6497225439d261a253a23efff26
|
||||
F src/sqlite.h.in 3675e3ada207e09b9d52a0463561325df4ac26b5
|
||||
F src/sqliteInt.h 7123b9d5632d7eaab90cf595c83c89521ea1c3b6
|
||||
F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9
|
||||
F src/tclsqlite.c d56821995513b2d68fa8c4a66ec2fbdfe615d8b7
|
||||
F src/tclsqlite.c ebdf626f28b2025ac9dac5bce7a206d059c27690
|
||||
F src/test1.c 4ad7ffe5a74fd99d4f73f6fd28ba27f403b3adba
|
||||
F src/test2.c 7f0ef466706ac01414e1136b96e5d8a65cb97545
|
||||
F src/test3.c 683e1e3819152ffd35da2f201e507228921148d0
|
||||
@ -193,7 +193,7 @@ F test/subquery.test 6274cce7617bc7f625490759cbe4f0c0eef24895
|
||||
F test/subselect.test 3f3f7a940dc3195c3139f4d530385cb54665d614
|
||||
F test/table.test e87fb2211b97c6a3a367fbc116e8572091b53160
|
||||
F test/tableapi.test 6a66d58b37d46dc0f2b3c7d4bd2617d209399bd1
|
||||
F test/tclsqlite.test 7112be2a9d0d70c8767b9b2c748bf39d407a6aba
|
||||
F test/tclsqlite.test 7593733310c1d89f0b63c84fb155104ad948135c
|
||||
F test/temptable.test c71eeffe8af807f76eafdc5a39824639a1e301df
|
||||
F test/tester.tcl 69c0dc1accaf0ff26bff62b33e13590a4ecba17d
|
||||
F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
|
||||
@ -279,7 +279,7 @@ F www/tclsqlite.tcl 425be741b8ae664f55cb1ef2371aab0a75109cf9
|
||||
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
||||
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
|
||||
F www/whentouse.tcl 528299b8316726dbcc5548e9aa0648c8b1bd055b
|
||||
P 535523e1be692adc940d256a7b3d23c62a4cc947
|
||||
R a72ac68975ae652f87834c74a143990a
|
||||
P d9418851cebc1605d8d62aad7987c0d61a905e81
|
||||
R cc12eb94118d09818ed72970e80aadcb
|
||||
U drh
|
||||
Z bc2beeb96490a6d1f455c1c7be0e1755
|
||||
Z a8e499380f6d4d0850b3a88c9fa43f3f
|
||||
|
@ -1 +1 @@
|
||||
d9418851cebc1605d8d62aad7987c0d61a905e81
|
||||
99dcba1fb1fdaa2b8bc85046b00c14f6af596e8f
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.39 2005/04/03 23:54:45 danielk1977 Exp $
|
||||
# $Id: tclsqlite.test,v 1.40 2005/05/05 10:30:30 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -318,4 +318,20 @@ do_test tcl-8.3 {
|
||||
db eval {SELECT * FROM t1 WHERE b IS NULL}
|
||||
} {30 {}}
|
||||
|
||||
# Test the return type of user-defined functions
|
||||
#
|
||||
do_test tcl-9.1 {
|
||||
db function ret_str {return "hi"}
|
||||
execsql {SELECT typeof(ret_str())}
|
||||
} {text}
|
||||
do_test tcl-9.2 {
|
||||
db function ret_dbl {return [expr {[clock seconds]*0.5}]}
|
||||
execsql {SELECT typeof(ret_dbl())}
|
||||
} {real}
|
||||
do_test tcl-9.3 {
|
||||
db function ret_int {clock seconds}
|
||||
execsql {SELECT typeof(ret_int())}
|
||||
} {integer}
|
||||
|
||||
|
||||
finish_test
|
||||
|
Loading…
x
Reference in New Issue
Block a user