From 0a9be2db9b7bdf07cc60dd7f3bf814f384139040 Mon Sep 17 00:00:00 2001
From: "Thomas G. Lockhart" <lockhart@fourpalms.org>
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 04de2c3f9ad..d2ceb795d3a 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];
 	 *  <xc> extended C-style comments - tgl 1997-07-12
 	 *  <xq> quoted strings - tgl 1997-07-30
 	 *  <xm> numeric strings with embedded minus sign - tgl 1997-09-05
+	 *  <xd> delimited identifiers (double-quoted identifiers) - tgl 1997-10-27
 	 *
 	 * The "extended comment" syntax closely resembles allowable operator syntax.
 	 * So, when in condition <xc>, 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			.
 <xq>{xqcat}		{
 				}
 
+
+{xdstart}		{
+					BEGIN(xd);
+					llen = 0;
+					*literal = '\0';
+				}
+<xd>{xdstop}	{
+					BEGIN(INITIAL);
+					yylval.str = pstrdup(literal);
+					return (IDENT);
+				}
+<xd>{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;
+				}
+
+
 <xm>{space}*	{ /* ignore */ }
 <xm>{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);
 				}
-- 
GitLab