On Oct 7, 2009, at 10:41 PM, Alexey Pechnikov wrote:

> Hello!
>
> I find some incorrect types casting for constants in all SQLite  
> versions.

The behaviour is actually correct, assuming that SQLite is
using sqlite3_bind_text() to bind the value of $i to the SQL
statement executed by [db eval].

See the rules to do with affinity and comparisons here:

   http://www.sqlite.org/datatype3.html#comparisons

for why the expressions {1=$i}, {a=$i} and {a=1} appear to
give inconsistent results.

Dan.


>
> ================= test script  =================
> #!/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} {
>    global i
>    puts -nonewline $label\t
>    puts [db eval $sql]
> }
>
> set i 1
> test 1.1 {select * from test where a=$i}
> test 1.2 {select * from test where 1=$i} ;# it doesn't work
> test 1.3 {select a from test where a IN (cast($i AS INT), 160)}
> test 1.4 {select a from test where 1 IN (cast($i AS INT), 160)}
>
> set i [db onecolumn {select quote($i)}]
> test 2.1 "select * from test where a=$i"
> test 2.2 "select * from test where 1=$i" ;# it doesn't work
> test 2.3 "select a from test where a IN ($i, 160)"
> test 2.4 "select a from test where 1 IN ($i, 160)" ;# it doesn't work
>
> test 3.1 "create view view_test1 as select * from test where a= 
> $i;select * from view_test1"
> test 3.2 "create view view_test2 as select * from test where 1= 
> $i;select * from view_test2" ;# it doesn't work
> test 3.3 "create view view_test3 as select * from test where a IN  
> ($i);select * from view_test3"
> test 3.4 "create view view_test4 as select * from test where 1 IN  
> ($i);select * from view_test4" ;# it doesn't work
> ======================================
>
> ================= result =================
> 1.1     1
> 1.2
> 1.3     1
> 1.4     1
> 2.1     1
> 2.2
> 2.3     1
> 2.4
> 3.1     1
> 3.2
> 3.3     1
> 3.4
> ======================================
>
> Of cource results of tests 1.1 and 1.2, 2.1 and 2.2, etc. must be  
> equal.
> I sqlite3 shell all work correct.
>
> ============== sqlite3 shell ================
> sqlite> select * from test where 1=1;
> 1
> sqlite> select * from test where 1=quote(1);
> 1
> sqlite> select a from test where a IN (1, 160);
> 1
> sqlite> select a from test where 1 IN (1, 160);
> 1
> sqlite> select a from test where 1 IN (quote(1), 160);
> 1
> sqlite> select a from test where a IN (quote(1), 160);
> 1
> ======================================
>
> P.S. I did report about this problem some times ago...
>
> Best regards, Alexey Pechnikov.
> http://pechnikov.tel/
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to