diff --git a/contrib/dblink/expected/dblink.out b/contrib/dblink/expected/dblink.out
index 13e4a6fb4c424abf88c64f26f1ad8a00abc0a5a6..d39aa45373ae31021a263327cf0d03d772bb4956 100644
--- a/contrib/dblink/expected/dblink.out
+++ b/contrib/dblink/expected/dblink.out
@@ -829,51 +829,51 @@ DROP SERVER fdtest;
 DROP FOREIGN DATA WRAPPER postgresql;
 -- test asynchronous notifications
 SELECT dblink_connect('dbname=contrib_regression');
- dblink_connect
+ dblink_connect 
 ----------------
  OK
 (1 row)
 
 --should return listen
 SELECT dblink_exec('LISTEN regression');
- dblink_exec
+ dblink_exec 
 -------------
  LISTEN
 (1 row)
 
 --should return listen
 SELECT dblink_exec('LISTEN foobar');
- dblink_exec
+ dblink_exec 
 -------------
  LISTEN
 (1 row)
 
 SELECT dblink_exec('NOTIFY regression');
- dblink_exec
+ dblink_exec 
 -------------
  NOTIFY
 (1 row)
 
 SELECT dblink_exec('NOTIFY foobar');
- dblink_exec
+ dblink_exec 
 -------------
  NOTIFY
 (1 row)
 
 SELECT notify_name, be_pid = (select t.be_pid from dblink('select pg_backend_pid()') as t(be_pid int)) AS is_self_notify, extra from dblink_get_notify();
- notify_name | is_self_notify | extra
+ notify_name | is_self_notify | extra 
 -------------+----------------+-------
- regression  | t              |
- foobar      | t              |
+ regression  | t              | 
+ foobar      | t              | 
 (2 rows)
 
 SELECT * from dblink_get_notify();
- notify_name | be_pid | extra
+ notify_name | be_pid | extra 
 -------------+--------+-------
 (0 rows)
 
 SELECT dblink_disconnect();
- dblink_disconnect
+ dblink_disconnect 
 -------------------
  OK
 (1 row)
diff --git a/contrib/pgcrypto/expected/crypt-blowfish.out b/contrib/pgcrypto/expected/crypt-blowfish.out
index 329d78f6254621d3e1dedfe86afb8c0b18a03f3d..8a8b0071810b7f015d02fb0a27c6c9a3950b6fac 100644
--- a/contrib/pgcrypto/expected/crypt-blowfish.out
+++ b/contrib/pgcrypto/expected/crypt-blowfish.out
@@ -17,7 +17,7 @@ CREATE TABLE ctest (data text, res text, salt text);
 INSERT INTO ctest VALUES ('password', '', '');
 UPDATE ctest SET salt = gen_salt('bf', 8);
 UPDATE ctest SET res = crypt(data, salt);
-SELECT res = crypt(data, res) AS "worked"
+SELECT res = crypt(data, res) AS "worked" 
 FROM ctest;
  worked 
 --------
diff --git a/contrib/pgcrypto/expected/pgp-armor.out b/contrib/pgcrypto/expected/pgp-armor.out
index 1bb24615965cd8fb6c08493aa98d7e3d91a7d1b4..c95549412e238e596a781c555017b08fadfa25b7 100644
--- a/contrib/pgcrypto/expected/pgp-armor.out
+++ b/contrib/pgcrypto/expected/pgp-armor.out
@@ -6,21 +6,21 @@ SET bytea_output TO escape;
 select armor('');
             armor            
 -----------------------------
- -----BEGIN PGP MESSAGE-----
- 
- =twTO
- -----END PGP MESSAGE-----
+ -----BEGIN PGP MESSAGE-----+
+                            +
+ =twTO                      +
+ -----END PGP MESSAGE-----  +
  
 (1 row)
 
 select armor('test');
             armor            
 -----------------------------
- -----BEGIN PGP MESSAGE-----
- 
- dGVzdA==
- =+G7Q
- -----END PGP MESSAGE-----
+ -----BEGIN PGP MESSAGE-----+
+                            +
+ dGVzdA==                   +
+ =+G7Q                      +
+ -----END PGP MESSAGE-----  +
  
 (1 row)
 
