Skip to content

Commit 7d7fb02

Browse files
committed
Following advice from Michael Ansley, I broke up the patch in
two: one fixes uminus and other literal length. They are to be applied - uminus first, then possilbly literal on top of uminus. Leon
1 parent 3f5a164 commit 7d7fb02

File tree

1 file changed

+10
-97
lines changed

1 file changed

+10
-97
lines changed

src/backend/parser/scan.l

Lines changed: 10 additions & 97 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.54 1999/09/11 22:26:35 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.55 1999/09/27 19:40:40 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -81,7 +81,6 @@ char literal[MAX_PARSE_BUFFER];
8181
* <xc> extended C-style comments - tgl 1997-07-12
8282
* <xd> delimited identifiers (double-quoted identifiers) - tgl 1997-10-27
8383
* <xh> hexadecimal numeric string - thomas 1997-11-16
84-
* <xm> numeric strings with embedded minus sign - tgl 1997-09-05
8584
* <xq> quoted strings - tgl 1997-07-30
8685
*
8786
* The "extended comment" syntax closely resembles allowable operator syntax.
@@ -95,7 +94,6 @@ char literal[MAX_PARSE_BUFFER];
9594
%x xc
9695
%x xd
9796
%x xh
98-
%x xm
9997
%x xq
10098

10199
/* Binary number
@@ -144,7 +142,6 @@ xcinside [^*]*
144142
xcstar [^/]
145143

146144
digit [0-9]
147-
number [-+.0-9Ee]
148145
letter [\200-\377_A-Za-z]
149146
letter_or_digit [\200-\377_A-Za-z0-9]
150147

@@ -156,13 +153,16 @@ self [,()\[\].;$\:\+\-\*\/\%\^\<\>\=\|]
156153
op_and_self [\~\!\@\#\^\&\|\`\?\$\:\+\-\*\/\%\<\>\=]
157154
operator {op_and_self}+
158155

159-
xmstop -
156+
/* we do not allow unary minus in numbers.
157+
* instead we pass it verbatim to parser. there it gets
158+
* coerced via doNegate() -- Leon aug 20 1999
159+
*/
160160

161-
integer [\-]?{digit}+
162-
decimal [\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*))
163-
real [\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
161+
integer {digit}+
162+
decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*))
163+
real ((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
164164
/*
165-
real [\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
165+
real (((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
166166
*/
167167

168168
param \${integer}
@@ -278,26 +278,10 @@ other .
278278
llen += yyleng;
279279
}
280280

281-
282-
<xm>{space}* { /* ignore */ }
283-
<xm>{xmstop} {
284-
BEGIN(INITIAL);
285-
return yytext[0];
286-
}
287-
288-
289281
{typecast} { return TYPECAST; }
290282

291-
{self}/{space}*-[\.0-9] {
292-
BEGIN(xm);
293-
return yytext[0];
294-
}
295283
{self} { return yytext[0]; }
296-
{self} { return yytext[0]; }
297-
{operator}/-[\.0-9] {
298-
yylval.str = pstrdup((char*)yytext);
299-
return Op;
300-
}
284+
301285
{operator} {
302286
if (strcmp((char*)yytext,"!=") == 0)
303287
yylval.str = pstrdup("<>"); /* compatability */
@@ -311,77 +295,6 @@ other .
311295
}
312296

313297

314-
{identifier}/{space}*-{number} {
315-
int i;
316-
ScanKeyword *keyword;
317-
318-
BEGIN(xm);
319-
for(i = 0; yytext[i]; i++)
320-
if (isascii((unsigned char)yytext[i]) &&
321-
isupper(yytext[i]))
322-
yytext[i] = tolower(yytext[i]);
323-
if (i >= NAMEDATALEN)
324-
yytext[NAMEDATALEN-1] = '\0';
325-
326-
keyword = ScanKeywordLookup((char*)yytext);
327-
if (keyword != NULL) {
328-
return keyword->value;
329-
}
330-
else
331-
{
332-
yylval.str = pstrdup((char*)yytext);
333-
return IDENT;
334-
}
335-
}
336-
{integer}/{space}*-{number} {
337-
char* endptr;
338-
339-
BEGIN(xm);
340-
errno = 0;
341-
yylval.ival = strtol((char *)yytext,&endptr,10);
342-
if (*endptr != '\0' || errno == ERANGE)
343-
{
344-
errno = 0;
345-
#if 0
346-
yylval.dval = strtod(((char *)yytext),&endptr);
347-
if (*endptr != '\0' || errno == ERANGE)
348-
elog(ERROR,"Bad integer input '%s'",yytext);
349-
CheckFloat8Val(yylval.dval);
350-
elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
351-
return FCONST;
352-
#endif
353-
yylval.str = pstrdup((char*)yytext);
354-
return SCONST;
355-
}
356-
return ICONST;
357-
}
358-
{decimal}/{space}*-{number} {
359-
char* endptr;
360-
361-
BEGIN(xm);
362-
if (strlen((char *)yytext) <= 17)
363-
{
364-
errno = 0;
365-
yylval.dval = strtod(((char *)yytext),&endptr);
366-
if (*endptr != '\0' || errno == ERANGE)
367-
elog(ERROR,"Bad float8 input '%s'",yytext);
368-
CheckFloat8Val(yylval.dval);
369-
return FCONST;
370-
}
371-
yylval.str = pstrdup((char*)yytext);
372-
return SCONST;
373-
}
374-
{real}/{space}*-{number} {
375-
char* endptr;
376-
377-
BEGIN(xm);
378-
errno = 0;
379-
yylval.dval = strtod(((char *)yytext),&endptr);
380-
if (*endptr != '\0' || errno == ERANGE)
381-
elog(ERROR,"Bad float8 input '%s'",yytext);
382-
CheckFloat8Val(yylval.dval);
383-
return FCONST;
384-
}
385298
{integer} {
386299
char* endptr;
387300

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