From ae964e316ba565febb4dd3bc8d1c5e32499aee51 Mon Sep 17 00:00:00 2001 From: jian he Date: Wed, 25 Mar 2026 16:19:39 +0800 Subject: [PATCH v25 3/9] extended function for float overflow/underflow/zero_divide float_overflow_error_ext, float_underflow_error_ext, float_zero_divide_error_ext. Author: jian he Discussion: https://postgr.es/m/CADkLM=fv1JfY4Ufa-jcwwNbjQixNViskQ8jZu3Tz_p656i_4hQ@mail.gmail.com Commitfest: https://commitfest.postgresql.org/patch/5941 --- src/backend/utils/adt/float.c | 24 ++++++++++++++++++++++++ src/include/utils/float.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index a06fef42901..7b1bdf1e574 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -123,6 +123,30 @@ float_zero_divide_error(void) errmsg("division by zero"))); } +float8 +float_overflow_error_ext(struct Node *escontext) +{ + ereturn(escontext, 0.0, + errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("value out of range: overflow")); +} + +float8 +float_underflow_error_ext(struct Node *escontext) +{ + ereturn(escontext, 0.0, + errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("value out of range: underflow")); +} + +float8 +float_zero_divide_error_ext(struct Node *escontext) +{ + ereturn(escontext, 0.0, + (errcode(ERRCODE_DIVISION_BY_ZERO), + errmsg("division by zero"))); +} + /* * Returns -1 if 'val' represents negative infinity, 1 if 'val' diff --git a/src/include/utils/float.h b/src/include/utils/float.h index b340678ca92..5840bbf7dc8 100644 --- a/src/include/utils/float.h +++ b/src/include/utils/float.h @@ -33,6 +33,9 @@ extern PGDLLIMPORT int extra_float_digits; pg_noreturn extern void float_overflow_error(void); pg_noreturn extern void float_underflow_error(void); pg_noreturn extern void float_zero_divide_error(void); +extern float8 float_overflow_error_ext(struct Node *escontext); +extern float8 float_underflow_error_ext(struct Node *escontext); +extern float8 float_zero_divide_error_ext(struct Node *escontext); extern int is_infinite(float8 val); extern float8 float8in_internal(char *num, char **endptr_p, const char *type_name, const char *orig_string, -- 2.34.1