From 77abcdc861c24e1c41e8ef82ea89fa55d0149934 Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
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 <ctype.h>
 
 #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

