From 0a9be2db9b7bdf07cc60dd7f3bf814f384139040 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Thu, 30 Oct 1997 16:36:39 +0000 Subject: [PATCH] Add support for delimited identifiers. Include new exclusive state "xd". Remove unused ScanString variable and code. --- src/backend/parser/scan.l | 41 +++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 04de2c3f9a..d2ceb795d3 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.26 1997/10/30 15:28:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.27 1997/10/30 16:36:39 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -57,7 +57,6 @@ void unput(char); extern YYSTYPE yylval; int llen; -char *ScanString; char literal[MAX_PARSE_BUFFER]; %} @@ -74,6 +73,7 @@ char literal[MAX_PARSE_BUFFER]; * extended C-style comments - tgl 1997-07-12 * quoted strings - tgl 1997-07-30 * numeric strings with embedded minus sign - tgl 1997-09-05 + * delimited identifiers (double-quoted identifiers) - tgl 1997-10-27 * * The "extended comment" syntax closely resembles allowable operator syntax. * So, when in condition , only strings which would terminate the @@ -83,10 +83,10 @@ char literal[MAX_PARSE_BUFFER]; */ %x xc +%x xd %x xq %x xm - /* We used to allow double-quoted strings, but SQL doesn't so we won't either */ quote ' xqstart {quote} xqstop {quote} @@ -96,6 +96,11 @@ xqembedded "\\'" xqliteral [\\](.|\n) xqcat {quote}{space}*\n{space}*{quote} +dquote \" +xdstart {dquote} +xdstop {dquote} +xdinside [^"]* + xcline [\/][\*].*[\*][\/]{space}*\n* xcstart [\/][\*]{op_and_self}* xcstop {op_and_self}*[\*][\/]({space}*|\n) @@ -190,12 +195,32 @@ other . {xqcat} { } + +{xdstart} { + BEGIN(xd); + llen = 0; + *literal = '\0'; + } +{xdstop} { + BEGIN(INITIAL); + yylval.str = pstrdup(literal); + return (IDENT); + } +{xdinside} { + if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1)) + elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER); + memcpy(literal+llen, yytext, yyleng+1); + llen += yyleng; + } + + {space}* { /* ignore */ } {xmstop} { BEGIN(INITIAL); return (yytext[0]); } + {sysfunc} { yylval.str = pstrdup(SystemFunctionHandler((char *)yytext)); return (SCONST); @@ -225,7 +250,6 @@ other . {integer}/{space}*-{number} { BEGIN(xm); - ScanString = pstrdup((char*)yytext); yylval.ival = atoi((char*)yytext); return (ICONST); } @@ -233,10 +257,9 @@ other . char* endptr; BEGIN(xm); errno = 0; - ScanString = pstrdup((char*)yytext); yylval.dval = strtod(((char *)yytext),&endptr); if (*endptr != '\0' || errno == ERANGE) - elog(WARN,"\tBad float8 input format\n"); + elog(WARN,"Bad float8 input '%s'",yytext); CheckFloat8Val(yylval.dval); return (FCONST); } @@ -244,20 +267,18 @@ other . char* endptr; errno = 0; - ScanString = pstrdup((char*)yytext); yylval.ival = strtol((char *)yytext,&endptr,10); if (*endptr != '\0' || errno == ERANGE) - elog(WARN,"\tBad integer input format\n"); + elog(WARN,"Bad integer input '%s'",yytext); return (ICONST); } {real} { char* endptr; errno = 0; - ScanString = pstrdup((char*)yytext); yylval.dval = strtod((char *)yytext,&endptr); if (*endptr != '\0' || errno == ERANGE) - elog(WARN,"\tBad float input format\n"); + elog(WARN,"Bad float input '%s'",yytext); CheckFloat8Val(yylval.dval); return (FCONST); }