Здравствуйте.
Имеем два сервера:
1. OS - WinXP Sp2, Firebird SS установлен инсталлятором
Firebird-2.1.0.17798_0_Win32.exe.
2. OS - CentOS 5.1, Firebird SS установлен из пакета
FirebirdSS-2.1.0.17798-0.nptl.i686.rpm
В процессе экспериментов обнаружил следующее.
На таблице:
CREATE TABLE T_LINKS (
LINK_TYPE INTEGER,
RIGHT_ID INTEGER,
PROP_VALUE VARCHAR(1024)
);
INSERT INTO T_LINKS (LINK_TYPE,RIGHT_ID,PROP_VALUE) VALUES(2,161,'2001');
INSERT INTO T_LINKS (LINK_TYPE,RIGHT_ID,PROP_VALUE) VALUES(2,161,'2002');
INSERT INTO T_LINKS (LINK_TYPE,RIGHT_ID,PROP_VALUE) VALUES(2,161,'2003');
INSERT INTO T_LINKS (LINK_TYPE,RIGHT_ID,PROP_VALUE) VALUES(10,161,'ANY
STRING');
Выполняем запрос:
SELECT * FROM T_LINKS
WHERE (RIGHT_ID=161 AND LINK_TYPE=2) AND CAST(PROP_VALUE AS
INTEGER)<>2001
На первом (WinXP) сервере отрабатывает без ошибок, а на Linux сервере,
если в поле PROP_VALUE
присутствует значение "Any string", однозначно не попадающего под условие
(RIGHT_ID=161 AND LINK_TYPE=2) выдает ошибку:
Overflow occurred during data type conversion.
conversion error from string "Any string"
Если же запрос переписать следующим образом:
SELECT * FROM T_LINKS
WHERE CAST(PROP_VALUE AS INTEGER)<>2001 AND (RIGHT_ID=161 AND
LINK_TYPE=2)
то ошибок нет.
Мнэ-э-э, несколько неприятная ситуация, т.к. первый вариант запроса
использовался в джойне
одного большого запроса и на попытку его выполнить на Win-сервере
отрабатывал, а на Linux-сервере
ругался, что Can't transliterate... Приплетя еще и деление на ноль, и
арифметическое переполнение.
Что это особенности реализации под различные платформы или же маленький
баг?
--
Гоголь Дмитрий