From c18328493a4a241164416a3a304ef3c22bd92ee2 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 7 Mar 2018 14:42:17 -0500 Subject: [PATCH 2/2] Change internal integer representation of Value node A Value node would store an integer as a long. This causes needless portability risks, as long can be of varying sizes. Change it to use int instead. All code using this was already careful to only store 32-bit values anyway. --- src/backend/nodes/outfuncs.c | 2 +- src/backend/nodes/read.c | 13 +++++-------- src/backend/nodes/value.c | 2 +- src/backend/parser/scan.l | 9 +++------ src/backend/utils/misc/guc.c | 2 +- src/include/nodes/value.h | 4 ++-- src/interfaces/ecpg/preproc/pgc.l | 9 +++------ 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 1785ea3918..fd80891954 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -3235,7 +3235,7 @@ _outValue(StringInfo str, const Value *value) switch (value->type) { case T_Integer: - appendStringInfo(str, "%ld", value->val.ival); + appendStringInfo(str, "%d", value->val.ival); break; case T_Float: diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 76414029d8..b2ba736b8f 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -225,12 +225,9 @@ nodeTokenType(char *token, int length) errno = 0; val = strtol(token, &endptr, 10); (void) val; /* avoid compiler warning if unused */ - if (endptr != token + length || errno == ERANGE -#ifdef HAVE_LONG_INT_64 - /* if long > 32 bits, check for overflow of int4 */ - || val != (long) ((int32) val) -#endif - ) + if (endptr != token + length || errno == ERANGE || + /* check for overflow of int4 */ + val != (long) ((int32) val)) return T_Float; return T_Integer; } @@ -387,9 +384,9 @@ nodeRead(char *token, int tok_len) case T_Integer: /* - * we know that the token terminates on a char atol will stop at + * we know that the token terminates on a char atoi will stop at */ - result = (Node *) makeInteger(atol(token)); + result = (Node *) makeInteger(atoi(token)); break; case T_Float: { diff --git a/src/backend/nodes/value.c b/src/backend/nodes/value.c index 8f0428fce1..2a30307baf 100644 --- a/src/backend/nodes/value.c +++ b/src/backend/nodes/value.c @@ -20,7 +20,7 @@ * makeInteger */ Value * -makeInteger(long i) +makeInteger(int i) { Value *v = makeNode(Value); diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index eedef7c005..c3a904b562 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -1216,12 +1216,9 @@ process_integer_literal(const char *token, YYSTYPE *lval) errno = 0; val = strtol(token, &endptr, 10); - if (*endptr != '\0' || errno == ERANGE -#ifdef HAVE_LONG_INT_64 - /* if long > 32 bits, check for overflow of int4 */ - || val != (long) ((int32) val) -#endif - ) + if (*endptr != '\0' || errno == ERANGE || + /* check for overflow of int4 */ + val != (long) ((int32) val)) { /* integer too large, treat it as a float */ lval->str = pstrdup(token); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 0c4cc9160d..78c9ab7f4d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -6912,7 +6912,7 @@ flatten_set_variable_args(const char *name, List *args) switch (nodeTag(&con->val)) { case T_Integer: - appendStringInfo(&buf, "%ld", intVal(&con->val)); + appendStringInfo(&buf, "%d", intVal(&con->val)); break; case T_Float: /* represented as a string, so just copy it */ diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h index 94d09e176e..cef97812ef 100644 --- a/src/include/nodes/value.h +++ b/src/include/nodes/value.h @@ -44,7 +44,7 @@ typedef struct Value NodeTag type; /* tag appropriately (eg. T_String) */ union ValUnion { - long ival; /* machine integer */ + int ival; /* machine integer */ char *str; /* string */ } val; } Value; @@ -53,7 +53,7 @@ typedef struct Value #define floatVal(v) atof(((Value *)(v))->val.str) #define strVal(v) (((Value *)(v))->val.str) -extern Value *makeInteger(long i); +extern Value *makeInteger(int i); extern Value *makeFloat(char *numericStr); extern Value *makeString(char *str); extern Value *makeBitString(char *str); diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index e99b7ff586..b02fe47ab5 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -732,12 +732,9 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ errno = 0; val = strtol((char *)yytext, &endptr,10); - if (*endptr != '\0' || errno == ERANGE -#ifdef HAVE_LONG_INT_64 - /* if long > 32 bits, check for overflow of int4 */ - || val != (long) ((int32) val) -#endif - ) + if (*endptr != '\0' || errno == ERANGE || + /* check for overflow of int4 */ + val != (long) ((int32) val)) { errno = 0; base_yylval.str = mm_strdup(yytext); -- 2.16.2