Поиск по этому блогу

вторник, 13 декабря 2011 г.

Firebird 2.5. Особенность.

Версия FB 2.5 Firebird-2.5.0.26074_1_Win32.exe ODS 11.2
Скачала FB 2.5.1 Firebird-2.5.1.26351_1_Win32.exe - та же особенность
БД в кодировке UTF-8
UNION in VIEW
String truncation error when selecting from a VIEW with UNION inside
особенность пофиксена


Эпизод первый
create view TREE_TEST (
ID, TEXT,  PARENTID,  CONDITIONS,
STMT, RULFNAME )
as
select uidorg , nameorg
, '0'
, ' G.UIDORG = ' || '''' || uidorg || ''''
, '', 'KODORG'
from org_delivery;

Делаем запрос.
select ID, TEXT, PARENTID, CONDITIONS, STMT, RULFNAME
from TREE_TEST
Результат нормальный


Эпизод второй. Добавляем UNION


create view TREE_TEST (
ID, TEXT, PARENTID, CONDITIONS,
STMT, RULFNAME )
as
select 0, 'Организации', NULL, '', ''
, 'KODORG'
from rdb$database
union
select uidorg
, nameorg
, '0'
, ' G.UIDORG = ' || '''' || uidorg || ''''
, ''
, 'KODORG'
from org_delivery


select ID, TEXT, PARENTID, CONDITIONS, STMT, RULFNAME
from TREE_TEST

При этом отдельно запрос, к-й помещен во View выполняется без ошибок
Текст ошибки
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.

Хелен Борри.
«Известная ошибка в просмотрах FB 1.0.x»
стр.530 Запрос с объединением (union) может привести к краху сервера.
Ошибка исправлена до релиза версии 1.5



Скачала FB 2.5.1 Firebird-2.5.1.26351_1_Win32.exe - та же ошибка



Решение. Надо явно задавать тип поля, с помощью конструкции cast
 CREATE OR ALTER VIEW TREE_TEST1(
    ID,
    TEXT,
    PARENTID,
    CONDITIONS,
    STMT,
    RULFNAME)
AS
select 0, 'Организации', NULL, '', ''
 , cast('KODORG' as char(6))
 from org_delivery
union
select uidorg
 , nameorg
 , '0'
 , ' G.UIDORG = ' || '''' || uidorg || ''''
 , ''
 , cast('KODORG' as char(6))
 from org_delivery
;