From 9ed7624edcd5b9033ab4ce7190705c58df2644ff Mon Sep 17 00:00:00 2001 From: Sean <22557931+sean0407@users.noreply.github.com> Date: Sun, 11 Oct 2026 14:31:27 +0800 Subject: [PATCH 1/2] Fix agtype integer division overflow --- regress/expected/expr.out | 6 ++++++ regress/sql/expr.sql | 5 +++++ src/backend/utils/adt/agtype_ops.c | 8 ++++++++ 3 files changed, 19 insertions(+) diff --git a/regress/expected/expr.out b/regress/expected/expr.out index 806a6f65c..e6f8a8fdc 100644 --- a/regress/expected/expr.out +++ b/regress/expected/expr.out @@ -26,6 +26,12 @@ NOTICE: graph "expr" has been created (1 row) +-- Integer division must report bigint overflow instead of raising SIGFPE. +SELECT * FROM cypher('expr', $$ +RETURN (-9223372036854775807 - 1) / -1 +$$) AS (r agtype); +ERROR: bigint out of range + -- -- map literal -- diff --git a/regress/sql/expr.sql b/regress/sql/expr.sql index d4d900a1c..34b80ae04 100644 --- a/regress/sql/expr.sql +++ b/regress/sql/expr.sql @@ -23,6 +23,11 @@ SET search_path TO ag_catalog; SELECT * FROM create_graph('expr'); +-- Integer division must report bigint overflow instead of raising SIGFPE. +SELECT * FROM cypher('expr', $$ +RETURN (-9223372036854775807 - 1) / -1 +$$) AS (r agtype); + -- -- map literal -- diff --git a/src/backend/utils/adt/agtype_ops.c b/src/backend/utils/adt/agtype_ops.c index 9a1c4033e..480ca3ea0 100644 --- a/src/backend/utils/adt/agtype_ops.c +++ b/src/backend/utils/adt/agtype_ops.c @@ -795,6 +795,14 @@ Datum agtype_div(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } + if (agtv_lhs->val.int_value == PG_INT64_MIN && + agtv_rhs->val.int_value == -1) + { + ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("bigint out of range"))); + PG_RETURN_NULL(); + } + agtv_result.type = AGTV_INTEGER; agtv_result.val.int_value = agtv_lhs->val.int_value / agtv_rhs->val.int_value; From ce6da4fbe65a2428ade4f7125628b5026cd80491 Mon Sep 17 00:00:00 2001 From: Sean <22557931+sean0407@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:38:20 +0800 Subject: [PATCH 2/2] Fix bigint overflow regression output --- regress/expected/expr.out | 1 - 1 file changed, 1 deletion(-) diff --git a/regress/expected/expr.out b/regress/expected/expr.out index e6f8a8fdc..5db1d1719 100644 --- a/regress/expected/expr.out +++ b/regress/expected/expr.out @@ -31,7 +31,6 @@ SELECT * FROM cypher('expr', $$ RETURN (-9223372036854775807 - 1) / -1 $$) AS (r agtype); ERROR: bigint out of range - -- -- map literal --