Оператор выполнения Firebird с именованным параметром bigint

Допустим, у меня есть такой код:

execute block
as
declare var_mask bigint;
declare var_dummy int;
begin
    var_mask = bin_shl(1, (64 - 1));

    execute statement ('
select first 1 null
from rdb$database
where bin_and(cast(0 as bigint), :var_mask) <> cast(0 as bigint)
    ')
    (var_mask := var_mask)
    into :var_dummy
    ;
end

Этот дает хороший arithmetic exception, numeric overflow, or string truncation. numeric value is out of range.,

Чтобы это работало, я должен сделать явное приведение переменной:

execute block
as
declare var_mask bigint;
declare var_dummy int;
begin
    var_mask = bin_shl(1, (64 - 1));

    execute statement ('
select first 1 null
from rdb$database
where bin_and(cast(0 as bigint), cast(:var_mask as bigint)) <> cast(0 as bigint)
    ')
    (var_mask := var_mask)
    into :var_dummy
    ;
end

Кто-нибудь знает почему? Информация о типе должна нести, не так ли?

2 ответа

Решение

Чтобы добавить к ответу Адриано, информация о типе фактически не несет - больше здесь, от меня фактически:).

Потому что BIN_AND описывает второй параметр как INTEGER, даже если вы передаете BIGINT первому. Хорошо это или плохо - обсуждается.

Другие вопросы по тегам