Re: massive quotes? - Mailing list pgsql-hackers
From | Andrew Dunstan |
---|---|
Subject | Re: massive quotes? |
Date | |
Msg-id | 005601c37aca$424b4f00$6401a8c0@DUNSLANE Whole thread Raw |
In response to | Re: massive quotes? (Bruce Momjian <pgman@candle.pha.pa.us>) |
Responses |
Re: massive quotes?
|
List | pgsql-hackers |
A quick browse through the current doc set suggests that sections 4.1, 38 to 42, and the page on 'create function' at least will need changes. I think calling it 'here-document' quoting is possibly unwise - it is sufficiently different from here documents in shell and perl contexts to make it confusing. We could call it meta-quoting, or alternative quoting, maybe. cheers andrew ----- Original Message ----- From: "Tom Lane" <tgl@sss.pgh.pa.us> To: "Sean Chittenden" <sean@chittenden.org> Cc: "Bruce Momjian" <pgman@candle.pha.pa.us>; "Jon Jensen" <jon@endpoint.com>; <pgsql-hackers@postgresql.org> Sent: Sunday, September 14, 2003 1:49 AM Subject: Re: [HACKERS] massive quotes? > Attached is a proof-of-concept diff that makes the main SQL parser > accept quoted strings in the style recently discussed ($Q$ ... $Q$). > To complete the feature, we'd need to make the plpgsql parser do the > same, update psql to understand this, update pg_dump to use this style > of quoting for function bodies (and perhaps other things?), and update > the documentation. The last is a nontrivial project all by itself. > Anybody want to run with this football? > > regards, tom lane > > > *** src/backend/parser/scan.l.orig Sun Aug 3 23:00:44 2003 > --- src/backend/parser/scan.l Sun Sep 14 01:38:55 2003 > *************** > *** 39,44 **** > --- 39,46 ---- > > static int xcdepth = 0; /* depth of nesting in slash-star comments */ > > + static char *hqstart; /* current here-document start string */ > + > /* > * literalbuf is used to accumulate literal values when multiple rules > * are needed to parse a single literal. Call startlit to reset buffer > *************** > *** 95,100 **** > --- 97,103 ---- > * <xd> delimited identifiers (double-quoted identifiers) > * <xh> hexadecimal numeric string > * <xq> quoted strings > + * <hq> here-document-style quoted strings > */ > > %x xb > *************** > *** 102,107 **** > --- 105,111 ---- > %x xd > %x xh > %x xq > + %x hq > > /* Bit string > * It is tempting to scan the string for only those characters > *************** > *** 141,146 **** > --- 145,157 ---- > xqoctesc [\\][0-7]{1,3} > xqcat {quote}{whitespace_with_newline}{quote} > > + /* Here-document-style quotes > + * The quoted string starts with $letters$ and extends to the first occurrence > + * of an identical string. There is *no* processing of the quoted text. > + */ > + hqdelim \$[A-Za-z]*\$ > + hqinside [^$]+ > + > /* Double quote > * Allows embedded spaces and other special characters into identifiers. > */ > *************** > *** 387,392 **** > --- 398,432 ---- > } > <xq><<EOF>> { yyerror("unterminated quoted string"); } > > + {hqdelim} { > + token_start = yytext; > + hqstart = pstrdup(yytext); > + BEGIN(hq); > + startlit(); > + } > + <hq>{hqdelim} { > + if (strcmp(yytext, hqstart) == 0) > + { > + pfree(hqstart); > + BEGIN(INITIAL); > + yylval.str = litbufdup(); > + return SCONST; > + } > + /* > + * When we fail to match $...$ to hqstart, transfer > + * the $... part to the output, but put back the final > + * $ for rescanning. Consider $delim$...$junk$delim$ > + */ > + addlit(yytext, yyleng-1); > + yyless(yyleng-1); > + } > + <hq>{hqinside} { > + addlit(yytext, yyleng); > + } > + <hq>. { > + addlitchar(yytext[0]); > + } > + <hq><<EOF>> { yyerror("unterminated special-quoted string"); } > > {xdstart} { > token_start = yytext; > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html
pgsql-hackers by date: