From 7f642b8ff7220914f3636e3cb3ec0fbf59bebb6f Mon Sep 17 00:00:00 2001 From: Vladimir Rachkin Date: Wed, 11 Dec 2024 11:41:30 +0300 Subject: [PATCH] Adapt some casts for "soft" error handling --- src/backend/utils/adt/int.c | 4 ++-- src/backend/utils/adt/numutils.c | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index b8f56e5c2e1..705b550523b 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -282,7 +282,7 @@ int4in(PG_FUNCTION_ARGS) { char *num = PG_GETARG_CSTRING(0); - PG_RETURN_INT32(pg_atoi(num, sizeof(int32), '\0')); + PG_RETURN_INT32(pg_atoi_safe(num, sizeof(int32), '\0', fcinfo->context)); } /* @@ -344,7 +344,7 @@ i4toi2(PG_FUNCTION_ARGS) int32 arg1 = PG_GETARG_INT32(0); if (arg1 < SHRT_MIN || arg1 > SHRT_MAX) - ereport(ERROR, + ereturn(fcinfo->context, 0, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("smallint out of range"))); diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index ca5a8a576cb..e5274d4cf06 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -35,6 +35,12 @@ */ int32 pg_atoi(char *s, int size, int c) +{ + return pg_atoi_safe(s, size, c, NULL); +} + +int32 +pg_atoi_safe(char *s, int size, int c, Node *escontext) { long l; char *badp; @@ -46,7 +52,7 @@ pg_atoi(char *s, int size, int c) if (s == NULL) elog(ERROR, "NULL pointer"); if (*s == 0) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for integer: \"%s\"", s))); @@ -56,7 +62,7 @@ pg_atoi(char *s, int size, int c) /* We made no progress parsing the string, so bail out */ if (s == badp) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for integer: \"%s\"", s))); @@ -70,19 +76,19 @@ pg_atoi(char *s, int size, int c) || l < INT_MIN || l > INT_MAX #endif ) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value \"%s\" is out of range for type integer", s))); break; case sizeof(int16): if (errno == ERANGE || l < SHRT_MIN || l > SHRT_MAX) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value \"%s\" is out of range for type smallint", s))); break; case sizeof(int8): if (errno == ERANGE || l < SCHAR_MIN || l > SCHAR_MAX) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value \"%s\" is out of range for 8-bit integer", s))); break; @@ -98,7 +104,7 @@ pg_atoi(char *s, int size, int c) badp++; if (*badp && *badp != c) - ereport(ERROR, + ereturn(escontext, 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for integer: \"%s\"", s)));