]> granicus.if.org Git - postgresql/commitdiff
Support '' for literal ' in psql single-quote strings, documentation update.
authorBruce Momjian <bruce@momjian.us>
Wed, 31 May 2006 11:35:17 +0000 (11:35 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 31 May 2006 11:35:17 +0000 (11:35 +0000)
doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/psqlscan.l

index f00b4c09f6f25dce24d612817e629716b538b60f..13c77595e6bafc3fe374172f33e422e53da9692a 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.162 2006/05/26 19:51:29 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.163 2006/05/31 11:35:17 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -2262,7 +2262,7 @@ testdb=&gt; <userinput>SELECT * FROM :foo;</userinput>
     copy the contents of a file into a table column. First load the file into a
     variable and then proceed as above.
 <programlisting>
-testdb=&gt; <userinput>\set content '\'' `cat my_file.txt` '\''</userinput>
+testdb=&gt; <userinput>\set content '''' `cat my_file.txt` ''''</userinput>
 testdb=&gt; <userinput>INSERT INTO my_table VALUES (:content);</userinput>
 </programlisting>
     One possible problem with this approach is that <filename>my_file.txt</filename>
@@ -2270,14 +2270,14 @@ testdb=&gt; <userinput>INSERT INTO my_table VALUES (:content);</userinput>
     they don't cause a syntax error when the second line is processed. This
     could be done with the program <command>sed</command>:
 <programlisting>
-testdb=&gt; <userinput>\set content '\'' `sed -e "s/'/\\\\\\'/g" &lt; my_file.txt` '\''</userinput>
+testdb=&gt; <userinput>\set content '''' `sed -e "s/'/\\\\''/g" &lt; my_file.txt` ''''</userinput>
 </programlisting>
     Observe the correct number of backslashes (6)! It works
     this way: After <application>psql</application> has parsed this
-    line, it passes <literal>sed -e "s/'/\\\'/g" &lt; my_file.txt</literal>
+    line, it passes <literal>sed -e "s/'/\\''/g" &lt; my_file.txt</literal>
     to the shell. The shell will do its own thing inside the double
     quotes and execute <command>sed</command> with the arguments
-    <literal>-e</literal> and <literal>s/'/\\'/g</literal>. When
+    <literal>-e</literal> and <literal>s/'/''/g</literal>. When
     <command>sed</command> parses this it will replace the two
     backslashes with a single one and then do the substitution. Perhaps
     at one point you thought it was great that all Unix commands use the
index 4a344baf6b20c25ff5fee579df7f7acd8ca814cc..2c19b7ae9e1fb7ab76d7a282c8b10db3533ac6b8 100644 (file)
@@ -33,7 +33,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/psql/psqlscan.l,v 1.18 2006/05/11 19:15:35 tgl Exp $
+ *       $PostgreSQL: pgsql/src/bin/psql/psqlscan.l,v 1.19 2006/05/31 11:35:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -861,6 +861,9 @@ other                       .
 
 {quote}                        { return LEXRES_OK; }
 
+    /* We don't need a state here because we are already in a string */
+{xqdouble}             { emit("'", 1); }
+
 "\\n"                  { appendPQExpBufferChar(output_buf, '\n'); }
 "\\t"                  { appendPQExpBufferChar(output_buf, '\t'); }
 "\\b"                  { appendPQExpBufferChar(output_buf, '\b'); }