From 7a0f71e430136a3bcec95919149b2a1e1d6e86f5 Mon Sep 17 00:00:00 2001 From: Nikita Glukhov Date: Tue, 30 Aug 2022 00:13:54 +0300 Subject: [PATCH v9 2/9] Add safe input function for int8 --- src/backend/utils/adt/numutils.c | 20 +++++++++++++++++++- src/include/utils/builtins.h | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index cc3f95d3990..b82b30f9013 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -248,7 +248,7 @@ invalid_syntax: * positive number. */ int64 -pg_strtoint64(const char *s) +pg_strtoint64_opt_error(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,12 @@ invalid_syntax: return 0; /* keep compiler quiet */ } +int64 +pg_strtoint64(const char *s) +{ + return pg_strtoint64_opt_error(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