Thread: Backslash Escape Sequences
On the list pgsql-general, I had this exchange: >>> Andy Anderson <aanderson@amherst.edu> writes: >>>> In a test I just did, the sequence \" (backslash double-quote) is >>>> interpreted as just a " inside of the E'...' string constant >>>> expression. This is great, since PHP's addslashes() sticks them >>>> in along with the other stuff I really need to quote like ' and >>>> \. But I see that \" isn't documented in the manual in section >>>> 4.1.2.1. I assume this is, in fact, standard behavior for >>>> Postgres? (Perhaps a comprehensive table might be a good idea at >>>> this point in the manual.) >> >> Tom Lane wrote: >>> Huh? It says >>> >>> Any other character following a backslash is taken literally. >>> >>> > > Andy Anderson wrote: >> Ah, slight ambiguity here. Perhaps this might best say "Any other >> character following a backslash is taken literally, and the >> backslash is removed." In any case, here's a contribution to the manual, a short table with this information, in a format that might help make the subject clearer. Modify at will! -- Andy <!--<TABLE BORDER="1" CLASS="CALSTABLE"> <COL><COL><COL> <THEAD> <TR> <TH>Backslash Escape Sequence</TH> <TH>Interpretation</TH> <TH>Notes</ TH> </TR> </THEAD> <TBODY> <TR> <TD><TT CLASS="TOKEN">\b</TT></TD> <TD>backspace</TD> <TD></TD> </TR> <TR> <TD><TT CLASS="TOKEN">\f</TT></ TD> <TD>form feed</TD> <TD></TD> </TR> <TR> <TD><TT CLASS="TOKEN">\n</ TT></TD> <TD>newline</TD> <TD></TD> </TR> <TR> <TD><TT CLASS="TOKEN"> \r</TT></TD> <TD>carriage return</TD> <TD></TD> </TR> <TR> <TD><TT CLASS="TOKEN">\t</TT></TD> <TD>tab</TD> <TD></TD> </TR> <TR> <TD> <TT CLASS="TOKEN">\<var>o</var></TT><br> <TT CLASS="TOKEN">\<var>oo</var></ TT><br> <TT CLASS="TOKEN">\<var>ooo</var></TT><br> </TD> <TD> octal byte value </TD> <TD> <var>o</var> = 0 - 7 </TD> </TR> <TR> <TD> <TT CLASS="TOKEN">\x<var>h</var></TT><br> <TT CLASS="TOKEN">\x<var>hh</ var></TT><br> </TD> <TD> hexadecimal byte value </TD> <TD> <var>h</ var> = 0 - F </TD> </TR> <TR> <TD><TT CLASS="TOKEN">\</TT><var>a</ var></TD> <TD><var>a</var></TD> <TD><var>a</var> = any other character. Commonly used to include \ and '</TD> </TR> </TBODY> </ TABLE>-->
Andy Anderson wrote: > In any case, here's a contribution to the manual, a short table with > this information, in a format that might help make the subject clearer. > Modify at will! FWIW if you really want to make a contribution to the docs, please see the SGML sources instead of the HTML output (which is machine-generated). http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>> Andy Anderson wrote: >> >>> In any case, here's a contribution to the manual, a short table with >>> this information, in a format that might help make the subject >>> clearer. >> Modify at will! > On Apr 30, 2008, at 6:04 PM, Alvaro Herrera wrote: >> FWIW if you really want to make a contribution to the docs, please >> see >> the SGML sources instead of the HTML output (which is machine- >> generated). OK, then, I hope the following is accurate enough SGML to be more useful. Submitted here per the instructions on <http://www.postgresql.org/docs/8.3/interactive/bug-reporting.html >. -- Andy ******************************************************************** <table id="sql-backslash-table"> <title>Backslash Escape Sequences</title> <tgroup cols="2"> <thead> <row> <entry>Backslash Escape Sequence</> <entry>Interpretation</entry> </row> </thead> <tbody> <row> <entry><literal>\b</literal></entry> <entry>backspace</entry> </row> <row> <entry><literal>\f</literal></entry> <entry>form feed</entry> </row> <row> <entry><literal>\n</literal></entry> <entry>newline</entry> </row> <row> <entry><literal>\r</literal></entry> <entry>carriage return</entry> </row> <row> <entry><literal>\t</literal></entry> <entry>tab</entry> </row> <row> <entry> <literallayout> <literal>\<replaceable>o</replaceable></literal> <literal>\<replaceable>oo</replaceable></literal> <literal>\<replaceable>ooo</replaceable></literal> (<replaceable>o</replaceable> = 0 - 7) </literallayout> </entry> <entry>octal byte value</entry> </row> <row> <entry> <literallayout> <literal>\x<replaceable>h</replaceable></literal> <literal>\x<replaceable>hh</replaceable></literal> (<replaceable>h</replaceable> = 0 - F) </literallayout> </entry> <entry>hexadecimal byte value</entry> </row> <row> <entry> <literallayout> <literal>\<replaceable>a</replaceable></literal> (<replaceable>a</replaceable> = any other character than the above, e.g. <literal>\</literal> and <literal>'</literal>.) </literallayout> </entry> <entry><replaceable>a</replaceable></entry> </row> </tbody> </tgroup> </table>
Andy Anderson wrote: > >> Andy Anderson wrote: > >> > >>> In any case, here's a contribution to the manual, a short table with > >>> this information, in a format that might help make the subject > >>> clearer. > >> Modify at will! > > > On Apr 30, 2008, at 6:04 PM, Alvaro Herrera wrote: > >> FWIW if you really want to make a contribution to the docs, please > >> see > >> the SGML sources instead of the HTML output (which is machine- > >> generated). > > OK, then, I hope the following is accurate enough SGML to be more > useful. Submitted here per the instructions on <http://www.postgresql.org/docs/8.3/interactive/bug-reporting.html Good idea --- a table is certainly clearer. I modified your patch and applied the attached version. Thanks much. Your documentation changes can be viewed in five minutes at: http://developer.postgresql.org/pgdocs/postgres/index.html -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + If your life is a hard drive, Christ can be your backup. + Index: doc/src/sgml/syntax.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/syntax.sgml,v retrieving revision 1.122 diff -c -c -r1.122 syntax.sgml *** doc/src/sgml/syntax.sgml 20 Mar 2008 21:42:47 -0000 1.122 --- doc/src/sgml/syntax.sgml 26 Jun 2008 22:24:11 -0000 *************** *** 286,304 **** quote.) Within an escape string, a backslash character (<literal>\</>) begins a C-like <firstterm>backslash escape</> sequence, in which the combination ! of backslash and following character(s) represents a special byte value. ! <literal>\b</literal> is a backspace, ! <literal>\f</literal> is a form feed, ! <literal>\n</literal> is a newline, ! <literal>\r</literal> is a carriage return, ! <literal>\t</literal> is a tab. ! Also supported are ! <literal>\<replaceable>digits</replaceable></literal>, where ! <replaceable>digits</replaceable> represents an octal byte value, and ! <literal>\x<replaceable>hexdigits</replaceable></literal>, where ! <replaceable>hexdigits</replaceable> represents a hexadecimal byte value. ! (It is your responsibility that the byte sequences you create are ! valid characters in the server character set encoding.) Any other character following a backslash is taken literally. Thus, to include a backslash character, write two backslashes (<literal>\\</>). Also, a single quote can be included in an escape string by writing --- 286,348 ---- quote.) Within an escape string, a backslash character (<literal>\</>) begins a C-like <firstterm>backslash escape</> sequence, in which the combination ! of backslash and following character(s) represent a special byte ! value: ! ! <table id="sql-backslash-table"> ! <title>Backslash Escape Sequences</title> ! <tgroup cols="2"> ! <thead> ! <row> ! <entry>Backslash Escape Sequence</> ! <entry>Interpretation</entry> ! </row> ! </thead> ! ! <tbody> ! <row> ! <entry><literal>\b</literal></entry> ! <entry>backspace</entry> ! </row> ! <row> ! <entry><literal>\f</literal></entry> ! <entry>form feed</entry> ! </row> ! <row> ! <entry><literal>\n</literal></entry> ! <entry>newline</entry> ! </row> ! <row> ! <entry><literal>\r</literal></entry> ! <entry>carriage return</entry> ! </row> ! <row> ! <entry><literal>\t</literal></entry> ! <entry>tab</entry> ! </row> ! <row> ! <entry> ! <literal>\<replaceable>o</replaceable></literal>, ! <literal>\<replaceable>oo</replaceable></literal>, ! <literal>\<replaceable>ooo</replaceable></literal> ! (<replaceable>o</replaceable> = 0 - 7) ! </entry> ! <entry>octal byte value</entry> ! </row> ! <row> ! <entry> ! <literal>\x<replaceable>h</replaceable></literal>, ! <literal>\x<replaceable>hh</replaceable></literal> ! (<replaceable>h</replaceable> = 0 - 9, A - F) ! </entry> ! <entry>hexadecimal byte value</entry> ! </row> ! </tbody> ! </tgroup> ! </table> ! ! It is your responsibility that the byte sequences you create are ! valid characters in the server character set encoding. Any other character following a backslash is taken literally. Thus, to include a backslash character, write two backslashes (<literal>\\</>). Also, a single quote can be included in an escape string by writing
Bruce Momjian wrote: > > OK, then, I hope the following is accurate enough SGML to be more > > useful. Submitted here per the instructions on > > <http://www.postgresql.org/docs/8.3/interactive/bug-reporting.html > > Good idea --- a table is certainly clearer. I modified your patch and > applied the attached version. Thanks much. Hmm, I think the \\ and \' stuff should be part of that table too -- the \<replaceable>a</> as in the patch seemed fine. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.