Subject: Quoting "

From: Andy Anderson <[email-masked]>
Date: Wed, 30 Apr 2008 09:10:38 -0400

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.)

Thanks,

-- Andy

---

From: Craig Ringer <[email-masked]>
Date: Wed, 30 Apr 2008 22:28:17 +0800

Andy Anderson wrote:
> 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.)

craig=# SELECT E'\z\v\k\-';
  ?column?
----------
  zvk-
(1 row)

 From 4.1.2.1:

... "Any other character following a backslash is taken literally."

I didn't see any escape sequences being interpreted other than those 
that're already documented in the section of 4.1.2.1 that describes E'' 
strings.

--
Craig Ringer

---

From: Tom Lane <[email-masked]>
Date: Wed, 30 Apr 2008 10:28:28 -0400

Andy Anderson <[email-masked]> writes:
> see that \" isn't documented in the manual in section 4.1.2.1.

Huh?  It says

    Any other character following a backslash is taken literally.

			regards, tom lane

---

From: Andy Anderson <[email-masked]>
Date: Wed, 30 Apr 2008 10:33:19 -0400

Ah, slight ambiguity here. Perhaps this might best say "Any other  
character following a backslash is taken literally, and the backslash  
is removed."

Thanks,

-- Andy

---

From: "Scott Marlowe" <[email-masked]>
Date: Wed, 30 Apr 2008 09:52:39 -0600

On Wed, Apr 30, 2008 at 7:10 AM, Andy Anderson <[email-masked]> wrote:
> 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
> standard behavior for Postgres? (Perhaps a comprehensive table might be a
> good idea at this point in the manual.)

Why are you using php's addslashes() function?  Is there something
missing from pg_escape_string()???  Or are you doing something else
I'm not thinking of?

---

From: Andy Anderson <[email-masked]>
Date: Wed, 30 Apr 2008 12:51:45 -0400

> On Wed, Apr 30, 2008 at 9:10 AM, Andy Anderson  
> <[email-masked]> wrote:
>> expression.
>> stuff I really need to quote like ' and \.

> missing from pg_escape_string()???  Or are you doing something else

Yep, relying on what I already know to move forward on my project,  
rather than browsing the manual for things I didn't know I needed :-).

Thanks for the tip.

-- Andy

---

From: Andy Anderson <[email-masked]>
Date: Wed, 30 Apr 2008 14:26:00 -0400

On the list pgsql-general, I had this exchange:

>>>> 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
>>>
>> 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>-->

---

From: Alvaro Herrera <[email-masked]>
Date: Wed, 30 Apr 2008 18:04:28 -0400

Andy Anderson wrote:

> 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

---

From: Andy Anderson <[email-masked]>
Date: Thu, 1 May 2008 11:29:09 -0400

>>> clearer.

> On Apr 30, 2008, at 6:04 PM, Alvaro Herrera 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 
 >.

-- 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>

---

From: Bruce Momjian <[email-masked]>
Date: Thu, 26 Jun 2008 18:25:24 -0400 (EDT)

> 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  <[email-masked]>        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

---

From: Alvaro Herrera <[email-masked]>
Date: Wed, 3 Sep 2008 12:59:42 -0400

Bruce Momjian wrote:

> > useful. Submitted here per the instructions on
> > <http://www.postgresql.org/docs/8.3/interactive/bug-reporting.html 
> 

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.