From 7b4c734c456466b9c66044b828f885ec7d20874a Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Wed, 12 May 1999 07:12:51 +0000 Subject: [PATCH] Keep long non-quoted numeric strings *as* untyped strings if they fail the obvious conversion. Define a new pattern "decimal" which is non-exponential floating point for use with numeric() and decimal() types. --- src/backend/parser/scan.l | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 7383af0b91..aa3de4e595 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -37,6 +37,11 @@ #endif #define YY_READ_BUF_SIZE MAX_PARSE_BUFFER +#ifdef YY_READ_BUF_SIZE +#undef YY_READ_BUF_SIZE +#endif +#define YY_READ_BUF_SIZE MAX_PARSE_BUFFER + extern char *parseString; static char *parseCh; @@ -157,10 +162,11 @@ operator {op_and_self}+ xmstop - integer [\-]?{digit}+ +decimal [\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*)) +real [\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+)) /* -real [\-]?{digit}+\.{digit}+([Ee][-+]?{digit}+)? -*/ real [\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+)) +*/ param \${integer} @@ -339,15 +345,35 @@ other . if (*endptr != '\0' || errno == ERANGE) { errno = 0; +#if 0 yylval.dval = strtod(((char *)yytext),&endptr); if (*endptr != '\0' || errno == ERANGE) elog(ERROR,"Bad integer input '%s'",yytext); CheckFloat8Val(yylval.dval); elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext); return FCONST; +#endif + yylval.str = pstrdup((char*)yytext); + return SCONST; } return ICONST; } +{decimal}/{space}*-{number} { + char* endptr; + + BEGIN(xm); + if (strlen((char *)yytext) <= 17) + { + errno = 0; + yylval.dval = strtod(((char *)yytext),&endptr); + if (*endptr != '\0' || errno == ERANGE) + elog(ERROR,"Bad float8 input '%s'",yytext); + CheckFloat8Val(yylval.dval); + return FCONST; + } + yylval.str = pstrdup((char*)yytext); + return SCONST; + } {real}/{space}*-{number} { char* endptr; @@ -367,15 +393,34 @@ other . if (*endptr != '\0' || errno == ERANGE) { errno = 0; +#if 0 yylval.dval = strtod(((char *)yytext),&endptr); if (*endptr != '\0' || errno == ERANGE) elog(ERROR,"Bad integer input '%s'",yytext); CheckFloat8Val(yylval.dval); elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext); return FCONST; +#endif + yylval.str = pstrdup((char*)yytext); + return SCONST; } return ICONST; } +{decimal} { + char* endptr; + + if (strlen((char *)yytext) <= 17) + { + errno = 0; + yylval.dval = strtod((char *)yytext,&endptr); + if (*endptr != '\0' || errno == ERANGE) + elog(ERROR,"Bad float input '%s'",yytext); + CheckFloat8Val(yylval.dval); + return FCONST; + } + yylval.str = pstrdup((char*)yytext); + return SCONST; + } {real} { char* endptr; -- 2.39.5