diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2018-03-13 10:21:09 -0400 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2018-03-13 10:21:09 -0400 |
commit | 17bb62501787c56e0518e61db13a523d47afd724 (patch) | |
tree | fa577a267aac27c99f34b4fef859df43b3362e8e /src/backend | |
parent | 6cf86f435472b27bbc5e22c713bca08aa2d94af7 (diff) | |
download | postgresql-17bb62501787c56e0518e61db13a523d47afd724.tar.gz postgresql-17bb62501787c56e0518e61db13a523d47afd724.zip |
Move strtoint() to common
Several places used similar code to convert a string to an int, so take
the function that we already had and make it globally available.
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/nodes/read.c | 12 | ||||
-rw-r--r-- | src/backend/parser/scan.l | 9 | ||||
-rw-r--r-- | src/backend/utils/adt/datetime.c | 18 |
3 files changed, 10 insertions, 29 deletions
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 6e9fa45e37e..d3c742693bb 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -21,6 +21,7 @@ #include <ctype.h> +#include "common/string.h" #include "nodes/pg_list.h" #include "nodes/readfuncs.h" #include "nodes/value.h" @@ -215,18 +216,15 @@ nodeTokenType(char *token, int length) { /* * Yes. Figure out whether it is integral or float; this requires - * both a syntax check and a range check. strtol() can do both for us. - * We know the token will end at a character that strtol will stop at, + * both a syntax check and a range check. strtoint() can do both for us. + * We know the token will end at a character that strtoint will stop at, * so we do not need to modify the string. */ - long val; char *endptr; errno = 0; - val = strtol(token, &endptr, 10); - if (endptr != token + length || errno == ERANGE || - /* check for overflow of int */ - val != (int) val) + (void) strtoint(token, &endptr, 10); + if (endptr != token + length || errno == ERANGE) return T_Float; return T_Integer; } diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 97d4dee6282..0cd782827ac 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -34,6 +34,7 @@ #include <ctype.h> #include <unistd.h> +#include "common/string.h" #include "parser/gramparse.h" #include "parser/parser.h" /* only needed for GUC variables */ #include "parser/scansup.h" @@ -1211,14 +1212,12 @@ litbufdup(core_yyscan_t yyscanner) static int process_integer_literal(const char *token, YYSTYPE *lval) { - long val; + int val; char *endptr; errno = 0; - val = strtol(token, &endptr, 10); - if (*endptr != '\0' || errno == ERANGE || - /* check for overflow of int */ - val != (int) val) + val = strtoint(token, &endptr, 10); + if (*endptr != '\0' || errno == ERANGE) { /* integer too large, treat it as a float */ lval->str = pstrdup(token); diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 8375b93c397..3f0f65c2956 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -22,6 +22,7 @@ #include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_type.h" +#include "common/string.h" #include "funcapi.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" @@ -252,23 +253,6 @@ static const datetkn *abbrevcache[MAXDATEFIELDS] = {NULL}; /* - * strtoint --- just like strtol, but returns int not long - */ -static int -strtoint(const char *nptr, char **endptr, int base) -{ - long val; - - val = strtol(nptr, endptr, base); -#ifdef HAVE_LONG_INT_64 - if (val != (long) ((int32) val)) - errno = ERANGE; -#endif - return (int) val; -} - - -/* * Calendar time to Julian date conversions. * Julian date is commonly used in astronomical applications, * since it is numerically accurate and computationally simple. |