Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8d21a6e

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 parenta36a7a1 commit8d21a6e

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
#defineYY_READ_BUF_SIZEMAX_PARSE_BUFFER
3939

40+
#ifdef YY_READ_BUF_SIZE
41+
#undef YY_READ_BUF_SIZE
42+
#endif
43+
#defineYY_READ_BUF_SIZEMAX_PARSE_BUFFER
44+
4045
externchar *parseString;
4146
staticchar *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+
#if0
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+
#if0
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)

[8]ページ先頭

©2009-2025 Movatter.jp