【发布时间】:2020-09-17 12:21:00
【问题描述】:
- 给定以下示例函数:
CREATE OR REPLACE FUNCTION add_max_value(_x BIGINT)
RETURNS BIGINT
LANGUAGE sql
AS $$
SELECT 9223372036854775807 + _x;
$$;
- 如果使用任何正值调用此函数,则返回以下错误:
SELECT add_max_value(1); -- Expecting -9223372036854775808 if math wrapped
-- SQL Error [22003]: ERROR: bigint out of range
-
如何在 Postgres 中进行溢出整数数学运算?
- 请注意:
- 我想在数据库中执行此操作,而不是在应用程序中
- 我不希望它提升为任意精度整数 (
NUMERIC) - 虽然这个例子只做加法,但实际上我对其他操作也很感兴趣
- 请注意:
【问题讨论】:
-
即使是负输入,该函数是否真的会引发错误?
-
@a_horse_with_no_name 第二个代码块中有预期的结果。重申一下,许多主流语言(C、Java)提供的相同包装行为。
-
@jarlh 你是对的,好电话;正整数是示例中的问题。问题已更新。
-
除了在 PL/pgSQL 中使用中间
numeric变量并手动“包装”之外,我没有看到任何其他方法
标签: sql postgresql plpgsql