From dcbc44a62d06d660314305dff4919041b7408f63 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 30 Dec 2021 10:26:37 +0100 Subject: [PATCH v7 3/7] Remove pg_atoi() The last caller was int2vectorin(), and having such a general function for one user didn't seem useful, so just put the required parts inline and remove the function. --- src/backend/utils/adt/int.c | 32 ++++++++++-- src/backend/utils/adt/numutils.c | 88 -------------------------------- src/include/utils/builtins.h | 1 - 3 files changed, 28 insertions(+), 93 deletions(-) diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index 8bd234c11c..42ddae99ef 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -146,15 +146,39 @@ int2vectorin(PG_FUNCTION_ARGS) result = (int2vector *) palloc0(Int2VectorSize(FUNC_MAX_ARGS)); - for (n = 0; *intString && n < FUNC_MAX_ARGS; n++) + for (n = 0; n < FUNC_MAX_ARGS; n++) { + long l; + char *endp; + while (*intString && isspace((unsigned char) *intString)) intString++; if (*intString == '\0') break; - result->values[n] = pg_atoi(intString, sizeof(int16), ' '); - while (*intString && !isspace((unsigned char) *intString)) - intString++; + + errno = 0; + l = strtol(intString, &endp, 10); + + if (intString == endp) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "smallint", intString))); + + if (errno == ERANGE || l < SHRT_MIN || l > SHRT_MAX) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("value \"%s\" is out of range for type %s", intString, + "smallint"))); + + if (*endp && *endp != ' ') + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "integer", intString))); + + result->values[n] = l; + intString = endp; } while (*intString && isspace((unsigned char) *intString)) intString++; diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index e82d23a325..cc3f95d399 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -85,94 +85,6 @@ decimalLength64(const uint64 v) return t + (v >= PowersOfTen[t]); } -/* - * pg_atoi: convert string to integer - * - * allows any number of leading or trailing whitespace characters. - * - * 'size' is the sizeof() the desired integral result (1, 2, or 4 bytes). - * - * c, if not 0, is a terminator character that may appear after the - * integer (plus whitespace). If 0, the string must end after the integer. - * - * Unlike plain atoi(), this will throw ereport() upon bad input format or - * overflow. - */ -int32 -pg_atoi(const char *s, int size, int c) -{ - long l; - char *badp; - - /* - * Some versions of strtol treat the empty string as an error, but some - * seem not to. Make an explicit test to be sure we catch it. - */ - if (s == NULL) - elog(ERROR, "NULL pointer"); - if (*s == 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for type %s: \"%s\"", - "integer", s))); - - errno = 0; - l = strtol(s, &badp, 10); - - /* We made no progress parsing the string, so bail out */ - if (s == badp) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for type %s: \"%s\"", - "integer", s))); - - switch (size) - { - case sizeof(int32): - if (errno == ERANGE -#if defined(HAVE_LONG_INT_64) - /* won't get ERANGE on these with 64-bit longs... */ - || l < INT_MIN || l > INT_MAX -#endif - ) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("value \"%s\" is out of range for type %s", s, - "integer"))); - break; - case sizeof(int16): - if (errno == ERANGE || l < SHRT_MIN || l > SHRT_MAX) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("value \"%s\" is out of range for type %s", s, - "smallint"))); - break; - case sizeof(int8): - if (errno == ERANGE || l < SCHAR_MIN || l > SCHAR_MAX) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("value \"%s\" is out of range for 8-bit integer", s))); - break; - default: - elog(ERROR, "unsupported result size: %d", size); - } - - /* - * Skip any trailing whitespace; if anything but whitespace remains before - * the terminating character, bail out - */ - while (*badp && *badp != c && isspace((unsigned char) *badp)) - badp++; - - if (*badp && *badp != c) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid input syntax for type %s: \"%s\"", - "integer", s))); - - return (int32) l; -} - /* * Convert input string to a signed 16 bit integer. * diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 191cc854a3..58abf4364a 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -43,7 +43,6 @@ extern void namestrcpy(Name name, const char *str); extern int namestrcmp(Name name, const char *str); /* numutils.c */ -extern int32 pg_atoi(const char *s, int size, int c); extern int16 pg_strtoint16(const char *s); extern int32 pg_strtoint32(const char *s); extern int64 pg_strtoint64(const char *s); -- 2.34.1