aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--manifest14
-rw-r--r--manifest.uuid2
-rw-r--r--src/tclsqlite.c31
-rw-r--r--test/tclsqlite.test18
4 files changed, 51 insertions, 14 deletions
diff --git a/manifest b/manifest
index 0e4c9fd72..5eebe868a 100644
--- a/manifest
+++ b/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
diff --git a/manifest.uuid b/manifest.uuid
index 5647fba66..3538ed1a8 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-d9418851cebc1605d8d62aad7987c0d61a905e81 \ No newline at end of file
+99dcba1fb1fdaa2b8bc85046b00c14f6af596e8f \ No newline at end of file
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);
+ }
}
}
diff --git a/test/tclsqlite.test b/test/tclsqlite.test
index 69c995254..b98dfa1ae 100644
--- a/test/tclsqlite.test
+++ b/test/tclsqlite.test
@@ -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