aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1999-09-27 19:40:40 +0000
committerBruce Momjian <bruce@momjian.us>1999-09-27 19:40:40 +0000
commit7d7fb02148fb6733fad23e31acd79cd0a26e3372 (patch)
treeff973cfd9f00168e00293e9e04eb23274aeab27b /src
parent3f5a1643879f56695830b32feadef10350698f77 (diff)
downloadpostgresql-7d7fb02148fb6733fad23e31acd79cd0a26e3372.tar.gz
postgresql-7d7fb02148fb6733fad23e31acd79cd0a26e3372.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/scan.l107
1 files changed, 10 insertions, 97 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 011676de1d7..5091149e609 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.54 1999/09/11 22:26:35 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.55 1999/09/27 19:40:40 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -81,7 +81,6 @@ char literal[MAX_PARSE_BUFFER];
* <xc> extended C-style comments - tgl 1997-07-12
* <xd> delimited identifiers (double-quoted identifiers) - tgl 1997-10-27
* <xh> hexadecimal numeric string - thomas 1997-11-16
- * <xm> numeric strings with embedded minus sign - tgl 1997-09-05
* <xq> quoted strings - tgl 1997-07-30
*
* The "extended comment" syntax closely resembles allowable operator syntax.
@@ -95,7 +94,6 @@ char literal[MAX_PARSE_BUFFER];
%x xc
%x xd
%x xh
-%x xm
%x xq
/* Binary number
@@ -144,7 +142,6 @@ xcinside [^*]*
xcstar [^/]
digit [0-9]
-number [-+.0-9Ee]
letter [\200-\377_A-Za-z]
letter_or_digit [\200-\377_A-Za-z0-9]
@@ -156,13 +153,16 @@ self [,()\[\].;$\:\+\-\*\/\%\^\<\>\=\|]
op_and_self [\~\!\@\#\^\&\|\`\?\$\:\+\-\*\/\%\<\>\=]
operator {op_and_self}+
-xmstop -
+/* we do not allow unary minus in numbers.
+ * instead we pass it verbatim to parser. there it gets
+ * coerced via doNegate() -- Leon aug 20 1999
+ */
-integer [\-]?{digit}+
-decimal [\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*))
-real [\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
+integer {digit}+
+decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*))
+real ((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
/*
-real [\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
+real (((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
*/
param \${integer}
@@ -278,26 +278,10 @@ other .
llen += yyleng;
}
-
-<xm>{space}* { /* ignore */ }
-<xm>{xmstop} {
- BEGIN(INITIAL);
- return yytext[0];
- }
-
-
{typecast} { return TYPECAST; }
-{self}/{space}*-[\.0-9] {
- BEGIN(xm);
- return yytext[0];
- }
{self} { return yytext[0]; }
-{self} { return yytext[0]; }
-{operator}/-[\.0-9] {
- yylval.str = pstrdup((char*)yytext);
- return Op;
- }
+
{operator} {
if (strcmp((char*)yytext,"!=") == 0)
yylval.str = pstrdup("<>"); /* compatability */
@@ -311,77 +295,6 @@ other .
}
-{identifier}/{space}*-{number} {
- int i;
- ScanKeyword *keyword;
-
- BEGIN(xm);
- for(i = 0; yytext[i]; i++)
- if (isascii((unsigned char)yytext[i]) &&
- isupper(yytext[i]))
- yytext[i] = tolower(yytext[i]);
- if (i >= NAMEDATALEN)
- yytext[NAMEDATALEN-1] = '\0';
-
- keyword = ScanKeywordLookup((char*)yytext);
- if (keyword != NULL) {
- return keyword->value;
- }
- else
- {
- yylval.str = pstrdup((char*)yytext);
- return IDENT;
- }
- }
-{integer}/{space}*-{number} {
- char* endptr;
-
- BEGIN(xm);
- errno = 0;
- yylval.ival = strtol((char *)yytext,&endptr,10);
- 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;
-
- BEGIN(xm);
- 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;
- }
{integer} {
char* endptr;