@@ -40,12 +40,12 @@ select armor('0123456789abcdef0123456789abcdef0123456789abcdef
 0123456789abcdef0123456789abcdef0123456789abcdef');
                                     armor                                     
 ------------------------------------------------------------------------------
- -----BEGIN PGP MESSAGE-----
- 
- MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmCjAxMjM0NTY3
- ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZg==
- =JFw5
- -----END PGP MESSAGE-----
+ -----BEGIN PGP MESSAGE-----                                                 +
+                                                                             +
+ MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmCjAxMjM0NTY3+
+ ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZg==                    +
+ =JFw5                                                                       +
+ -----END PGP MESSAGE-----                                                   +
  
 (1 row)
 
diff --git a/contrib/pgcrypto/expected/pgp-decrypt.out b/contrib/pgcrypto/expected/pgp-decrypt.out
index 8ecb56f0098d1b630d98d8a3bd4f4b60045bd9a6..859f4d681b430feffe912e691e9938e140317f68 100644
--- a/contrib/pgcrypto/expected/pgp-decrypt.out
+++ b/contrib/pgcrypto/expected/pgp-decrypt.out
@@ -11,7 +11,7 @@ yA6Ce1QTMK3KdL2MPfamsTUSAML8huCJMwYQFfE=
 =JcP+
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -25,7 +25,7 @@ UTAsG35A1vYs02VARKzGz6xI2UHwFUirP+brPBg3Ee7muOx8pA==
 =XtrP
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -39,7 +39,7 @@ jA0ECAMCI7YQpWqp3D1g0kQBCjB7GlX7+SQeXNleXeXQ78ZAPNliquGDq9u378zI
 =rCZt
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -53,7 +53,7 @@ lceMfQdbAg6oTFyJpk/wH18GzRDphCofg0X8uLgkAKMrpcmgog==
 =fB6S
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -68,7 +68,7 @@ u9YkgfJfsuRJmgQ9tmo=
 =60ui
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -82,7 +82,7 @@ jA0EBwMCEeP3idNjQ1Bg0kQBf4G0wX+2QNzLh2YNwYkQgQkfYhn/hLXjV4nK9nsE
 =moGf
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -97,7 +97,7 @@ KyRrHf7zEBuZiZ2AG34jNVMOLToj1jJUg5zTSdecUzQVCykWTA==
 =NyLk
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -111,7 +111,7 @@ jA0EBwMCApbdlrURoWJg0kQBzHM/E0o7djY82bNuspjxjAcPFrrtp0uvDdMQ4z2m
 =FxbQ
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -126,7 +126,7 @@ Ah9GXjGS1TVALzTImJbz1uHUZRfhJlFbc5yGQw==
 =YvkV
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -140,7 +140,7 @@ jAwEBwEC/QTByBLI3b/SRAHPxKzI6SZBo5lAEOD+EsvKQWO4adL9tDY+++Iqy1xK
 =dbXm
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -154,7 +154,7 @@ z+9ZaA/XdSx5ZiFnMym8P6r8uY9rLjjNptvvRHlxIReF+p9MNg==
 =VJKg
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -168,7 +168,7 @@ Cr3i2M7TgVZ0M4jp4QL0adG1lpN5iK7aQeOwMw==
 =cg+i
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -182,7 +182,7 @@ jAwECAECruOfyNDFiTnSRAEVoGXm4A9UZKkWljdzjEO/iaE7mIraltIpQMkiqCh9
 =aHmC
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -196,7 +196,7 @@ q6eF6859ZVnli3BFSDSk3a4e/pXhglxmDYCfjAXkozKNYLo6yw==
 =K0LS
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -210,7 +210,7 @@ rQr3WbdKdY9ufjOE5+mXI+EFkSPrF9rL9NCq6w==
 =RGts
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -224,7 +224,7 @@ jAwECQECKHhrou7ZOIXSRAHWIVP+xjVQcjAVBTt+qh9SNzYe248xFTwozkwev3mO
 =SUrU
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -238,7 +238,7 @@ jA0ECQMCjc8lwZu8Fz1g0kQBkEzjImi21liep5jj+3dAJ2aZFfUkohi8b3n9z+7+
 =XZrG
 -----END PGP MESSAGE-----
 '), 'foobar');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -253,7 +253,7 @@ tTGup1mMz6Cfh1uDRErUuXpx9A0gdMu7zX0o5XjrL7WGDAZdSw==
 =XKKG
 -----END PGP MESSAGE-----
 '), '0123456789abcdefghij');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -267,7 +267,7 @@ CMxFKadf144H/vpoV9GA0f22keQgCl0EsTE4V4lweVOPTKCMJg==
 =gWDh
 -----END PGP MESSAGE-----
 '), '0123456789abcdefghij2jk4h5g2j54khg23h54g2kh54g2khj54g23hj54');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
@@ -281,7 +281,7 @@ FwsDabdQUz5O7bgNSnxfmyw1OifGF+W2bIn/8W+0rDf8u3+O+Q==
 =OxOF
 -----END PGP MESSAGE-----
 '), 'x');
-   pgp_sym_decrypt   
+ pgp_sym_decrypt 
 -----------------
  Secret message.
 (1 row)
diff --git a/contrib/tsearch2/expected/tsearch2.out b/contrib/tsearch2/expected/tsearch2.out
index d5623e1cdbc6952c8b9c306efa059294f7461aad..22d3e3e402ece1a0d50075742e1c21fe3b5ee75a 100644
--- a/contrib/tsearch2/expected/tsearch2.out
+++ b/contrib/tsearch2/expected/tsearch2.out
@@ -742,8 +742,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
      3 | ewri2
     12 |  
     13 | <a href="qwe<qwe>">
-    12 | 
-       : 
+    12 |                                     +
+       | 
     19 | /usr/local/fff
     12 |  
     19 | /awdf/dwqe/4325
@@ -775,8 +775,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
     20 | -4.2
     12 | . 
     22 | 234
-    12 |  
-       : 
+    12 |                                     +
+       | 
     12 | <
      1 | i
     12 |  
@@ -2330,8 +2330,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('sea&thousand&years'));
                   headline                  
 --------------------------------------------
- <b>sea</b> a <b>thousand</b> <b>years</b>,
- A <b>thousand</b> <b>years</b> to trace
+ <b>sea</b> a <b>thousand</b> <b>years</b>,+
+ A <b>thousand</b> <b>years</b> to trace   +
  The granite features of this cliff
 (1 row)
 
@@ -2347,8 +2347,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('granite&sea'));
                  headline                  
 -------------------------------------------
- <b>sea</b> a thousand years,
- A thousand years to trace
+ <b>sea</b> a thousand years,             +
+ A thousand years to trace                +
  The <b>granite</b> features of this cliff
 (1 row)
 
@@ -2364,8 +2364,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('sea'));
               headline              
 ------------------------------------
- <b>sea</b> a thousand years,
- A thousand years to trace
+ <b>sea</b> a thousand years,      +
+ A thousand years to trace         +
  The granite features of this cliff
 (1 row)
 
@@ -2384,17 +2384,17 @@ ff-bg
 to_tsquery('sea&foo'), 'HighlightAll=true');
                                   headline                                   
 -----------------------------------------------------------------------------
- 
- <html>
- <!-- some comment -->
- <body>
- <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
- <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
-  ff-bg
- <script>
-        document.write(15);
- </script>
- </body>
+                                                                            +
+ <html>                                                                     +
+ <!-- some comment -->                                                      +
+ <body>                                                                     +
+ <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>                        +
+ <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
+ ff-bg                                                                      +
+ <script>                                                                   +
+        document.write(15);                                                 +
+ </script>                                                                  +
+ </body>                                                                    +
  </html>
 (1 row)
 
diff --git a/contrib/tsearch2/expected/tsearch2_1.out b/contrib/tsearch2/expected/tsearch2_1.out
index e956b07646ab0e77da9974811f48969fcee6acdd..f5713f5024cf987ec2d839a4a3979f4573cdb64f 100644
--- a/contrib/tsearch2/expected/tsearch2_1.out
+++ b/contrib/tsearch2/expected/tsearch2_1.out
@@ -742,8 +742,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
      3 | ewri2
     12 |  
     13 | <a href="qwe<qwe>">
-    12 | 
-       : 
+    12 |                                     +
+       | 
     19 | /usr/local/fff
     12 |  
     19 | /awdf/dwqe/4325
@@ -775,8 +775,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
     20 | -4.2
     12 | . 
     22 | 234
-    12 |  
-       : 
+    12 |                                     +
+       | 
     12 | <
      1 | i
     12 |  
@@ -2330,8 +2330,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('sea&thousand&years'));
                   headline                  
 --------------------------------------------
- <b>sea</b> a <b>thousand</b> <b>years</b>,
- A <b>thousand</b> <b>years</b> to trace
+ <b>sea</b> a <b>thousand</b> <b>years</b>,+
+ A <b>thousand</b> <b>years</b> to trace   +
  The granite features of this cliff
 (1 row)
 
@@ -2347,8 +2347,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('granite&sea'));
                  headline                  
 -------------------------------------------
- <b>sea</b> a thousand years,
- A thousand years to trace
+ <b>sea</b> a thousand years,             +
+ A thousand years to trace                +
  The <b>granite</b> features of this cliff
 (1 row)
 
@@ -2364,8 +2364,8 @@ Upon a woman s face. E.  J.  Pratt  (1882 1964)
 ', to_tsquery('sea'));
               headline              
 ------------------------------------
- <b>sea</b> a thousand years,
- A thousand years to trace
+ <b>sea</b> a thousand years,      +
+ A thousand years to trace         +
  The granite features of this cliff
 (1 row)
 
@@ -2384,17 +2384,17 @@ ff-bg
 to_tsquery('sea&foo'), 'HighlightAll=true');
                                   headline                                   
 -----------------------------------------------------------------------------
- 
- <html>
- <!-- some comment -->
- <body>
- <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
- <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
-  ff-bg
- <script>
-        document.write(15);
- </script>
- </body>
+                                                                            +
+ <html>                                                                     +
+ <!-- some comment -->                                                      +
+ <body>                                                                     +
+ <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>                        +
+ <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
+ ff-bg                                                                      +
+ <script>                                                                   +
+        document.write(15);                                                 +
+ </script>                                                                  +
+ </body>                                                                    +
  </html>
 (1 row)
 
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index bbccb3b87b9581004a8d018ff8d9b45302521368..95ce850195e3b3f3bef218978fef6abf1e425be1 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.232 2009/10/13 21:04:01 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.233 2009/11/22 05:20:41 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -1765,30 +1765,54 @@ lo_import 152801
           <listitem>
           <para>
           Sets the border line drawing style to one
-          of <literal>ascii</literal> or <literal>unicode</literal>.
+          of <literal>ascii</literal>, <literal>old-ascii</literal>
+          or <literal>unicode</literal>.
           Unique abbreviations are allowed.  (That would mean one
           letter is enough.)
           </para>
 
           <para>
-          <quote>ASCII</quote> uses plain <acronym>ASCII</acronym> characters.
+          <literal>ascii</literal> style uses plain <acronym>ASCII</acronym>
+          characters.  Newlines in data are shown using
+          a <literal>+</literal> symbol in the right-hand margin.
+          When the data wraps from one line
+          to the next without a newline character, a dot (<literal>.</>)
+          is shown in the right-hand margin of the first line, and
+          again in the left-hand margin of the following line.
           </para>
 
           <para>
-          <quote>Unicode</quote> uses Unicode box-drawing characters.
+          <literal>old-ascii</literal> style uses plain <acronym>ASCII</>
+          characters, using the formatting style used
+          in <productname>PostgreSQL</productname> 8.4 and earlier.
+          Newlines in data are shown using a <literal>:</literal>
+          symbol in place of the left-hand column separator.
+          When the data wraps from one line
+          to the next without a newline character, a <literal>;</>
+          symbol is used in place of the left-hand column separator.
+          </para>
+
+          <para>
+          <literal>unicode</literal> style uses Unicode box-drawing characters.
+          Newlines in data are shown using a carriage return symbol
+          in the right-hand margin.  When the data wraps from one line
+          to the next without a newline character, an ellipsis symbol
+          is shown in the right-hand margin of the first line, and
+          again in the left-hand margin of the following line.
           </para>
 
           <para>
           When the selected output format is one that draws lines or boxes
-          around the data, this setting controls how the lines are drawn.
+          around the data, this setting also determines the characters
+          with which the lines are drawn.
           Plain <acronym>ASCII</acronym> characters work everywhere, but
           Unicode characters look nicer on displays that recognize them.
           </para>
 
           <para>
-          If this option has not been set, the default behavior is to
-          use Unicode characters if the client character set encoding
-          is UTF-8, otherwise <acronym>ASCII</acronym> characters.
+          If this option has not been set, the default behavior is to use
+          <literal>unicode</literal> style if the client character set encoding
+          is UTF-8, otherwise <literal>ascii</literal> style.
           </para>
           </listitem>
           </varlistentry>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 6ce10caa2b8e476ef50cafce17634eae8aa80511..5a356b9b5ee17232aaac4fe03889ca967ab894aa 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.210 2009/10/13 21:04:01 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.211 2009/11/22 05:20:41 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -1795,11 +1795,13 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
 			;
 		else if (pg_strncasecmp("ascii", value, vallen) == 0)
 			popt->topt.line_style = &pg_asciiformat;
+		else if (pg_strncasecmp("old-ascii", value, vallen) == 0)
+			popt->topt.line_style = &pg_asciiformat_old;
 		else if (pg_strncasecmp("unicode", value, vallen) == 0)
 			popt->topt.line_style = &pg_utf8format;
 		else
 		{
-			psql_error("\\pset: allowed line styles are ascii, unicode\n");
+			psql_error("\\pset: allowed line styles are ascii, old-ascii, unicode\n");
 			return false;
 		}
 
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 80dd304f1ebabbcbb2ea19042b4cc26fb4fdd796..b7fdc4779452235844383d6b6a4e485fb7f9399d 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.117 2009/10/13 21:04:01 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.118 2009/11/22 05:20:41 tgl Exp $
  */
 #include "postgres_fe.h"
 
@@ -54,9 +54,37 @@ const printTextFormat pg_asciiformat =
 		{ "-", "+", "+", "+" },
 		{ "",  "|", "|", "|" }
 	},
+	"|",
+	"|",
+	"|",
+	" ",
+	"+",
+	" ",
+	"+",
+	".",
+	".",
+	true
+};
+
+const printTextFormat pg_asciiformat_old =
+{
+	"old-ascii",
+	{
+		{ "-", "+", "+", "+" },
+		{ "-", "+", "+", "+" },
+		{ "-", "+", "+", "+" },
+		{ "",  "|", "|", "|" }
+	},
 	":",
 	";",
-	" "
+	" ",
+	"+",
+	" ",
+	" ",
+	" ",
+	" ",
+	" ",
+	false
 };
 
 const printTextFormat pg_utf8format =
@@ -72,12 +100,23 @@ const printTextFormat pg_utf8format =
 		/* N/A, │, │, │ */
 		{ "", "\342\224\202", "\342\224\202", "\342\224\202" }
 	},
-	/* ╎ */
-	"\342\225\216",
-	/* ┊ */
-	"\342\224\212",
-	/* ╷ */
-	"\342\225\267"
+	/* │ */
+	"\342\224\202",
+	/* │ */
+	"\342\224\202",
+	/* │ */
+	"\342\224\202",
+	" ",
+	/* ↵ */
+	"\342\206\265",
+	" ",
+	/* ↵ */
+	"\342\206\265",
+	/* … */
+	"\342\200\246",
+	/* … */
+	"\342\200\246",
+	true
 };
 
 
@@ -476,6 +515,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 
 	bool	   *header_done;	/* Have all header lines been output? */
 	int		   *bytes_output;	/* Bytes output for column value */
