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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy