[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: