Hello!
The problem can be solved by using Tcl_ConvertToType() function for
wideint and double values.
$ diff -u tclsqlite.c.old tclsqlite.c
===============================================
--- tclsqlite.c.old 2009-09-05 00:37:43.000000000 +0400
+++ tclsqlite.c 2009-10-08 19:39:56.000000000 +0400
@@ -765,15 +765,17 @@
}else if( c=='b' && strcmp(zType,"boolean")==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 if( (c=='w' && strcmp(zType,"wideInt")==0) ||
- (c=='i' && strcmp(zType,"int")==0) ){
+ (c=='i' && strcmp(zType,"int")==0) ||
+ TCL_OK == Tcl_ConvertToType(p->interp, pVar,
Tcl_GetObjType("wideint"))){
Tcl_WideInt v;
Tcl_GetWideIntFromObj(0, pVar, &v);
sqlite3_result_int64(context, v);
+ }else if( (c=='d' && strcmp(zType,"double")==0) ||
+ TCL_OK == Tcl_ConvertToType(p->interp, pVar,
Tcl_GetObjType("double"))){
+ double r;
+ Tcl_GetDoubleFromObj(0, pVar, &r);
+ sqlite3_result_double(context, r);
}else{
data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT);
@@ -1629,6 +1631,9 @@
SqlPreparedStmt *pPreStmt; /* Pointer to a prepared statement */
int rc2;
+ Tcl_ObjType *tclWideIntType = Tcl_GetObjType("wideint");
+ Tcl_ObjType *tclDoubleType = Tcl_GetObjType("double");
+
if( choice==DB_EVAL ){
if( objc<3 || objc>5 ){
Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME? ?SCRIPT?");
@@ -1758,15 +1763,17 @@
}else if( c=='b' && strcmp(zType,"boolean")==0 ){
Tcl_GetIntFromObj(interp, pVar, &n);
sqlite3_bind_int(pStmt, i, n);
- }else if( c=='d' && strcmp(zType,"double")==0 ){
- double r;
- Tcl_GetDoubleFromObj(interp, pVar, &r);
- sqlite3_bind_double(pStmt, i, r);
}else if( (c=='w' && strcmp(zType,"wideInt")==0) ||
- (c=='i' && strcmp(zType,"int")==0) ){
+ (c=='i' && strcmp(zType,"int")==0) ||
+ TCL_OK == Tcl_ConvertToType(interp, pVar, tclWideIntType)) {
Tcl_WideInt v;
Tcl_GetWideIntFromObj(interp, pVar, &v);
sqlite3_bind_int64(pStmt, i, v);
+ }else if( (c=='d' && strcmp(zType,"double")==0) ||
+ TCL_OK == Tcl_ConvertToType(interp, pVar, tclDoubleType)) {
+ double r;
+ Tcl_GetDoubleFromObj(interp, pVar, &r);
+ sqlite3_bind_double(pStmt, i, r);
}else{
data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
sqlite3_bind_text(pStmt, i, (char *)data, n, SQLITE_STATIC);
===============================================
$ cat ./tclsqlite_bind.tcl
===============================================
#!/usr/bin/tclsh8.5
package require sqlite3
sqlite3 db :memory:
db eval {create table test(a int);insert into test values (1);}
proc test {label sql result} {
global i j
puts -nonewline $label\t
set _result [db eval $sql]
if { $_result eq $result} {
puts OK
} else {
puts ERROR\t$result!=$_result
}
}
proc sql {value} {return $value}
db function sql sql
set i 1
set j [db onecolumn {select quote($i)}]
test 1.0 {select typeof($i)} integer
test 1.1 {select * from test where a=$i} 1
test 1.2 {select * from test where 1=$i} 1 ;# it doesn't work in orig sqlite
test 1.3 {select a from test where a IN (cast($i AS INT), 160)} 1
test 1.4 {select a from test where 1 IN (cast($i AS INT), 160)} 1
test 2.0 {select typeof($j)} integer
test 2.1 "select * from test where a=$j" 1
test 2.2 "select * from test where 1=$j" 1 ;# it doesn't work in orig sqlite
test 2.3 "select a from test where a IN ($j, 160)" 1
test 2.4 "select a from test where 1 IN ($j, 160)" 1 ;# it doesn't work in orig
sqlite
test 3.1 "create view view_test1 as select * from test where a=$j;select * from
view_test1" 1
test 3.2 "create view view_test2 as select * from test where 1=$j;select * from
view_test2" 1 ;# it doesn't work in orig sqlite
test 3.3 "create view view_test3 as select * from test where a IN ($j);select *
from view_test3" 1
test 3.4 "create view view_test4 as select * from test where 1 IN ($j);select *
from view_test4" 1 ;# it doesn't work in orig sqlite
test 4.1 "select typeof(sql($j))" integer
===============================================
$ ./tclsqlite_bind.tcl
===============================================
1.0 OK
1.1 OK
1.2 OK
1.3 OK
1.4 OK
2.0 OK
2.1 OK
2.2 OK
2.3 OK
2.4 OK
3.1 OK
3.2 OK
3.3 OK
3.4 OK
4.1 OK
===============================================
Best regards, Alexey Pechnikov.
http://pechnikov.tel/
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users