From 656ee8489053aafc85324b9ef7e91b645674ffb9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 29 Mar 2016 00:53:53 -0400 Subject: [PATCH] Fix portability issues in 86c43f4e22c0771fd0cc6bce2799802c894ee2ec. INT64_MIN/MAX should be spelled PG_INT64_MIN/MAX, per well established convention in our sources. Less obviously, a symbol named DOUBLE causes problems on Windows builds, so rename that to DOUBLE_CONST; and rename INTEGER to INTEGER_CONST for consistency. Also, get rid of incorrect/obsolete hand-munging of yycolumn, and fix the grammar for float constants to handle expected cases such as ".1". First two items by Michael Paquier, second two by me. --- src/bin/pgbench/exprparse.y | 10 +++++----- src/bin/pgbench/exprscan.l | 9 ++++++--- src/bin/pgbench/pgbench.c | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y index 877244852d..64c29dcfa7 100644 --- a/src/bin/pgbench/exprparse.y +++ b/src/bin/pgbench/exprparse.y @@ -47,11 +47,11 @@ static PgBenchExpr *make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList * %type elist %type expr -%type INTEGER function -%type DOUBLE +%type INTEGER_CONST function +%type DOUBLE_CONST %type VARIABLE FUNCTION -%token INTEGER DOUBLE VARIABLE FUNCTION +%token INTEGER_CONST DOUBLE_CONST VARIABLE FUNCTION /* Precedence: lowest to highest */ %left '+' '-' @@ -76,8 +76,8 @@ expr: '(' expr ')' { $$ = $2; } | expr '*' expr { $$ = make_op(yyscanner, "*", $1, $3); } | expr '/' expr { $$ = make_op(yyscanner, "/", $1, $3); } | expr '%' expr { $$ = make_op(yyscanner, "%", $1, $3); } - | INTEGER { $$ = make_integer_constant($1); } - | DOUBLE { $$ = make_double_constant($1); } + | INTEGER_CONST { $$ = make_integer_constant($1); } + | DOUBLE_CONST { $$ = make_double_constant($1); } | VARIABLE { $$ = make_variable($1); } | function '(' elist ')' { $$ = make_func(yyscanner, $1, $3); } ; diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l index d8b706a99b..20891a3b22 100644 --- a/src/bin/pgbench/exprscan.l +++ b/src/bin/pgbench/exprscan.l @@ -123,12 +123,15 @@ newline [\n] } {digit}+ { yylval->ival = strtoint64(yytext); - return INTEGER; + return INTEGER_CONST; } {digit}+(\.{digit}*)?([eE][-+]?{digit}+)? { - yycolumn += yyleng; yylval->dval = atof(yytext); - return DOUBLE; + return DOUBLE_CONST; + } +\.{digit}+([eE][-+]?{digit}+)? { + yylval->dval = atof(yytext); + return DOUBLE_CONST; } {alpha}{alnum}* { yylval->str = pg_strdup(yytext); diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index a2df4df20d..4cd5513fc6 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -1043,7 +1043,7 @@ coerceToInt(PgBenchValue *pval, int64 *ival) { double dval = pval->u.dval; Assert(pval->type == PGBT_DOUBLE); - if (dval < INT64_MIN || INT64_MAX < dval) + if (dval < PG_INT64_MIN || PG_INT64_MAX < dval) { fprintf(stderr, "double to int overflow for %f\n", dval); return false;