+	printTextLineWrap *wrap;	/* Wrap status for each column */
 	int			output_columns = 0;		/* Width of interactive console */
 	bool		is_pager = false;
 
@@ -499,6 +539,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 		format_buf = pg_local_calloc(col_count, sizeof(*format_buf));
 		header_done = pg_local_calloc(col_count, sizeof(*header_done));
 		bytes_output = pg_local_calloc(col_count, sizeof(*bytes_output));
+		wrap = pg_local_calloc(col_count, sizeof(*wrap));
 	}
 	else
 	{
@@ -513,6 +554,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 		format_buf = NULL;
 		header_done = NULL;
 		bytes_output = NULL;
+		wrap = NULL;
 	}
 
 	/* scan all column headers, find maximum width and max max_nl_lines */
@@ -575,7 +617,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 
 	/* adjust the total display width based on border style */
 	if (opt_border == 0)
-		width_total = col_count - 1;
+		width_total = col_count;
 	else if (opt_border == 1)
 		width_total = col_count * 3 - 1;
 	else
@@ -770,16 +812,18 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 			while (more_col_wrapping)
 			{
 				if (opt_border == 2)
-					fprintf(fout, "%s%c", dformat->leftvrule,
-							curr_nl_line ? '+' : ' ');
-				else if (opt_border == 1)
-					fputc(curr_nl_line ? '+' : ' ', fout);
+					fputs(dformat->leftvrule, fout);
 
 				for (i = 0; i < cont->ncolumns; i++)
 				{
 					struct lineptr *this_line = col_lineptrs[i] + curr_nl_line;
 					unsigned int nbspace;
 
+					if (opt_border != 0 ||
+						(format->wrap_right_border == false && i > 0))
+						fputs(curr_nl_line ? format->header_nl_left : " ",
+							  fout);
+
 					if (!header_done[i])
 					{
 						nbspace = width_wrap[i] - this_line->width;
@@ -796,21 +840,18 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 					}
 					else
 						fprintf(fout, "%*s", width_wrap[i], "");
-					if (i < col_count - 1)
-					{
-						if (opt_border == 0)
-							fputc(curr_nl_line ? '+' : ' ', fout);
-						else
-							fprintf(fout, " %s%c", dformat->midvrule,
-									curr_nl_line ? '+' : ' ');
-					}
+
+					if (opt_border != 0 || format->wrap_right_border == true)
+						fputs(!header_done[i] ? format->header_nl_right : " ",
+							  fout);
+
+					if (opt_border != 0 && i < col_count - 1)
+						fputs(dformat->midvrule, fout);
 				}
 				curr_nl_line++;
 
 				if (opt_border == 2)
-					fprintf(fout, " %s", dformat->rightvrule);
-				else if (opt_border == 1)
-					fputc(' ', fout);
+					fputs(dformat->rightvrule, fout);
 				fputc('\n', fout);
 			}
 
@@ -861,9 +902,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 
 			/* left border */
 			if (opt_border == 2)
-				fprintf(fout, "%s ", dformat->leftvrule);
-			else if (opt_border == 1)
-				fputc(' ', fout);
+				fputs(dformat->leftvrule, fout);
 
 			/* for each column */
 			for (j = 0; j < col_count; j++)
@@ -874,6 +913,17 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 				int			chars_to_output = width_wrap[j];
 				bool		finalspaces = (opt_border == 2 || j < col_count - 1);
 
+				/* Print left-hand wrap or newline mark */
+				if (opt_border != 0)
+				{
+					if (wrap[j] == PRINT_LINE_WRAP_WRAP)
+						fputs(format->wrap_left, fout);
+					else if (wrap[j] == PRINT_LINE_WRAP_NEWLINE)
+						fputs(format->nl_left, fout);
+					else
+						fputc(' ', fout);
+				}
+
 				if (!this_line->ptr)
 				{
 					/* Past newline lines so just pad for other columns */
@@ -908,8 +958,6 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 						/* spaces second */
 						fprintf(fout, "%.*s", bytes_to_output,
 								this_line->ptr + bytes_output[j]);
-						if (finalspaces)
-							fprintf(fout, "%*s", width_wrap[j] - chars_to_output, "");
 					}
 
 					bytes_output[j] += bytes_to_output;
@@ -927,29 +975,54 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 					}
 				}
 
-				/* print a divider, if not the last column */
-				if (j < col_count - 1)
+				/* Determine next line's wrap status for this column */
+				wrap[j] = PRINT_LINE_WRAP_NONE;
+				if (col_lineptrs[j][curr_nl_line[j]].ptr != NULL)
 				{
-					if (opt_border == 0)
-						fputc(' ', fout);
-					/* Next value is beyond past newlines? */
+					if (bytes_output[j] != 0)
+						wrap[j] = PRINT_LINE_WRAP_WRAP;
+					else if (curr_nl_line[j] != 0)
+						wrap[j] = PRINT_LINE_WRAP_NEWLINE;
+				}
+
+				/*
+				 * If left-aligned, pad out remaining space if needed (not
+				 * last column, and/or wrap marks required).
+				 */
+				if (cont->aligns[j] != 'r') /* Left aligned cell */
+				{
+					if (finalspaces ||
+						wrap[j] == PRINT_LINE_WRAP_WRAP ||
+					    wrap[j] == PRINT_LINE_WRAP_NEWLINE)
+						fprintf(fout, "%*s",
+								width_wrap[j] - chars_to_output, "");
+				}
+
+				/* Print right-hand wrap or newline mark */
+				if (wrap[j] == PRINT_LINE_WRAP_WRAP)
+					fputs(format->wrap_right, fout);
+				else if (wrap[j] == PRINT_LINE_WRAP_NEWLINE)
+					fputs(format->nl_right, fout);
+				else if (opt_border == 2 || j < col_count - 1)
+					fputc(' ', fout);
+
+				/* Print column divider, if not the last column */
+				if (opt_border != 0 && j < col_count - 1)
+				{
+					if (wrap[j+1] == PRINT_LINE_WRAP_WRAP)
+						fputs(format->midvrule_wrap, fout);
+					else if (wrap[j+1] == PRINT_LINE_WRAP_NEWLINE)
+						fputs(format->midvrule_nl, fout);
 					else if (col_lineptrs[j + 1][curr_nl_line[j + 1]].ptr == NULL)
-						fprintf(fout, " %s ", format->midvrule_blank);
-					/* In wrapping of value? */
-					else if (bytes_output[j + 1] != 0)
-						fprintf(fout, " %s ", format->midvrule_wrap);
-					/* After first newline value */
-					else if (curr_nl_line[j + 1] != 0)
-						fprintf(fout, " %s ", format->midvrule_cont);
-					/* Ordinary line */
+						fputs(format->midvrule_blank, fout);
 					else
-						fprintf(fout, " %s ", dformat->midvrule);
+						fputs(dformat->midvrule, fout);
 				}
 			}
 
 			/* end-of-row border */
 			if (opt_border == 2)
-				fprintf(fout, " %s", dformat->rightvrule);
+				fputs(dformat->rightvrule, fout);
 			fputc('\n', fout);
 
 		} while (more_lines);
@@ -1196,9 +1269,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 				fprintf(fout, "%*s", hwidth, "");
 
 			if (opt_border > 0)
-				fprintf(fout, " %s ",
-						(line_count == 0) ?
-						format->midvrule_cont : dformat->midvrule);
+				fprintf(fout, " %s ", dformat->midvrule);
 			else
 				fputc(' ', fout);
 
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index b09aac90f77714d4fdabc239f3402ee2299beb49..30df35d115a7e712520a2748a3a31e782b00697f 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.41 2009/10/13 21:04:01 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.42 2009/11/22 05:20:41 tgl Exp $
  */
 #ifndef PRINT_H
 #define PRINT_H
@@ -41,14 +41,30 @@ typedef enum printTextRule
 	PRINT_RULE_DATA				/* data line (hrule is unused here) */
 } printTextRule;
 
+typedef enum printTextLineWrap
+{
+	/* Line wrapping conditions */
+	PRINT_LINE_WRAP_NONE,		/* No wrapping */
+	PRINT_LINE_WRAP_WRAP,		/* Wraparound due to overlength line */
+	PRINT_LINE_WRAP_NEWLINE		/* Newline in data */
+} printTextLineWrap;
+
 typedef struct printTextFormat
 {
 	/* A complete line style */
 	const char *name;				/* for display purposes */
 	printTextLineFormat lrule[4];	/* indexed by enum printTextRule */
-	const char *midvrule_cont;	/* vertical line for continue after newline */
+	const char *midvrule_nl;	/* vertical line for continue after newline */
 	const char *midvrule_wrap;	/* vertical line for wrapped data */
 	const char *midvrule_blank;	/* vertical line for blank data */
+	const char *header_nl_left;	/* left mark after newline */
+	const char *header_nl_right; /* right mark for newline */
+	const char *nl_left;		/* left mark after newline */
+	const char *nl_right;		/* right mark for newline */
+	const char *wrap_left;		/* left mark after wrapped data */
+	const char *wrap_right;		/* right mark for wrapped data */
+	bool		wrap_right_border;	/* use right-hand border for wrap marks
+									 * when border=0? */
 } printTextFormat;
 
 typedef struct printTableOpt
@@ -125,6 +141,7 @@ typedef struct printQueryOpt
 
 
 extern const printTextFormat pg_asciiformat;
+extern const printTextFormat pg_asciiformat_old;
 extern const printTextFormat pg_utf8format;
 
 
diff --git a/src/test/regress/expected/create_cast.out b/src/test/regress/expected/create_cast.out
index 67eaab2316694549d40d143f1e82841070921652..56cd86e00bf8a086d6e00fea2fdd0d153266b9b5 100644
--- a/src/test/regress/expected/create_cast.out
+++ b/src/test/regress/expected/create_cast.out
@@ -53,7 +53,7 @@ SELECT casttestfunc('foo'::text); -- Should work now
 SELECT 1234::int4::casttesttype; -- No cast yet, should fail
 ERROR:  cannot cast type integer to casttesttype
 LINE 1: SELECT 1234::int4::casttesttype;
-               ^
+                         ^
 CREATE CAST (int4 AS casttesttype) WITH INOUT;
 SELECT 1234::int4::casttesttype; -- Should work now
  casttesttype 
diff --git a/src/test/regress/expected/dependency.out b/src/test/regress/expected/dependency.out
index 6eb851a378ca63c448dbbe5d369d5c412793528e..d0895fbd52e15c945290c0cf3d1d0e7deba8aa00 100644
--- a/src/test/regress/expected/dependency.out
+++ b/src/test/regress/expected/dependency.out
@@ -71,9 +71,9 @@ RESET SESSION AUTHORIZATION;
                                             Access privileges
  Schema |   Name   | Type  |                Access privileges                 | Column access privileges 
 --------+----------+-------+--------------------------------------------------+--------------------------
- public | deptest1 | table | regression_user0=arwdDxt/regression_user0        | 
-                           : regression_user1=a*r*w*d*D*x*t*/regression_user0   
-                           : regression_user2=arwdDxt/regression_user1          
+ public | deptest1 | table | regression_user0=arwdDxt/regression_user0       +| 
+        |          |       | regression_user1=a*r*w*d*D*x*t*/regression_user0+| 
+        |          |       | regression_user2=arwdDxt/regression_user1        | 
 (1 row)
 
 DROP OWNED BY regression_user1;
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index f8dd6e8773d7504e76855c9daa7cb27dd864bee4..bb3d167a2bbf433706824e9fcf374a6b7fbca17c 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -366,14 +366,14 @@ GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION;
                                                            List of foreign servers
  Name |       Owner       | Foreign-data wrapper |            Access privileges            |  Type  | Version |           Options            
 ------+-------------------+----------------------+-----------------------------------------+--------+---------+------------------------------
- s1   | foreign_data_user | foo                  | foreign_data_user=U/foreign_data_user   |        | 1.0     | {servername=s1}
-                                                 : regress_test_role=U/foreign_data_user                        
+ s1   | foreign_data_user | foo                  | foreign_data_user=U/foreign_data_user  +|        | 1.0     | {servername=s1}
+      |                   |                      | regress_test_role=U/foreign_data_user   |        |         | 
  s2   | foreign_data_user | foo                  |                                         |        | 1.1     | {host=a,dbname=b}
  s3   | foreign_data_user | foo                  |                                         | oracle |         | {tnsname=orcl,port=1521}
  s4   | foreign_data_user | foo                  |                                         | oracle |         | {host=a,dbname=b}
  s5   | foreign_data_user | foo                  |                                         |        | 15.0    | 
- s6   | foreign_data_user | foo                  | foreign_data_user=U/foreign_data_user   |        | 16.0    | {host=a,dbname=b}
-                                                 : regress_test_role2=U*/foreign_data_user                      
+ s6   | foreign_data_user | foo                  | foreign_data_user=U/foreign_data_user  +|        | 16.0    | {host=a,dbname=b}
+      |                   |                      | regress_test_role2=U*/foreign_data_user |        |         | 
  s7   | foreign_data_user | foo                  |                                         | oracle | 17.0    | {host=a,dbname=b}
  s8   | foreign_data_user | postgresql           |                                         |        |         | {host=localhost,dbname=s8db}
  t1   | regress_test_role | foo                  |                                         |        |         | 
@@ -417,14 +417,14 @@ access to foreign-data wrapper foo
                                                               List of foreign servers
  Name |         Owner         | Foreign-data wrapper |            Access privileges            |  Type  | Version |             Options             
 ------+-----------------------+----------------------+-----------------------------------------+--------+---------+---------------------------------
- s1   | regress_test_indirect | foo                  | foreign_data_user=U/foreign_data_user   |        | 1.1     | {servername=s1}
-                                                     : regress_test_role=U/foreign_data_user                        
+ s1   | regress_test_indirect | foo                  | foreign_data_user=U/foreign_data_user  +|        | 1.1     | {servername=s1}
+      |                       |                      | regress_test_role=U/foreign_data_user   |        |         | 
  s2   | foreign_data_user     | foo                  |                                         |        | 1.1     | {host=a,dbname=b}
  s3   | foreign_data_user     | foo                  |                                         | oracle |         | {tnsname=orcl,port=1521}
  s4   | foreign_data_user     | foo                  |                                         | oracle |         | {host=a,dbname=b}
  s5   | foreign_data_user     | foo                  |                                         |        | 15.0    | 
- s6   | foreign_data_user     | foo                  | foreign_data_user=U/foreign_data_user   |        | 16.0    | {host=a,dbname=b}
-                                                     : regress_test_role2=U*/foreign_data_user                      
+ s6   | foreign_data_user     | foo                  | foreign_data_user=U/foreign_data_user  +|        | 16.0    | {host=a,dbname=b}
+      |                       |                      | regress_test_role2=U*/foreign_data_user |        |         | 
  s7   | foreign_data_user     | foo                  |                                         | oracle | 17.0    | {host=a,dbname=b}
  s8   | foreign_data_user     | postgresql           |                                         |        |         | {dbname=db1,connect_timeout=30}
  t1   | regress_test_role     | foo                  |                                         |        |         | 
diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out
index c805322b6d994ba3cdd9603afed0564a2e1dda25..33e0edba03a351ea5baffca3f982a9425db11efc 100644
--- a/src/test/regress/expected/foreign_key.out
+++ b/src/test/regress/expected/foreign_key.out
@@ -85,10 +85,10 @@ INSERT INTO FKTABLE VALUES (NULL, NULL, 0);
 -- Insert failed rows into FK TABLE
 INSERT INTO FKTABLE VALUES (100, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname"
-DETAIL:  Key (ftest1,ftest2)=(100,2) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2)=(100, 2) is not present in table "pktable".
 INSERT INTO FKTABLE VALUES (2, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname"
-DETAIL:  Key (ftest1,ftest2)=(2,2) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2)=(2, 2) is not present in table "pktable".
 INSERT INTO FKTABLE VALUES (NULL, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname"
 DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
@@ -195,10 +195,10 @@ INSERT INTO FKTABLE VALUES (NULL, NULL, 0);
 -- Insert failed rows into FK TABLE
 INSERT INTO FKTABLE VALUES (100, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname2"
-DETAIL:  Key (ftest1,ftest2)=(100,2) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2)=(100, 2) is not present in table "pktable".
 INSERT INTO FKTABLE VALUES (2, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname2"
-DETAIL:  Key (ftest1,ftest2)=(2,2) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2)=(2, 2) is not present in table "pktable".
 INSERT INTO FKTABLE VALUES (NULL, 2, 4);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname2"
 DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
@@ -359,7 +359,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
 -- Insert a failed values
 INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname3"
-DETAIL:  Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
 -- Show FKTABLE
 SELECT * from FKTABLE;
  ftest1 | ftest2 | ftest3 | ftest4 
@@ -374,13 +374,13 @@ SELECT * from FKTABLE;
 -- Try to update something that should fail
 UPDATE PKTABLE set ptest2=5 where ptest2=2;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable"
-DETAIL:  Key (ptest1,ptest2,ptest3)=(1,2,3) is still referenced from table "fktable".
+DETAIL:  Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable".
 -- Try to update something that should succeed
 UPDATE PKTABLE set ptest1=1 WHERE ptest2=3;
 -- Try to delete something that should fail
 DELETE FROM PKTABLE where ptest1=1 and ptest2=2 and ptest3=3;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable"
-DETAIL:  Key (ptest1,ptest2,ptest3)=(1,2,3) is still referenced from table "fktable".
+DETAIL:  Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable".
 -- Try to delete something that should work
 DELETE FROM PKTABLE where ptest1=2;
 -- Show PKTABLE and FKTABLE
@@ -424,7 +424,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
 -- Insert a failed values
 INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname3"
-DETAIL:  Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
 -- Show FKTABLE
 SELECT * from FKTABLE;
  ftest1 | ftest2 | ftest3 | ftest4 
@@ -522,7 +522,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
 -- Insert a failed values
 INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname3"
-DETAIL:  Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
 -- Show FKTABLE
 SELECT * from FKTABLE;
  ftest1 | ftest2 | ftest3 | ftest4 
@@ -628,7 +628,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
 -- Insert a failed values
 INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname3"
-DETAIL:  Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
 -- Show FKTABLE
 SELECT * from FKTABLE;
  ftest1 | ftest2 | ftest3 | ftest4 
@@ -645,7 +645,7 @@ SELECT * from FKTABLE;
 -- Try to update something that will fail
 UPDATE PKTABLE set ptest2=5 where ptest2=2;
 ERROR:  insert or update on table "fktable" violates foreign key constraint "constrname3"
-DETAIL:  Key (ftest1,ftest2,ftest3)=(1,-1,3) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2, ftest3)=(1, -1, 3) is not present in table "pktable".
 -- Try to update something that will set default
 UPDATE PKTABLE set ptest1=0, ptest2=5, ptest3=10 where ptest2=2;
 UPDATE PKTABLE set ptest2=10 where ptest2=4;
@@ -896,19 +896,19 @@ insert into pktable(base1, ptest1) values (2, 2);
 --  let's insert a non-existant fktable value
 insert into fktable(ftest1, ftest2) values (3, 1);
 ERROR:  insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey"
-DETAIL:  Key (ftest1,ftest2)=(3,1) is not present in table "pktable".
+DETAIL:  Key (ftest1, ftest2)=(3, 1) is not present in table "pktable".
 --  let's make a valid row for that
 insert into pktable(base1,ptest1) values (3, 1);
 insert into fktable(ftest1, ftest2) values (3, 1);
 -- let's try removing a row that should fail from pktable
 delete from pktable where base1>2;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable"
-DETAIL:  Key (base1,ptest1)=(3,1) is still referenced from table "fktable".
+DETAIL:  Key (base1, ptest1)=(3, 1) is still referenced from table "fktable".
 -- okay, let's try updating all of the base1 values to *4
 -- which should fail.
 update pktable set base1=base1*4;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable"
-DETAIL:  Key (base1,ptest1)=(3,1) is still referenced from table "fktable".
+DETAIL:  Key (base1, ptest1)=(3, 1) is still referenced from table "fktable".
 -- okay, let's try an update that should work.
 update pktable set base1=base1*4 where base1<3;
 -- and a delete that should work
@@ -929,15 +929,15 @@ insert into pktable (base1, ptest1, base2, ptest2) values (1, 3, 2, 2);
 -- fails (3,2) isn't in base1, ptest1
 insert into pktable (base1, ptest1, base2, ptest2) values (2, 3, 3, 2);
 ERROR:  insert or update on table "pktable" violates foreign key constraint "pktable_base2_fkey"
-DETAIL:  Key (base2,ptest2)=(3,2) is not present in table "pktable".
+DETAIL:  Key (base2, ptest2)=(3, 2) is not present in table "pktable".
 -- fails (2,2) is being referenced
 delete from pktable where base1=2;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "pktable_base2_fkey" on table "pktable"
-DETAIL:  Key (base1,ptest1)=(2,2) is still referenced from table "pktable".
+DETAIL:  Key (base1, ptest1)=(2, 2) is still referenced from table "pktable".
 -- fails (1,1) is being referenced (twice)
 update pktable set base1=3 where base1=1;
 ERROR:  update or delete on table "pktable" violates foreign key constraint "pktable_base2_fkey" on table "pktable"
-DETAIL:  Key (base1,ptest1)=(1,1) is still referenced from table "pktable".
+DETAIL:  Key (base1, ptest1)=(1, 1) is still referenced from table "pktable".
 -- this sequence of two deletes will work, since after the first there will be no (2,*) references
 delete from pktable where base2=2;
 delete from pktable where base1=2;
diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out
index 1fd2b98f6e8df422af540e771051f26246aa7937..83cacbdd2092b197b213552974e9578c0e1157c3 100644
--- a/src/test/regress/expected/guc.out
+++ b/src/test/regress/expected/guc.out
@@ -685,7 +685,7 @@ language plpgsql
 set work_mem = '1MB';
 select myfunc(0);
 ERROR:  division by zero
-CONTEXT:  SQL statement "SELECT  1/ $1 "
+CONTEXT:  SQL statement "SELECT 1/$1"
 PL/pgSQL function "myfunc" line 3 at PERFORM
 select current_setting('work_mem');
  current_setting 
diff --git a/src/test/regress/expected/prepare.out b/src/test/regress/expected/prepare.out
index 610f25912358bc929ea95199f4ca7635fd937751..7016e82bd42a87990ba86c998f9c9e00a516851a 100644
--- a/src/test/regress/expected/prepare.out
+++ b/src/test/regress/expected/prepare.out
@@ -154,20 +154,20 @@ SELECT name, statement, parameter_types FROM pg_prepared_statements
     ORDER BY name;
  name |                              statement                              |                    parameter_types                     
 ------+---------------------------------------------------------------------+--------------------------------------------------------
- q2   | PREPARE q2(text) AS                                                 | {text}
-      :         SELECT datname, datistemplate, datallowconn                   
-      :         FROM pg_database WHERE datname = $1;                          
- q3   | PREPARE q3(text, int, float, boolean, oid, smallint) AS             | {text,integer,"double precision",boolean,oid,smallint}
-      :         SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR      
-      :         ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int)   
-      :         ORDER BY unique1;                                             
- q5   | PREPARE q5(int, text) AS                                            | {integer,text}
-      :         SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2       
-      :         ORDER BY unique1;                                             
- q6   | PREPARE q6 AS                                                       | {integer,name}
-      :     SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;         
- q7   | PREPARE q7(unknown) AS                                              | {path}
-      :     SELECT * FROM road WHERE thepath = $1;                            
+ q2   | PREPARE q2(text) AS                                                +| {text}
+      |         SELECT datname, datistemplate, datallowconn                +| 
+      |         FROM pg_database WHERE datname = $1;                        | 
+ q3   | PREPARE q3(text, int, float, boolean, oid, smallint) AS            +| {text,integer,"double precision",boolean,oid,smallint}
+      |         SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR   +| 
+      |         ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int)+| 
+      |         ORDER BY unique1;                                           | 
+ q5   | PREPARE q5(int, text) AS                                           +| {integer,text}
+      |         SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2    +| 
+      |         ORDER BY unique1;                                           | 
+ q6   | PREPARE q6 AS                                                      +| {integer,name}
+      |     SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;       | 
+ q7   | PREPARE q7(unknown) AS                                             +| {path}
+      |     SELECT * FROM road WHERE thepath = $1;                          | 
 (5 rows)
 
 -- test DEALLOCATE ALL;
diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out
index aa74083380011045601d55870369a56a2c2d3d33..2e305e699c6a13c73cb9afb06b5a52a9837f68cb 100644
--- a/src/test/regress/expected/triggers.out
+++ b/src/test/regress/expected/triggers.out
@@ -377,10 +377,10 @@ SELECT * FROM main_table ORDER BY a, b;
 SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a';
                 pg_get_triggerdef                 
 --------------------------------------------------
- CREATE TRIGGER modified_a
-     BEFORE UPDATE OF a ON main_table
-     FOR EACH ROW
-     WHEN (old.a <> new.a)
+ CREATE TRIGGER modified_a                       +
+     BEFORE UPDATE OF a ON main_table            +
+     FOR EACH ROW                                +
+     WHEN (old.a <> new.a)                       +
      EXECUTE PROCEDURE trigger_func('modified_a')
 (1 row)
 
@@ -393,10 +393,10 @@ SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'main_table
 SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_any';
                  pg_get_triggerdef                  
 ----------------------------------------------------
- CREATE TRIGGER modified_any
-     BEFORE UPDATE OF a ON main_table
-     FOR EACH ROW
-     WHEN (old.* IS DISTINCT FROM new.*)
+ CREATE TRIGGER modified_any                       +
+     BEFORE UPDATE OF a ON main_table              +
+     FOR EACH ROW                                  +
+     WHEN (old.* IS DISTINCT FROM new.*)           +
      EXECUTE PROCEDURE trigger_func('modified_any')
 (1 row)
 
@@ -427,9 +427,9 @@ SELECT pg_get_triggerdef(oid) FROM pg_trigger WHERE tgrelid = 'main_table'::regc
 SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'after_upd_a_b_row_trig';
                     pg_get_triggerdef                    
 ---------------------------------------------------------
- CREATE TRIGGER after_upd_a_b_row_trig
-     AFTER UPDATE OF a, b ON main_table
-     FOR EACH ROW
+ CREATE TRIGGER after_upd_a_b_row_trig                  +
+     AFTER UPDATE OF a, b ON main_table                 +
+     FOR EACH ROW                                       +
      EXECUTE PROCEDURE trigger_func('after_upd_a_b_row')
 (1 row)
 
diff --git a/src/test/regress/expected/tsearch.out b/src/test/regress/expected/tsearch.out
index 04b75dc6d0b1b2bc7816ef993b53790d1340eabc..1cd9186d6929e1dbdffd18c4cae106b4010e5c65 100644
--- a/src/test/regress/expected/tsearch.out
+++ b/src/test/regress/expected/tsearch.out
@@ -344,8 +344,8 @@ SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.w
      3 | ewri2
     12 |  
     13 | <a href="qwe<qwe>">
-    12 | 
-       : 
+    12 |                                     +
+       | 
     19 | /usr/local/fff
     12 |  
     19 | /awdf/dwqe/4325
@@ -377,8 +377,8 @@ SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.w
     20 | -4.2
     12 | . 
     22 | 234
-    12 | 
-       : 
+    12 |                                     +
+       | 
     12 | <
      1 | i
     12 |  
@@ -559,9 +559,9 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'paint&water'));
                ts_headline               
 -----------------------------------------
- <b>painted</b> Ocean.
- <b>Water</b>, <b>water</b>, every where
-   And all the boards did shrink;
+ <b>painted</b> Ocean.                  +
+ <b>Water</b>, <b>water</b>, every where+
+   And all the boards did shrink;       +
  <b>Water</b>, <b>water</b>, every
 (1 row)
 
@@ -578,9 +578,9 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'breath&motion&water'));
            ts_headline            
 ----------------------------------
- <b>breath</b> nor <b>motion</b>,
- As idle as a painted Ship
-   Upon a painted Ocean.
+ <b>breath</b> nor <b>motion</b>,+
+ As idle as a painted Ship       +
+   Upon a painted Ocean.         +
  <b>Water</b>, <b>water</b>
 (1 row)
 
@@ -597,9 +597,9 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'ocean'));
            ts_headline            
 ----------------------------------
- <b>Ocean</b>.
- Water, water, every where
-   And all the boards did shrink;
+ <b>Ocean</b>.                   +
+ Water, water, every where       +
+   And all the boards did shrink;+
  Water, water, every where
 (1 row)
 
@@ -618,17 +618,17 @@ ff-bg
 to_tsquery('english', 'sea&foo'), 'HighlightAll=true');
                                  ts_headline                                 
 -----------------------------------------------------------------------------
- 
- <html>
- <!-- some comment -->
- <body>
- <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
- <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
- ff-bg
- <script>
-        document.write(15);
- </script>
- </body>
+                                                                            +
+ <html>                                                                     +
+ <!-- some comment -->                                                      +
+ <body>                                                                     +
+ <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>                        +
+ <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
+ ff-bg                                                                      +
+ <script>                                                                   +
+        document.write(15);                                                 +
+ </script>                                                                  +
+ </body>                                                                    +
  </html>
 (1 row)
 
@@ -646,13 +646,13 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'ocean'), 'MaxFragments=1');
             ts_headline             
 ------------------------------------
- after day,
-   We stuck, nor breath nor motion,
- As idle as a painted Ship
-   Upon a painted <b>Ocean</b>.
- Water, water, every where
-   And all the boards did shrink;
- Water, water, every where,
+ after day,                        +
+   We stuck, nor breath nor motion,+
+ As idle as a painted Ship         +
+   Upon a painted <b>Ocean</b>.    +
+ Water, water, every where         +
+   And all the boards did shrink;  +
+ Water, water, every where,        +
    Nor any drop
 (1 row)
 
@@ -670,13 +670,13 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2');
                  ts_headline                  
 ----------------------------------------------
- after day, day after day,
-   We <b>stuck</b>, nor breath nor motion,
- As idle as a painted Ship
-   Upon a painted Ocean.
- Water, water, every where
-   And all the boards did shrink;
- Water, water, every where ... drop to drink.
+ after day, day after day,                   +
+   We <b>stuck</b>, nor breath nor motion,   +
+ As idle as a painted Ship                   +
+   Upon a painted Ocean.                     +
+ Water, water, every where                   +
+   And all the boards did shrink;            +
+ Water, water, every where ... drop to drink.+
  S. T. <b>Coleridge</b>
 (1 row)
 
@@ -694,9 +694,9 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1');
             ts_headline             
 ------------------------------------
- 
- Day after day, day after day,
-   We stuck, nor breath nor motion,
+                                   +
+ Day after day, day after day,     +
+   We stuck, nor breath nor motion,+
  As idle as
 (1 row)
 
@@ -714,13 +714,13 @@ S. T. Coleridge (1772-1834)
 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***');
                 ts_headline                 
 --------------------------------------------
- after day, day after day,
-   We <b>stuck</b>, nor breath nor motion,
- As idle as a painted Ship
-   Upon a painted Ocean.
- Water, water, every where
-   And all the boards did shrink;
- Water, water, every where***drop to drink.
+ after day, day after day,                 +
+   We <b>stuck</b>, nor breath nor motion, +
+ As idle as a painted Ship                 +
+   Upon a painted Ocean.                   +
+ Water, water, every where                 +
+   And all the boards did shrink;          +
+ Water, water, every where***drop to drink.+
  S. T. <b>Coleridge</b>
 (1 row)
 
diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out
index a3e94e93d499128cb49f25757f908c9b99c40920..e46ed78ae692d2341e11548f1e0201bbe5f804c6 100644
--- a/src/test/regress/expected/with.out
+++ b/src/test/regress/expected/with.out
@@ -279,16 +279,16 @@ SELECT pg_get_viewdef('vsubdepartment'::regclass);
 SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
                                     pg_get_viewdef                                    
 --------------------------------------------------------------------------------------
-  WITH RECURSIVE subdepartment AS (
-                  SELECT department.id, department.parent_department, department.name
-                    FROM department
-                   WHERE department.name = 'A'::text
-         UNION ALL 
-                  SELECT d.id, d.parent_department, d.name
-                    FROM department d, subdepartment sd
-                   WHERE d.parent_department = sd.id
-         )
-  SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name
+  WITH RECURSIVE subdepartment AS (                                                  +
+                  SELECT department.id, department.parent_department, department.name+
+                    FROM department                                                  +
+                   WHERE department.name = 'A'::text                                 +
+         UNION ALL                                                                   +
+                  SELECT d.id, d.parent_department, d.name                           +
+                    FROM department d, subdepartment sd                              +
+                   WHERE d.parent_department = sd.id                                 +
+         )                                                                           +
+  SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name       +
     FROM subdepartment;
 (1 row)