Add numeric_int8_opt_error() to optionally suppress errors
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 3 Jan 2024 09:05:35 +0000 (10:05 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 3 Jan 2024 09:05:35 +0000 (10:05 +0100)
This matches the existing numeric_int4_opt_error() (see commit
16d489b0fe).  It will be used by a future JSON-related patch, which
wants to report errors in its own way and thus does not want the
internal functions to throw any error.

Author: Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/flat/CAM2+6=XjTyqrrqHAOj80r0wVQxJSxc0iyib9bPC55uFO9VKatg@mail.gmail.com

src/backend/utils/adt/numeric.c
src/include/utils/numeric.h

index bf61fd7dbc09f6ede5799b0eaa00c306e31a1aa1..2a2969094924dc46d65a605a3b37aa1f3e9293f2 100644 (file)
@@ -4430,35 +4430,62 @@ int8_numeric(PG_FUNCTION_ARGS)
    PG_RETURN_NUMERIC(int64_to_numeric(val));
 }
 
-
-Datum
-numeric_int8(PG_FUNCTION_ARGS)
+int64
+numeric_int8_opt_error(Numeric num, bool *have_error)
 {
-   Numeric     num = PG_GETARG_NUMERIC(0);
    NumericVar  x;
    int64       result;
 
+   if (have_error)
+       *have_error = false;
+
    if (NUMERIC_IS_SPECIAL(num))
    {
-       if (NUMERIC_IS_NAN(num))
-           ereport(ERROR,
-                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                    errmsg("cannot convert NaN to %s", "bigint")));
+       if (have_error)
+       {
+           *have_error = true;
+           return 0;
+       }
        else
-           ereport(ERROR,
-                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                    errmsg("cannot convert infinity to %s", "bigint")));
+       {
+           if (NUMERIC_IS_NAN(num))
+               ereport(ERROR,
+                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                        errmsg("cannot convert NaN to %s", "bigint")));
+           else
+               ereport(ERROR,
+                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                        errmsg("cannot convert infinity to %s", "bigint")));
+       }
    }
 
-   /* Convert to variable format and thence to int8 */
+   /* Convert to variable format, then convert to int8 */
    init_var_from_num(num, &x);
 
    if (!numericvar_to_int64(&x, &result))
-       ereport(ERROR,
-               (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-                errmsg("bigint out of range")));
+   {
+       if (have_error)
+       {
+           *have_error = true;
+           return 0;
+       }
+       else
+       {
+           ereport(ERROR,
+                   (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+                    errmsg("bigint out of range")));
+       }
+   }
+
+   return result;
+}
+
+Datum
+numeric_int8(PG_FUNCTION_ARGS)
+{
+   Numeric     num = PG_GETARG_NUMERIC(0);
 
-   PG_RETURN_INT64(result);
+   PG_RETURN_INT64(numeric_int8_opt_error(num, NULL));
 }
 
 
index 08e4f8c217de7221ad8da8d0f156a9f2e03b9c65..0780b52094d32384e4f93c806698d09c0cc92e1c 100644 (file)
@@ -101,5 +101,6 @@ extern Numeric numeric_div_opt_error(Numeric num1, Numeric num2,
 extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2,
                                     bool *have_error);
 extern int32 numeric_int4_opt_error(Numeric num, bool *have_error);
+extern int64 numeric_int8_opt_error(Numeric num, bool *have_error);
 
 #endif                         /* _PG_NUMERIC_H_ */