v10-0002-Add-safe-input-function-for-int8.patch
text/x-patch
Filename: v10-0002-Add-safe-input-function-for-int8.patch
Type: text/x-patch
Part: 1
Message:
Re: SQL/JSON features for v15
Patch
Format: format-patch
Series: patch v10-0002
Subject: Add safe input function for int8
| File | + | − |
|---|---|---|
| src/backend/utils/adt/numutils.c | 26 | 2 |
| src/include/utils/builtins.h | 1 | 0 |
From 2bfad0c91cf0f30905867861ee7238f2d05361b1 Mon Sep 17 00:00:00 2001
From: Nikita Glukhov <n.gluhov@postgrespro.ru>
Date: Tue, 30 Aug 2022 00:13:54 +0300
Subject: [PATCH v10 02/10] Add safe input function for int8
---
src/backend/utils/adt/numutils.c | 28 ++++++++++++++++++++++++++--
src/include/utils/builtins.h | 1 +
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c
index cc3f95d3990..1ad44e9bf31 100644
--- a/src/backend/utils/adt/numutils.c
+++ b/src/backend/utils/adt/numutils.c
@@ -247,8 +247,8 @@ invalid_syntax:
* representation of the most negative number, which can't be represented as a
* positive number.
*/
-int64
-pg_strtoint64(const char *s)
+static inline int64
+pg_strtoint64_internal(const char *s, bool *error)
{
const char *ptr = s;
int64 tmp = 0;
@@ -307,12 +307,24 @@ pg_strtoint64(const char *s)
return tmp;
out_of_range:
+ if (error)
+ {
+ *error = true;
+ return 0;
+ }
+
ereport(ERROR,
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
errmsg("value \"%s\" is out of range for type %s",
s, "bigint")));
invalid_syntax:
+ if (error)
+ {
+ *error = true;
+ return 0;
+ }
+
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for type %s: \"%s\"",
@@ -321,6 +333,18 @@ invalid_syntax:
return 0; /* keep compiler quiet */
}
+int64
+pg_strtoint64_opt_error(const char *s, bool *error)
+{
+ return pg_strtoint64_internal(s, error);
+}
+
+int64
+pg_strtoint64(const char *s)
+{
+ return pg_strtoint64_internal(s, NULL);
+}
+
/*
* pg_itoa: converts a signed 16-bit integer to its string representation
* and returns strlen(a).
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 2c03ce4fe12..5e1aa37c1f5 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -47,6 +47,7 @@ extern int namestrcmp(Name name, const char *str);
extern int16 pg_strtoint16(const char *s);
extern int32 pg_strtoint32(const char *s);
extern int64 pg_strtoint64(const char *s);
+extern int64 pg_strtoint64_opt_error(const char *s, bool *error);
extern int pg_itoa(int16 i, char *a);
extern int pg_ultoa_n(uint32 l, char *a);
extern int pg_ulltoa_n(uint64 l, char *a);
--
2.17.1