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 sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users