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

Reply via email to