diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/scan.l | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 6c6a6e320f0..74e34df71fa 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -1005,22 +1005,18 @@ other . } {realfail1} { /* - * throw back the [Ee], and treat as {decimal}. Note - * that it is possible the input is actually {integer}, - * but since this case will almost certainly lead to a - * syntax error anyway, we don't bother to distinguish. + * throw back the [Ee], and figure out whether what + * remains is an {integer} or {decimal}. */ yyless(yyleng - 1); SET_YYLLOC(); - yylval->str = pstrdup(yytext); - return FCONST; + return process_integer_literal(yytext, yylval); } {realfail2} { /* throw back the [Ee][+-], and proceed as above */ yyless(yyleng - 2); SET_YYLLOC(); - yylval->str = pstrdup(yytext); - return FCONST; + return process_integer_literal(yytext, yylval); } @@ -1255,6 +1251,10 @@ litbufdup(core_yyscan_t yyscanner) return new; } +/* + * Process {integer}. Note this will also do the right thing with {decimal}, + * ie digits and a decimal point. + */ static int process_integer_literal(const char *token, YYSTYPE *lval) { @@ -1265,7 +1265,7 @@ process_integer_literal(const char *token, YYSTYPE *lval) val = strtoint(token, &endptr, 10); if (*endptr != '\0' || errno == ERANGE) { - /* integer too large, treat it as a float */ + /* integer too large (or contains decimal pt), treat it as a float */ lval->str = pstrdup(token); return FCONST; } |