aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2018-03-13 10:21:09 -0400
committerPeter Eisentraut <peter_e@gmx.net>2018-03-13 10:21:09 -0400
commit17bb62501787c56e0518e61db13a523d47afd724 (patch)
treefa577a267aac27c99f34b4fef859df43b3362e8e /src/backend
parent6cf86f435472b27bbc5e22c713bca08aa2d94af7 (diff)
downloadpostgresql-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.c12
-rw-r--r--src/backend/parser/scan.l9
-rw-r--r--src/backend/utils/adt/datetime.c18
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.