88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.26 1997/10/3015:28:25 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.27 1997/10/3016:36:39 thomas Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414*/
@@ -57,7 +57,6 @@ void unput(char);
5757extern YYSTYPE yylval;
5858
5959int llen;
60- char *ScanString;
6160char literal[MAX_PARSE_BUFFER];
6261
6362%}
@@ -74,6 +73,7 @@ char literal[MAX_PARSE_BUFFER];
7473 * <xc> extended C-style comments - tgl 1997-07-12
7574 * <xq> quoted strings - tgl 1997-07-30
7675 * <xm> numeric strings with embedded minus sign - tgl 1997-09-05
76+ * <xd> delimited identifiers (double-quoted identifiers) - tgl 1997-10-27
7777 *
7878 * The "extended comment" syntax closely resembles allowable operator syntax.
7979 * So, when in condition <xc>, only strings which would terminate the
@@ -83,10 +83,10 @@ char literal[MAX_PARSE_BUFFER];
8383 */
8484
8585%x xc
86+ %x xd
8687%x xq
8788%x xm
8889
89- /* We used to allow double-quoted strings, but SQL doesn't so we won't either */
9090quote '
9191xqstart {quote }
9292xqstop {quote }
@@ -96,6 +96,11 @@ xqembedded"\\'"
9696xqliteral [\\ ](. | \n )
9797xqcat {quote }{space }* \n {space }* {quote }
9898
99+ dquote \"
100+ xdstart {dquote }
101+ xdstop {dquote }
102+ xdinside [^ " ]*
103+
99104xcline [\/ ][\* ]. * [\* ][\/ ]{space }* \n *
100105xcstart [\/ ][\* ]{op_and_self }*
101106xcstop {op_and_self }* [\* ][\/ ]({space }* | \n )
@@ -190,12 +195,32 @@ other.
190195<xq >{xqcat }{
191196}
192197
198+
199+ {xdstart }{
200+ BEGIN (xd);
201+ llen =0 ;
202+ *literal =' \0 ' ;
203+ }
204+ <xd >{xdstop }{
205+ BEGIN (INITIAL);
206+ yylval.str =pstrdup (literal);
207+ return (IDENT);
208+ }
209+ <xd >{xdinside }{
210+ if ((llen+yyleng) > (MAX_PARSE_BUFFER -1 ))
211+ elog (WARN," quoted string parse buffer of %d chars exceeded" ,MAX_PARSE_BUFFER);
212+ memcpy (literal+llen, yytext, yyleng+1 );
213+ llen += yyleng;
214+ }
215+
216+
193217<xm >{space }* {/* ignore */ }
194218<xm >{xmstop }{
195219BEGIN (INITIAL);
196220return (yytext[0 ]);
197221}
198222
223+
199224{sysfunc }{
200225yylval.str =pstrdup (SystemFunctionHandler ((char *)yytext));
201226return (SCONST);
@@ -225,39 +250,35 @@ other.
225250
226251{integer }/ {space }* -{number }{
227252BEGIN (xm);
228- ScanString =pstrdup ((char *)yytext);
229253yylval.ival =atoi ((char *)yytext);
230254return (ICONST);
231255}
232256{real }/ {space }* -{number } {
233257char * endptr;
234258BEGIN (xm);
235259errno =0 ;
236- ScanString =pstrdup ((char *)yytext);
237260yylval.dval =strtod (((char *)yytext),&endptr);
238261if (*endptr !=' \0 ' || errno == ERANGE)
239- elog (WARN," \t Bad float8 inputformat \n " );
262+ elog (WARN," Bad float8 input'%s' " ,yytext );
240263CheckFloat8Val (yylval.dval );
241264return (FCONST);
242265}
243266{integer }{
244267char * endptr;
245268
246269errno =0 ;
247- ScanString =pstrdup ((char *)yytext);
248270yylval.ival =strtol ((char *)yytext,&endptr,10 );
249271if (*endptr !=' \0 ' || errno == ERANGE)
250- elog (WARN," \t Bad integer inputformat \n " );
272+ elog (WARN," Bad integer input'%s' " ,yytext );
251273return (ICONST);
252274}
253275{real }{
254276char * endptr;
255277
256278errno =0 ;
257- ScanString =pstrdup ((char *)yytext);
258279yylval.dval =strtod ((char *)yytext,&endptr);
259280if (*endptr !=' \0 ' || errno == ERANGE)
260- elog (WARN," \t Bad float inputformat \n " );
281+ elog (WARN," Bad float input'%s' " ,yytext );
261282CheckFloat8Val (yylval.dval );
262283return (FCONST);
263284}