Change internal integer representation of Value node
authorPeter Eisentraut <peter_e@gmx.net>
Mon, 12 Mar 2018 16:17:58 +0000 (12:17 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 13 Mar 2018 13:56:25 +0000 (09:56 -0400)
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.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
src/backend/nodes/outfuncs.c
src/backend/nodes/read.c
src/backend/nodes/value.c
src/backend/parser/scan.l
src/backend/utils/misc/guc.c
src/include/nodes/value.h
src/interfaces/ecpg/preproc/pgc.l

index 1785ea391863356c987269fefe975d498b592a09..fd8089195484f3536cc56a479ac698e246bac7c3 100644 (file)
@@ -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:
 
index 76414029d83cd466be3cbf0f56f34cd818bdc0f2..6e9fa45e37e37ff91c000e48d844d629b2b69f18 100644 (file)
@@ -224,13 +224,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 int */
+           val != (int) val)
            return T_Float;
        return T_Integer;
    }
@@ -387,9 +383,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:
            {
index 8f0428fce12c266371dbf14fed430ba2af9dc697..2a30307baf4b4c8560d1b22f664d3e0d1a2e2314 100644 (file)
@@ -20,7 +20,7 @@
  * makeInteger
  */
 Value *
-makeInteger(long i)
+makeInteger(int i)
 {
    Value      *v = makeNode(Value);
 
index eedef7c00520f806e05f720bf9d434d1f32bb6dc..97d4dee6282859dc7f5f26069dae66e32e7b3b56 100644 (file)
@@ -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 int */
+       val != (int) val)
    {
        /* integer too large, treat it as a float */
        lval->str = pstrdup(token);
index a4f9b3668e0d0958541b45bafa2270a816b90640..fc3e10c7509540d565b5fa58a47d935955993fa6 100644 (file)
@@ -6913,7 +6913,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 */
index 94d09e176eee58275fdf9f1682408c81b1b51463..1665714515373396eca661e8217760e3809d091a 100644 (file)
@@ -34,7 +34,7 @@
  * better to use the more general representation.)
  *
  * Note that an integer-looking string will get lexed as T_Float if
- * the value is too large to fit in a 'long'.
+ * the value is too large to fit in an 'int'.
  *
  * Nulls, of course, don't need the value part at all.
  *----------------------
@@ -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);
index e99b7ff5863177caa123cd6bd97ad0b9285a134e..ba1798c77eb252cbe3c82581b92a12107609fdcb 100644 (file)
@@ -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 int */
+                           val != (int) val)
                        {
                            errno = 0;
                            base_yylval.str = mm_strdup(yytext);