diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index dcec3b728f2..76cff8a2b15 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -80,7 +80,7 @@ #define READ_UINT64_FIELD(fldname) \ token = pg_strtok(&length); /* skip :fldname */ \ token = pg_strtok(&length); /* get field value */ \ - local_node->fldname = pg_strtouint64(token, NULL, 10) + local_node->fldname = strtou64(token, NULL, 10) /* Read a long integer field (anything written as ":fldname %ld") */ #define READ_LONG_FIELD(fldname) \ diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index b93096f288f..6a9c00fdd3e 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -606,25 +606,3 @@ pg_ultostr(char *str, uint32 value) return str + len; } - -/* - * pg_strtouint64 - * Converts 'str' into an unsigned 64-bit integer. - * - * This has the identical API to strtoul(3), except that it will handle - * 64-bit ints even where "long" is narrower than that. - * - * For the moment it seems sufficient to assume that the platform has - * such a function somewhere; let's not roll our own. - */ -uint64 -pg_strtouint64(const char *str, char **endptr, int base) -{ -#ifdef _MSC_VER /* MSVC only */ - return _strtoui64(str, endptr, base); -#elif defined(HAVE_STRTOULL) && SIZEOF_LONG < 8 - return strtoull(str, endptr, base); -#else - return strtoul(str, endptr, base); -#endif -} diff --git a/src/backend/utils/adt/xid.c b/src/backend/utils/adt/xid.c index 24c1c937326..a09096d0187 100644 --- a/src/backend/utils/adt/xid.c +++ b/src/backend/utils/adt/xid.c @@ -158,7 +158,7 @@ xid8in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); - PG_RETURN_FULLTRANSACTIONID(FullTransactionIdFromU64(pg_strtouint64(str, NULL, 0))); + PG_RETURN_FULLTRANSACTIONID(FullTransactionIdFromU64(strtou64(str, NULL, 0))); } Datum diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c index f1870a73668..68985dca5a6 100644 --- a/src/backend/utils/adt/xid8funcs.c +++ b/src/backend/utils/adt/xid8funcs.c @@ -295,12 +295,12 @@ parse_snapshot(const char *str) char *endp; StringInfo buf; - xmin = FullTransactionIdFromU64(pg_strtouint64(str, &endp, 10)); + xmin = FullTransactionIdFromU64(strtou64(str, &endp, 10)); if (*endp != ':') goto bad_format; str = endp + 1; - xmax = FullTransactionIdFromU64(pg_strtouint64(str, &endp, 10)); + xmax = FullTransactionIdFromU64(strtou64(str, &endp, 10)); if (*endp != ':') goto bad_format; str = endp + 1; @@ -318,7 +318,7 @@ parse_snapshot(const char *str) while (*str != '\0') { /* read next value */ - val = FullTransactionIdFromU64(pg_strtouint64(str, &endp, 10)); + val = FullTransactionIdFromU64(strtou64(str, &endp, 10)); str = endp; /* require the input to be in order */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index f736e8d8725..7b030463013 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -12438,7 +12438,7 @@ check_recovery_target_xid(char **newval, void **extra, GucSource source) TransactionId *myextra; errno = 0; - xid = (TransactionId) pg_strtouint64(*newval, NULL, 0); + xid = (TransactionId) strtou64(*newval, NULL, 0); if (errno == EINVAL || errno == ERANGE) return false; diff --git a/src/include/c.h b/src/include/c.h index 7e591171a84..98c0b053c98 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1312,6 +1312,19 @@ extern long long strtoll(const char *str, char **endptr, int base); extern unsigned long long strtoull(const char *str, char **endptr, int base); #endif +/* + * Thin wrappers that convert strings to exactly 64-bit integers, matching our + * definition of int64. (For the naming, compare that POSIX has + * strtoimax()/strtoumax() which return intmax_t/uintmax_t.) + */ +#ifdef HAVE_LONG_INT_64 +#define strtoi64(str, endptr, base) ((int64) strtol(str, endptr, base)) +#define strtou64(str, endptr, base) ((uint64) strtoul(str, endptr, base)) +#else +#define strtoi64(str, endptr, base) ((int64) strtoll(str, endptr, base)) +#define strtou64(str, endptr, base) ((uint64) strtoull(str, endptr, base)) +#endif + /* * Use "extern PGDLLIMPORT ..." to declare variables that are defined * in the core backend and need to be accessible by loadable modules. diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 40fcb0ab6d7..b07eefaf1ed 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -53,7 +53,6 @@ extern int pg_ltoa(int32 l, char *a); extern int pg_lltoa(int64 ll, char *a); extern char *pg_ultostr_zeropad(char *str, uint32 value, int32 minwidth); extern char *pg_ultostr(char *str, uint32 value); -extern uint64 pg_strtouint64(const char *str, char **endptr, int base); /* oid.c */ extern oidvector *buildoidvector(const Oid *oids, int n);