Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8d21a6e

Browse files
author
Thomas G. Lockhart
committed
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.
1 parent a36a7a1 commit 8d21a6e

File tree

1 file changed

+48
-3
lines changed

1 file changed

+48
-3
lines changed

src/backend/parser/scan.l

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.48 1999/05/03 19:09:42 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.49 1999/05/12 07:12:51 thomas Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -37,6 +37,11 @@
3737
#endif
3838
#define YY_READ_BUF_SIZE MAX_PARSE_BUFFER
3939

40+
#ifdef YY_READ_BUF_SIZE
41+
#undef YY_READ_BUF_SIZE
42+
#endif
43+
#define YY_READ_BUF_SIZE MAX_PARSE_BUFFER
44+
4045
extern char *parseString;
4146
static char *parseCh;
4247

@@ -157,10 +162,11 @@ operator {op_and_self}+
157162
xmstop -
158163

159164
integer [\-]?{digit}+
165+
decimal [\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*))
166+
real [\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
160167
/*
161-
real [\-]?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
162-
*/
163168
real [\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
169+
*/
164170

165171
param \${integer}
166172

@@ -339,15 +345,35 @@ other .
339345
if (*endptr != '\0' || errno == ERANGE)
340346
{
341347
errno = 0;
348+
#if 0
342349
yylval.dval = strtod(((char *)yytext),&endptr);
343350
if (*endptr != '\0' || errno == ERANGE)
344351
elog(ERROR,"Bad integer input '%s'",yytext);
345352
CheckFloat8Val(yylval.dval);
346353
elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
347354
return FCONST;
355+
#endif
356+
yylval.str = pstrdup((char*)yytext);
357+
return SCONST;
348358
}
349359
return ICONST;
350360
}
361+
{decimal}/{space}*-{number} {
362+
char* endptr;
363+
364+
BEGIN(xm);
365+
if (strlen((char *)yytext) <= 17)
366+
{
367+
errno = 0;
368+
yylval.dval = strtod(((char *)yytext),&endptr);
369+
if (*endptr != '\0' || errno == ERANGE)
370+
elog(ERROR,"Bad float8 input '%s'",yytext);
371+
CheckFloat8Val(yylval.dval);
372+
return FCONST;
373+
}
374+
yylval.str = pstrdup((char*)yytext);
375+
return SCONST;
376+
}
351377
{real}/{space}*-{number} {
352378
char* endptr;
353379

@@ -367,15 +393,34 @@ other .
367393
if (*endptr != '\0' || errno == ERANGE)
368394
{
369395
errno = 0;
396+
#if 0
370397
yylval.dval = strtod(((char *)yytext),&endptr);
371398
if (*endptr != '\0' || errno == ERANGE)
372399
elog(ERROR,"Bad integer input '%s'",yytext);
373400
CheckFloat8Val(yylval.dval);
374401
elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
375402
return FCONST;
403+
#endif
404+
yylval.str = pstrdup((char*)yytext);
405+
return SCONST;
376406
}
377407
return ICONST;
378408
}
409+
{decimal} {
410+
char* endptr;
411+
412+
if (strlen((char *)yytext) <= 17)
413+
{
414+
errno = 0;
415+
yylval.dval = strtod((char *)yytext,&endptr);
416+
if (*endptr != '\0' || errno == ERANGE)
417+
elog(ERROR,"Bad float input '%s'",yytext);
418+
CheckFloat8Val(yylval.dval);
419+
return FCONST;
420+
}
421+
yylval.str = pstrdup((char*)yytext);
422+
return SCONST;
423+
}
379424
{real} {
380425
char* endptr;
381426

0 commit comments

Comments
 (0)