Re: Конвертация внутреннего представления переменных в Tcl
Hello!
On Thursday 08 October 2009 19:40:05 Victor Wagner wrote:
> Поэтому использовать этот механизм для проверки типа - занятие довольно
> стремное. А вдруг там была строка, которую почему-либо УДАЛОСЬ
> преобразовать в boolean, но имелось в виду совсем не это?
>
> Я бы ПРОВЕРЯЛ тип объекта посредством
>
> strcmp(obj->typePtr->name,"ожидаемый тип")
>
> (благо, и поле typePtr в Tcl_Obj, и поле name в Tcl_ObjType -
> документировано)
Ситуация как раз в том, что апстрим sqlite делает именно проверку по
obj->typePtr->name
В итоге оказывается, что один и тот же тиклевский код из скрипта
и в tclsh шелле дает _разный_ результат:
========================
$ tclsh8.5 /tmp/test
1.0 ERROR integer!=text
1.1 OK
1.2 ERROR 1!=
1.3 OK
1.4 OK
========================
$ 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
3.6.18
% % % % % % % 1
% 1
% % 1.0 OK
% 1.1 OK
% 1.2 OK
% 1.3 OK
% 1.4 OK
% %
========================
В sqlite3 шелле это же выражение, разумеется, выполняется
корректно
select * from test where 1=1
1
Найти "ошибку" в тиклевском коде тоже почти невозможно, т.к. всегда
string is wideint -strict 1
1
На мой взгляд, все очень даже плохо.
Best regards, Alexey Pechnikov.
http://pechnikov.tel/
Reply to: