mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	docs: remove use of escape strings and use bytea hex output
standard_conforming_strings defaulted to 'on' in PG 9.1. bytea_output defaulted to 'hex' in PG 9.0. Reported-by: André Hänsel Discussion: https://postgr.es/m/12e601d447ac$345994a0$9d0cbde0$@webkr.de Backpatch-through: 9.3
This commit is contained in:
		@@ -766,9 +766,9 @@ SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
 | 
				
			|||||||
   For example, elements containing curly braces, commas (or the data type's
 | 
					   For example, elements containing curly braces, commas (or the data type's
 | 
				
			||||||
   delimiter character), double quotes, backslashes, or leading or trailing
 | 
					   delimiter character), double quotes, backslashes, or leading or trailing
 | 
				
			||||||
   whitespace must be double-quoted.  Empty strings and strings matching the
 | 
					   whitespace must be double-quoted.  Empty strings and strings matching the
 | 
				
			||||||
   word <literal>NULL</literal> must be quoted, too.  To put a double quote or
 | 
					   word <literal>NULL</literal> must be quoted, too.  To put a double
 | 
				
			||||||
   backslash in a quoted array element value, use escape string syntax
 | 
					   quote or backslash in a quoted array element value, precede it
 | 
				
			||||||
   and precede it with a backslash. Alternatively, you can avoid quotes and use
 | 
					   with a backslash. Alternatively, you can avoid quotes and use
 | 
				
			||||||
   backslash-escaping to protect all data characters that would otherwise
 | 
					   backslash-escaping to protect all data characters that would otherwise
 | 
				
			||||||
   be taken as array syntax.
 | 
					   be taken as array syntax.
 | 
				
			||||||
  </para>
 | 
					  </para>
 | 
				
			||||||
@@ -781,27 +781,6 @@ SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
 | 
				
			|||||||
   non-whitespace characters of an element, is not ignored.
 | 
					   non-whitespace characters of an element, is not ignored.
 | 
				
			||||||
  </para>
 | 
					  </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 <note>
 | 
					 | 
				
			||||||
  <para>
 | 
					 | 
				
			||||||
   Remember that what you write in an SQL command will first be interpreted
 | 
					 | 
				
			||||||
   as a string literal, and then as an array.  This doubles the number of
 | 
					 | 
				
			||||||
   backslashes you need.  For example, to insert a <type>text</type> array
 | 
					 | 
				
			||||||
   value containing a backslash and a double quote, you'd need to write:
 | 
					 | 
				
			||||||
<programlisting>
 | 
					 | 
				
			||||||
INSERT ... VALUES (E'{"\\\\","\\""}');
 | 
					 | 
				
			||||||
