PLPGSQL function returns ERROR: integer out of range even if value is correct

PLPGSQL function returns ERROR: integer out of range even if value is correct

我在两个 Postgres 函数 returning 单个 bigint 值上遇到了奇怪的行为。第一个 return 是正确的值,而第二个抛出错误:

ERROR: integer out of range

唯一不同的是,第一个return是一个常数时间值,单位是ns,而第二个是按常数计算的,为了方便,给定在s:

这个很好用:

CREATE OR REPLACE FUNCTION c_getTime1()
RETURNS bigint AS $$
BEGIN
    RETURN 12000000000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;

这个会抛出一个错误。

CREATE OR REPLACE FUNCTION c_getTime2()
RETURNS bigint AS $$
BEGIN
    RETURN 12*1000*1000*1000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;

只是想知道,有什么大的区别吗?我应该以某种方式强制转换第二个函数的 return 吗? 这两个函数都使用直接方式调用:

select c_getTime1();
select c_getTime2();

Postgresql数据库版本为13.3。

提前感谢您的任何建议。

selectpg_typeof(100); return integer.
RETURN 12*1000*1000*1000; 将首先计算为 integer 然后转换为 bigint。 https://www.postgresql.org/docs/current/datatype-numeric.html 先计算然后发现 ERROR: 22003: integer out of range 所以你应该改成

RETURN 12 ::bigint * 1000 ::bigint * 1000::bigint * 1000::bigint;