Add support for delimited identifiers. Include new exclusive state "xd".
authorThomas G. Lockhart
Thu, 30 Oct 1997 16:36:39 +0000 (16:36 +0000)
committerThomas G. Lockhart
Thu, 30 Oct 1997 16:36:39 +0000 (16:36 +0000)
Remove unused ScanString variable and code.

src/backend/parser/scan.l

index 04de2c3f9ad6a904ffaf01ef8dcba78b9e14fd64..d2ceb795d3a244d275ee82d3724ef4c4daa6885a 100644 (file)
@@ -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);
                }