</programlisting>
 | 
					 | 
				
			||||||
   The escape string processor removes one level of backslashes, so that
 | 
					 | 
				
			||||||
   what arrives at the array-value parser looks like <literal>{"\\","\""}</literal>.
 | 
					 | 
				
			||||||
   In turn, the strings fed to the <type>text</type> data type's input routine
 | 
					 | 
				
			||||||
   become <literal>\</literal> and <literal>"</literal> respectively.  (If we were working
 | 
					 | 
				
			||||||
   with a data type whose input routine also treated backslashes specially,
 | 
					 | 
				
			||||||
   <type>bytea</type> for example, we might need as many as eight backslashes
 | 
					 | 
				
			||||||
   in the command to get one backslash into the stored array element.)
 | 
					 | 
				
			||||||
   Dollar quoting (see <xref linkend="sql-syntax-dollar-quoting"/>) can be
 | 
					 | 
				
			||||||
   used to avoid the need to double backslashes.
 | 
					 | 
				
			||||||
  </para>
 | 
					 | 
				
			||||||
 </note>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 <tip>
 | 
					 <tip>
 | 
				
			||||||
  <para>
 | 
					  <para>
 | 
				
			||||||
   The <literal>ARRAY</literal> constructor syntax (see
 | 
					   The <literal>ARRAY</literal> constructor syntax (see
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1296,7 +1296,7 @@ SELECT b, char_length(b) FROM test2;
 | 
				
			|||||||
    strings are distinguished from character strings in two
 | 
					    strings are distinguished from character strings in two
 | 
				
			||||||
    ways.  First, binary strings specifically allow storing
 | 
					    ways.  First, binary strings specifically allow storing
 | 
				
			||||||
    octets of value zero and other <quote>non-printable</quote>
 | 
					    octets of value zero and other <quote>non-printable</quote>
 | 
				
			||||||
    octets (usually, octets outside the range 32 to 126).
 | 
					    octets (usually, octets outside the decimal range 32 to 126).
 | 
				
			||||||
    Character strings disallow zero octets, and also disallow any
 | 
					    Character strings disallow zero octets, and also disallow any
 | 
				
			||||||
    other octet values and sequences of octet values that are invalid
 | 
					    other octet values and sequences of octet values that are invalid
 | 
				
			||||||
    according to the database's selected character set encoding.
 | 
					    according to the database's selected character set encoding.
 | 
				
			||||||
@@ -1308,9 +1308,10 @@ SELECT b, char_length(b) FROM test2;
 | 
				
			|||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   <para>
 | 
					   <para>
 | 
				
			||||||
    The <type>bytea</type> type supports two external formats for
 | 
					    The <type>bytea</type> type supports two
 | 
				
			||||||
    input and output: <productname>PostgreSQL</productname>'s historical
 | 
					    formats for input and output: <quote>hex</quote> format
 | 
				
			||||||
    <quote>escape</quote> format, and <quote>hex</quote> format.  Both
 | 
					    and <productname>PostgreSQL</productname>'s historical
 | 
				
			||||||
 | 
					    <quote>escape</quote> format.  Both
 | 
				
			||||||
    of these are always accepted on input.  The output format depends
 | 
					    of these are always accepted on input.  The output format depends
 | 
				
			||||||
    on the configuration parameter <xref linkend="guc-bytea-output"/>;
 | 
					    on the configuration parameter <xref linkend="guc-bytea-output"/>;
 | 
				
			||||||
    the default is hex.  (Note that the hex format was introduced in
 | 
					    the default is hex.  (Note that the hex format was introduced in
 | 
				
			||||||
@@ -1348,7 +1349,7 @@ SELECT b, char_length(b) FROM test2;
 | 
				
			|||||||
   <para>
 | 
					   <para>
 | 
				
			||||||
    Example:
 | 
					    Example:
 | 
				
			||||||
<programlisting>
 | 
					<programlisting>
 | 
				
			||||||
SELECT E'\\xDEADBEEF';
 | 
					SELECT '\xDEADBEEF';
 | 
				
			||||||
</programlisting>
 | 
					</programlisting>
 | 
				
			||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
  </sect2>
 | 
					  </sect2>
 | 
				
			||||||
@@ -1368,7 +1369,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
    convenient.  But in practice it is usually confusing because it
 | 
					    convenient.  But in practice it is usually confusing because it
 | 
				
			||||||
    fuzzes up the distinction between binary strings and character
 | 
					    fuzzes up the distinction between binary strings and character
 | 
				
			||||||
    strings, and also the particular escape mechanism that was chosen is
 | 
					    strings, and also the particular escape mechanism that was chosen is
 | 
				
			||||||
    somewhat unwieldy.  So this format should probably be avoided
 | 
					    somewhat unwieldy.  Therefore, this format should probably be avoided
 | 
				
			||||||
    for most new applications.
 | 
					    for most new applications.
 | 
				
			||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1381,7 +1382,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
    octal value and precede it
 | 
					    octal value and precede it
 | 
				
			||||||
    by a backslash (or two backslashes, if writing the value as a
 | 
					    by a backslash (or two backslashes, if writing the value as a
 | 
				
			||||||
    literal using escape string syntax).
 | 
					    literal using escape string syntax).
 | 
				
			||||||
    Backslash itself (octet value 92) can alternatively be represented by
 | 
					    Backslash itself (octet decimal value 92) can alternatively be represented by
 | 
				
			||||||
    double backslashes.
 | 
					    double backslashes.
 | 
				
			||||||
    <xref linkend="datatype-binary-sqlesc"/>
 | 
					    <xref linkend="datatype-binary-sqlesc"/>
 | 
				
			||||||
    shows the characters that must be escaped, and gives the alternative
 | 
					    shows the characters that must be escaped, and gives the alternative
 | 
				
			||||||
@@ -1405,33 +1406,33 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
      <row>
 | 
					      <row>
 | 
				
			||||||
       <entry>0</entry>
 | 
					       <entry>0</entry>
 | 
				
			||||||
       <entry>zero octet</entry>
 | 
					       <entry>zero octet</entry>
 | 
				
			||||||
       <entry><literal>E'\\000'</literal></entry>
 | 
					       <entry><literal>'\000'</literal></entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\000'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\000'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>\000</literal></entry>
 | 
					       <entry><literal>\x00</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <row>
 | 
					      <row>
 | 
				
			||||||
       <entry>39</entry>
 | 
					       <entry>39</entry>
 | 
				
			||||||
       <entry>single quote</entry>
 | 
					       <entry>single quote</entry>
 | 
				
			||||||
       <entry><literal>''''</literal> or <literal>E'\\047'</literal></entry>
 | 
					       <entry><literal>''''</literal> or <literal>'\047'</literal></entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\''::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT ''''::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>'</literal></entry>
 | 
					       <entry><literal>\x27</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <row>
 | 
					      <row>
 | 
				
			||||||
       <entry>92</entry>
 | 
					       <entry>92</entry>
 | 
				
			||||||
       <entry>backslash</entry>
 | 
					       <entry>backslash</entry>
 | 
				
			||||||
       <entry><literal>E'\\\\'</literal> or <literal>E'\\134'</literal></entry>
 | 
					       <entry><literal>'\'</literal> or <literal>'\\134'</literal></entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\\\'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\\'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>\\</literal></entry>
 | 
					       <entry><literal>\x5c</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <row>
 | 
					      <row>
 | 
				
			||||||
       <entry>0 to 31 and 127 to 255</entry>
 | 
					       <entry>0 to 31 and 127 to 255</entry>
 | 
				
			||||||
       <entry><quote>non-printable</quote> octets</entry>
 | 
					       <entry><quote>non-printable</quote> octets</entry>
 | 
				
			||||||
       <entry><literal>E'\\<replaceable>xxx'</replaceable></literal> (octal value)</entry>
 | 
					       <entry><literal>'\<replaceable>xxx'</replaceable></literal> (octal value)</entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\001'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\001'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>\001</literal></entry>
 | 
					       <entry><literal>\x01</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     </tbody>
 | 
					     </tbody>
 | 
				
			||||||
@@ -1459,7 +1460,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
    of escaping.)  The remaining backslash is then recognized by the
 | 
					    of escaping.)  The remaining backslash is then recognized by the
 | 
				
			||||||
    <type>bytea</type> input function as starting either a three
 | 
					    <type>bytea</type> input function as starting either a three
 | 
				
			||||||
    digit octal value or escaping another backslash.  For example,
 | 
					    digit octal value or escaping another backslash.  For example,
 | 
				
			||||||
    a string literal passed to the server as <literal>E'\\001'</literal>
 | 
					    a string literal passed to the server as <literal>'\001'</literal>
 | 
				
			||||||
    becomes <literal>\001</literal> after passing through the
 | 
					    becomes <literal>\001</literal> after passing through the
 | 
				
			||||||
    escape string parser. The <literal>\001</literal> is then sent
 | 
					    escape string parser. The <literal>\001</literal> is then sent
 | 
				
			||||||
    to the <type>bytea</type> input function, where it is converted
 | 
					    to the <type>bytea</type> input function, where it is converted
 | 
				
			||||||
@@ -1470,12 +1471,24 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   <para>
 | 
					   <para>
 | 
				
			||||||
    <type>Bytea</type> octets are sometimes escaped when output. In general, each
 | 
					    <type>Bytea</type> octets are output in <literal>hex</literal>
 | 
				
			||||||
    <quote>non-printable</quote> octet is converted into
 | 
					    format by default.  If you change <xref linkend="guc-bytea-output"/>
 | 
				
			||||||
    its equivalent three-digit octal value and preceded by one backslash.
 | 
					    to <literal>escape</literal>,
 | 
				
			||||||
    Most <quote>printable</quote> octets are represented by their standard
 | 
					    <quote>non-printable</quote> octet are converted to
 | 
				
			||||||
    representation in the client character set. The octet with decimal
 | 
					    equivalent three-digit octal value and preceded by one backslash.
 | 
				
			||||||
    value 92 (backslash) is doubled in the output.
 | 
					    Most <quote>printable</quote> octets are output by their standard
 | 
				
			||||||
 | 
					    representation in the client character set, e.g.:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<programlisting>
 | 
				
			||||||
 | 
					SET bytea_output = 'escape';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SELECT 'abc \153\154\155 \052\251\124'::bytea;
 | 
				
			||||||
 | 
					     bytea
 | 
				
			||||||
 | 
					----------------
 | 
				
			||||||
 | 
					 abc klm *\251T
 | 
				
			||||||
 | 
					</programlisting>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The octet with decimal value 92 (backslash) is doubled in the output.
 | 
				
			||||||
    Details are in <xref linkend="datatype-binary-resesc"/>.
 | 
					    Details are in <xref linkend="datatype-binary-resesc"/>.
 | 
				
			||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1498,7 +1511,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
       <entry>92</entry>
 | 
					       <entry>92</entry>
 | 
				
			||||||
       <entry>backslash</entry>
 | 
					       <entry>backslash</entry>
 | 
				
			||||||
       <entry><literal>\\</literal></entry>
 | 
					       <entry><literal>\\</literal></entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\134'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\134'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>\\</literal></entry>
 | 
					       <entry><literal>\\</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1506,7 +1519,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
       <entry>0 to 31 and 127 to 255</entry>
 | 
					       <entry>0 to 31 and 127 to 255</entry>
 | 
				
			||||||
       <entry><quote>non-printable</quote> octets</entry>
 | 
					       <entry><quote>non-printable</quote> octets</entry>
 | 
				
			||||||
       <entry><literal>\<replaceable>xxx</replaceable></literal> (octal value)</entry>
 | 
					       <entry><literal>\<replaceable>xxx</replaceable></literal> (octal value)</entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\001'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\001'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>\001</literal></entry>
 | 
					       <entry><literal>\001</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1514,7 +1527,7 @@ SELECT E'\\xDEADBEEF';
 | 
				
			|||||||
       <entry>32 to 126</entry>
 | 
					       <entry>32 to 126</entry>
 | 
				
			||||||
       <entry><quote>printable</quote> octets</entry>
 | 
					       <entry><quote>printable</quote> octets</entry>
 | 
				
			||||||
       <entry>client character set representation</entry>
 | 
					       <entry>client character set representation</entry>
 | 
				
			||||||
       <entry><literal>SELECT E'\\176'::bytea;</literal></entry>
 | 
					       <entry><literal>SELECT '\176'::bytea;</literal></entry>
 | 
				
			||||||
       <entry><literal>~</literal></entry>
 | 
					       <entry><literal>~</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1776,7 +1776,7 @@
 | 
				
			|||||||
        octal sequences (<literal>\</literal><replaceable>nnn</replaceable>) and
 | 
					        octal sequences (<literal>\</literal><replaceable>nnn</replaceable>) and
 | 
				
			||||||
        doubles backslashes.
 | 
					        doubles backslashes.
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>encode(E'123\\000\\001', 'base64')</literal></entry>
 | 
					       <entry><literal>encode('123\000\001', 'base64')</literal></entry>
 | 
				
			||||||
       <entry><literal>MTIzAAE=</literal></entry>
 | 
					       <entry><literal>MTIzAAE=</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2100,7 +2100,7 @@
 | 
				
			|||||||
        the delimiter.  See <xref linkend="functions-posix-regexp"/> for more
 | 
					        the delimiter.  See <xref linkend="functions-posix-regexp"/> for more
 | 
				
			||||||
        information.
 | 
					        information.
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>regexp_split_to_array('hello world', E'\\s+')</literal></entry>
 | 
					       <entry><literal>regexp_split_to_array('hello world', '\s+')</literal></entry>
 | 
				
			||||||
       <entry><literal>{hello,world}</literal></entry>
 | 
					       <entry><literal>{hello,world}</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2117,7 +2117,7 @@
 | 
				
			|||||||
        the delimiter.  See <xref linkend="functions-posix-regexp"/> for more
 | 
					        the delimiter.  See <xref linkend="functions-posix-regexp"/> for more
 | 
				
			||||||
        information.
 | 
					        information.
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>regexp_split_to_table('hello world', E'\\s+')</literal></entry>
 | 
					       <entry><literal>regexp_split_to_table('hello world', '\s+')</literal></entry>
 | 
				
			||||||
       <entry><literal>hello</literal><para><literal>world</literal></para> (2 rows)</entry>
 | 
					       <entry><literal>hello</literal><para><literal>world</literal></para> (2 rows)</entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3301,8 +3301,8 @@ SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
 | 
				
			|||||||
SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
 | 
					SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
 | 
				
			||||||
<lineannotation>Result: </lineannotation><computeroutput>INSERT INTO "Foo bar" VALUES('O''Reilly')</computeroutput>
 | 
					<lineannotation>Result: </lineannotation><computeroutput>INSERT INTO "Foo bar" VALUES('O''Reilly')</computeroutput>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT format('INSERT INTO %I VALUES(%L)', 'locations', E'C:\\Program Files');
 | 
					SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
 | 
				
			||||||
<lineannotation>Result: </lineannotation><computeroutput>INSERT INTO locations VALUES(E'C:\\Program Files')</computeroutput>
 | 
					<lineannotation>Result: </lineannotation><computeroutput>INSERT INTO locations VALUES('C:\Program Files')</computeroutput>
 | 
				
			||||||
</screen>
 | 
					</screen>
 | 
				
			||||||
    </para>
 | 
					    </para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3429,7 +3429,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
         <secondary>concatenation</secondary>
 | 
					         <secondary>concatenation</secondary>
 | 
				
			||||||
        </indexterm>
 | 
					        </indexterm>
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>E'\\\\Post'::bytea || E'\\047gres\\000'::bytea</literal></entry>
 | 
					       <entry><literal>'\\Post'::bytea || '\047gres\000'::bytea</literal></entry>
 | 
				
			||||||
       <entry><literal>\\Post'gres\000</literal></entry>
 | 
					       <entry><literal>\\Post'gres\000</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3442,7 +3442,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><type>int</type></entry>
 | 
					       <entry><type>int</type></entry>
 | 
				
			||||||
       <entry>Number of bytes in binary string</entry>
 | 
					       <entry>Number of bytes in binary string</entry>
 | 
				
			||||||
       <entry><literal>octet_length(E'jo\\000se'::bytea)</literal></entry>
 | 
					       <entry><literal>octet_length('jo\000se'::bytea)</literal></entry>
 | 
				
			||||||
       <entry><literal>5</literal></entry>
 | 
					       <entry><literal>5</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3457,7 +3457,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Replace substring
 | 
					        Replace substring
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3)</literal></entry>
 | 
					       <entry><literal>overlay('Th\000omas'::bytea placing '\002\003'::bytea from 2 for 3)</literal></entry>
 | 
				
			||||||
       <entry><literal>T\\002\\003mas</literal></entry>
 | 
					       <entry><literal>T\\002\\003mas</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3470,7 +3470,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><type>int</type></entry>
 | 
					       <entry><type>int</type></entry>
 | 
				
			||||||
       <entry>Location of specified substring</entry>
 | 
					       <entry>Location of specified substring</entry>
 | 
				
			||||||
      <entry><literal>position(E'\\000om'::bytea in E'Th\\000omas'::bytea)</literal></entry>
 | 
					      <entry><literal>position('\000om'::bytea in 'Th\000omas'::bytea)</literal></entry>
 | 
				
			||||||
       <entry><literal>3</literal></entry>
 | 
					       <entry><literal>3</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3485,7 +3485,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Extract substring
 | 
					        Extract substring
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>substring(E'Th\\000omas'::bytea from 2 for 3)</literal></entry>
 | 
					       <entry><literal>substring('Th\000omas'::bytea from 2 for 3)</literal></entry>
 | 
				
			||||||
       <entry><literal>h\000o</literal></entry>
 | 
					       <entry><literal>h\000o</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3504,7 +3504,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
        <parameter>bytes</parameter> from the start
 | 
					        <parameter>bytes</parameter> from the start
 | 
				
			||||||
        and end of <parameter>string</parameter>
 | 
					        and end of <parameter>string</parameter>
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>trim(E'\\000\\001'::bytea from E'\\000Tom\\001'::bytea)</literal></entry>
 | 
					       <entry><literal>trim('\000\001'::bytea from '\000Tom\001'::bytea)</literal></entry>
 | 
				
			||||||
       <entry><literal>Tom</literal></entry>
 | 
					       <entry><literal>Tom</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
     </tbody>
 | 
					     </tbody>
 | 
				
			||||||
@@ -3547,7 +3547,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
        <parameter>bytes</parameter> from the start and end of
 | 
					        <parameter>bytes</parameter> from the start and end of
 | 
				
			||||||
        <parameter>string</parameter>
 | 
					        <parameter>string</parameter>
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>btrim(E'\\000trim\\001'::bytea, E'\\000\\001'::bytea)</literal></entry>
 | 
					      <entry><literal>btrim('\000trim\001'::bytea, '\000\001'::bytea)</literal></entry>
 | 
				
			||||||
      <entry><literal>trim</literal></entry>
 | 
					      <entry><literal>trim</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3564,7 +3564,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       Decode binary data from textual representation in <parameter>string</parameter>.
 | 
					       Decode binary data from textual representation in <parameter>string</parameter>.
 | 
				
			||||||
       Options for <parameter>format</parameter> are same as in <function>encode</function>.
 | 
					       Options for <parameter>format</parameter> are same as in <function>encode</function>.
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>decode(E'123\\000456', 'escape')</literal></entry>
 | 
					      <entry><literal>decode('123\000456', 'escape')</literal></entry>
 | 
				
			||||||
      <entry><literal>123\000456</literal></entry>
 | 
					      <entry><literal>123\000456</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3584,7 +3584,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       octal sequences (<literal>\</literal><replaceable>nnn</replaceable>) and
 | 
					       octal sequences (<literal>\</literal><replaceable>nnn</replaceable>) and
 | 
				
			||||||
       doubles backslashes.
 | 
					       doubles backslashes.
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>encode(E'123\\000456'::bytea, 'escape')</literal></entry>
 | 
					      <entry><literal>encode('123\000456'::bytea, 'escape')</literal></entry>
 | 
				
			||||||
      <entry><literal>123\000456</literal></entry>
 | 
					      <entry><literal>123\000456</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3599,7 +3599,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Extract bit from string
 | 
					        Extract bit from string
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>get_bit(E'Th\\000omas'::bytea, 45)</literal></entry>
 | 
					       <entry><literal>get_bit('Th\000omas'::bytea, 45)</literal></entry>
 | 
				
			||||||
       <entry><literal>1</literal></entry>
 | 
					       <entry><literal>1</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3614,7 +3614,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Extract byte from string
 | 
					        Extract byte from string
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>get_byte(E'Th\\000omas'::bytea, 4)</literal></entry>
 | 
					       <entry><literal>get_byte('Th\000omas'::bytea, 4)</literal></entry>
 | 
				
			||||||
       <entry><literal>109</literal></entry>
 | 
					       <entry><literal>109</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3638,7 +3638,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
        <see>binary strings, length</see>
 | 
					        <see>binary strings, length</see>
 | 
				
			||||||
       </indexterm>
 | 
					       </indexterm>
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>length(E'jo\\000se'::bytea)</literal></entry>
 | 
					      <entry><literal>length('jo\000se'::bytea)</literal></entry>
 | 
				
			||||||
      <entry><literal>5</literal></entry>
 | 
					      <entry><literal>5</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3654,7 +3654,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       Calculates the MD5 hash of <parameter>string</parameter>,
 | 
					       Calculates the MD5 hash of <parameter>string</parameter>,
 | 
				
			||||||
       returning the result in hexadecimal
 | 
					       returning the result in hexadecimal
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>md5(E'Th\\000omas'::bytea)</literal></entry>
 | 
					      <entry><literal>md5('Th\000omas'::bytea)</literal></entry>
 | 
				
			||||||
      <entry><literal>8ab2d3c9689aaf18​b4958c334c82d8b1</literal></entry>
 | 
					      <entry><literal>8ab2d3c9689aaf18​b4958c334c82d8b1</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3670,7 +3670,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Set bit in string
 | 
					        Set bit in string
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>set_bit(E'Th\\000omas'::bytea, 45, 0)</literal></entry>
 | 
					       <entry><literal>set_bit('Th\000omas'::bytea, 45, 0)</literal></entry>
 | 
				
			||||||
       <entry><literal>Th\000omAs</literal></entry>
 | 
					       <entry><literal>Th\000omAs</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3686,7 +3686,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
 | 
				
			|||||||
       <entry>
 | 
					       <entry>
 | 
				
			||||||
        Set byte in string
 | 
					        Set byte in string
 | 
				
			||||||
       </entry>
 | 
					       </entry>
 | 
				
			||||||
       <entry><literal>set_byte(E'Th\\000omas'::bytea, 4, 64)</literal></entry>
 | 
					       <entry><literal>set_byte('Th\000omas'::bytea, 4, 64)</literal></entry>
 | 
				
			||||||
       <entry><literal>Th\000o@as</literal></entry>
 | 
					       <entry><literal>Th\000o@as</literal></entry>
 | 
				
			||||||
      </row>
 | 
					      </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4377,7 +4377,7 @@ regexp_replace('foobarbaz', 'b..', 'X')
 | 
				
			|||||||
                                   <lineannotation>fooXbaz</lineannotation>
 | 
					                                   <lineannotation>fooXbaz</lineannotation>
 | 
				
			||||||
regexp_replace('foobarbaz', 'b..', 'X', 'g')
 | 
					regexp_replace('foobarbaz', 'b..', 'X', 'g')
 | 
				
			||||||
                                   <lineannotation>fooXX</lineannotation>
 | 
					                                   <lineannotation>fooXX</lineannotation>
 | 
				
			||||||
regexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g')
 | 
					regexp_replace('foobarbaz', 'b(..)', 'X\1Y', 'g')
 | 
				
			||||||
                                   <lineannotation>fooXarYXazY</lineannotation>
 | 
					                                   <lineannotation>fooXarYXazY</lineannotation>
 | 
				
			||||||
</programlisting>
 | 
					</programlisting>
 | 
				
			||||||
   </para>
 | 
					   </para>
 | 
				
			||||||
@@ -4513,7 +4513,7 @@ SELECT col1, (SELECT regexp_matches(col2, '(bar)(beque)')) FROM tab;
 | 
				
			|||||||
    Some examples:
 | 
					    Some examples:
 | 
				
			||||||
<programlisting>
 | 
					<programlisting>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', E'\\s+') AS foo;
 | 
					SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', '\s+') AS foo;
 | 
				
			||||||
  foo   
 | 
					  foo   
 | 
				
			||||||
-------
 | 
					-------
 | 
				
			||||||
 the    
 | 
					 the    
 | 
				
			||||||
@@ -4527,13 +4527,13 @@ SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy d
 | 
				
			|||||||
 dog    
 | 
					 dog    
 | 
				
			||||||
(9 rows)
 | 
					(9 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', E'\\s+');
 | 
					SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', '\s+');
 | 
				
			||||||
              regexp_split_to_array             
 | 
					              regexp_split_to_array             
 | 
				
			||||||
-----------------------------------------------
 | 
					-----------------------------------------------
 | 
				
			||||||
 {the,quick,brown,fox,jumps,over,the,lazy,dog}
 | 
					 {the,quick,brown,fox,jumps,over,the,lazy,dog}
 | 
				
			||||||
(1 row)
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo;
 | 
					SELECT foo FROM regexp_split_to_table('the quick brown fox', '\s*') AS foo;
 | 
				
			||||||
 foo 
 | 
					 foo 
 | 
				
			||||||
-----
 | 
					-----
 | 
				
			||||||
 t         
 | 
					 t         
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -568,7 +568,7 @@ int lo_unlink(PGconn *conn, Oid lobjId);
 | 
				
			|||||||
       Create a large object and store data there, returning its OID.
 | 
					       Create a large object and store data there, returning its OID.
 | 
				
			||||||
       Pass <literal>0</literal> to have the system choose an OID.
 | 
					       Pass <literal>0</literal> to have the system choose an OID.
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>lo_from_bytea(0, E'\\xffffff00')</literal></entry>
 | 
					      <entry><literal>lo_from_bytea(0, '\xffffff00')</literal></entry>
 | 
				
			||||||
      <entry><literal>24528</literal></entry>
 | 
					      <entry><literal>24528</literal></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -583,7 +583,7 @@ int lo_unlink(PGconn *conn, Oid lobjId);
 | 
				
			|||||||
      <entry>
 | 
					      <entry>
 | 
				
			||||||
       Write data at the given offset.
 | 
					       Write data at the given offset.
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry><literal>lo_put(24528, 1, E'\\xaa')</literal></entry>
 | 
					      <entry><literal>lo_put(24528, 1, '\xaa')</literal></entry>
 | 
				
			||||||
      <entry></entry>
 | 
					      <entry></entry>
 | 
				
			||||||
     </row>
 | 
					     </row>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -510,7 +510,7 @@ SELECT c.somefunc FROM inventory_item c;
 | 
				
			|||||||
   containing a double quote and a backslash in a composite
 | 
					   containing a double quote and a backslash in a composite
 | 
				
			||||||
   value, you'd need to write:
 | 
					   value, you'd need to write:
 | 
				
			||||||
<programlisting>
 | 
					<programlisting>
 | 
				
			||||||
INSERT ... VALUES (E'("\\"\\\\")');
 | 
					INSERT ... VALUES ('("\"\\")');
 | 
				
			||||||
</programlisting>
 | 
					</programlisting>
 | 
				
			||||||
   The string-literal processor removes one level of backslashes, so that
 | 
					   The string-literal processor removes one level of backslashes, so that
 | 
				
			||||||
   what arrives at the composite-value parser looks like
 | 
					   what arrives at the composite-value parser looks like
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user