Здравствуйте.

Имеем два сервера:
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... Приплетя еще и деление на ноль, и арифметическое переполнение.

Что это особенности реализации под различные платформы или же маленький баг?

--
Гоголь Дмитрий

Ответить