From 77abcdc861c24e1c41e8ef82ea89fa55d0149934 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 30 Nov 2022 14:19:08 -0500 Subject: [PATCH 4/5] Add error safety to int4in --- src/backend/utils/adt/int.c | 2 +- src/backend/utils/adt/numutils.c | 28 +++++++++++++++++++++++++++- src/include/utils/builtins.h | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index 42ddae99ef..719a17498d 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -291,7 +291,7 @@ int4in(PG_FUNCTION_ARGS) { char *num = PG_GETARG_CSTRING(0); - PG_RETURN_INT32(pg_strtoint32(num)); + PG_RETURN_INT32(pg_strtoint32_context(num, fcinfo->context)); } /* diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index 834ec0b588..f6d9a75cd8 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -19,6 +19,7 @@ #include #include "common/int.h" +#include "nodes/primnodes.h" #include "utils/builtins.h" #include "port/pg_bitutils.h" @@ -171,8 +172,13 @@ invalid_syntax: * representation of the most negative number, which can't be represented as a * positive number. */ +int32 pg_strtoint32(const char *s) +{ + return pg_strtoint32_context(s, NULL); +} + int32 -pg_strtoint32(const char *s) +pg_strtoint32_context(const char *s, void * context) { const char *ptr = s; int32 tmp = 0; @@ -223,12 +229,32 @@ pg_strtoint32(const char *s) return tmp; out_of_range: + if (context && IsA(context, IOCallContext)) + { + IOCallContext *ioc = (IOCallContext *) context; + if (ioc->no_error_throw) + { + ioc->error_found = true; + return 0; + } + } + ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value \"%s\" is out of range for type %s", s, "integer"))); invalid_syntax: + if (context && IsA(context, IOCallContext)) + { + IOCallContext *ioc = (IOCallContext *) context; + if (ioc->no_error_throw) + { + ioc->error_found = true; + return 0; + } + } + ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type %s: \"%s\"", diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 81631f1645..eb24716a77 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -45,6 +45,7 @@ extern int namestrcmp(Name name, const char *str); /* numutils.c */ extern int16 pg_strtoint16(const char *s); extern int32 pg_strtoint32(const char *s); +extern int32 pg_strtoint32_context(const char *s, void *); extern int64 pg_strtoint64(const char *s); extern int pg_itoa(int16 i, char *a); extern int pg_ultoa_n(uint32 value, char *a); -- 2.34.1