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/