From 04808be3b435e48ddad6b98a3d86b4d79911e4bf Mon Sep 17 00:00:00 2001 From: jian he Date: Wed, 25 Mar 2026 16:26:30 +0800 Subject: [PATCH v25 4/9] introduce float8 safe function this patch introduce the following function: float8_pl_safe float8_mi_safe float8_mul_safe float8_div_safe refactoring existing function is be too invasive. thus add these new functions. It's very similar to existing non-safe version functions. Author: jian he Reviewed-by: Amul Sul Reviewed-by: Corey Huinker Discussion: https://postgr.es/m/CADkLM=fv1JfY4Ufa-jcwwNbjQixNViskQ8jZu3Tz_p656i_4hQ@mail.gmail.com Commitfest: https://commitfest.postgresql.org/patch/5941 --- src/include/utils/float.h | 66 ++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/src/include/utils/float.h b/src/include/utils/float.h index 5840bbf7dc8..ffa743d6273 100644 --- a/src/include/utils/float.h +++ b/src/include/utils/float.h @@ -112,16 +112,22 @@ float4_pl(const float4 val1, const float4 val2) return result; } +static inline float8 +float8_pl_safe(const float8 val1, const float8 val2, struct Node *escontext) +{ + float8 result; + + result = val1 + val2; + if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2)) + return float_overflow_error_ext(escontext); + + return result; +} + static inline float8 float8_pl(const float8 val1, const float8 val2) { - float8 result; - - result = val1 + val2; - if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2)) - float_overflow_error(); - - return result; + return float8_pl_safe(val1, val2, NULL); } static inline float4 @@ -136,16 +142,22 @@ float4_mi(const float4 val1, const float4 val2) return result; } +static inline float8 +float8_mi_safe(const float8 val1, const float8 val2, struct Node *escontext) +{ + float8 result; + + result = val1 - val2; + if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2)) + return float_overflow_error_ext(escontext); + + return result; +} + static inline float8 float8_mi(const float8 val1, const float8 val2) { - float8 result; - - result = val1 - val2; - if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2)) - float_overflow_error(); - - return result; + return float8_mi_safe(val1, val2, NULL); } static inline float4 @@ -163,19 +175,25 @@ float4_mul(const float4 val1, const float4 val2) } static inline float8 -float8_mul(const float8 val1, const float8 val2) +float8_mul_safe(const float8 val1, const float8 val2, struct Node *escontext) { float8 result; result = val1 * val2; if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2)) - float_overflow_error(); + return float_overflow_error_ext(escontext); if (unlikely(result == 0.0) && val1 != 0.0 && val2 != 0.0) - float_underflow_error(); + return float_underflow_error_ext(escontext); return result; } +static inline float8 +float8_mul(const float8 val1, const float8 val2) +{ + return float8_mul_safe(val1, val2, NULL); +} + static inline float4 float4_div(const float4 val1, const float4 val2) { @@ -193,21 +211,27 @@ float4_div(const float4 val1, const float4 val2) } static inline float8 -float8_div(const float8 val1, const float8 val2) +float8_div_safe(const float8 val1, const float8 val2, struct Node *escontext) { float8 result; if (unlikely(val2 == 0.0) && !isnan(val1)) - float_zero_divide_error(); + return float_zero_divide_error_ext(escontext); result = val1 / val2; if (unlikely(isinf(result)) && !isinf(val1)) - float_overflow_error(); + return float_overflow_error_ext(escontext); if (unlikely(result == 0.0) && val1 != 0.0 && !isinf(val2)) - float_underflow_error(); + return float_underflow_error_ext(escontext); return result; } +static inline float8 +float8_div(const float8 val1, const float8 val2) +{ + return float8_div_safe(val1, val2, NULL); +} + /* * Routines for NaN-aware comparisons * -- 2.34.1