Re: Problem with displaying "wide" tables in psql

Started by Emre Hasegelialmost 12 years ago26 messages
#1Emre Hasegeli
emre@hasegeli.com

Hi,

This is my review about 3th version of the patch. It is an useful
improvement in my opinion. It worked well on my environment.

2013-12-11 17:43:06, Sergey Muraviov <sergey.k.muraviov@gmail.com>:

It works in expanded mode when either format option is set to wrapped
(\pset format wrapped), or we have no pager, or pager doesn't chop long
lines (so you can still use the trick).

I do not like this logic on the IsWrappingNeeded function. It does not
seems right to check the environment variables for less. It would be hard
to explain this behavior to the users. It is better to make this only
the behavior of the wrapped format in expanded mode, in my opinion.

{
if (opt_border < 2)
fprintf(fout, "%s\n", dlineptr[line_count].ptr);
else
fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
dwidth - dlineptr[line_count].width, "",
dformat->rightvrule);
}

Is it necessary to keep this old print line code? It seems to me the new
code works well on (dlineptr[line_count].width <= dwidth) condition.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Emre Hasegeli (#1)
1 attachment(s)

Hi.

Thanks for your review.

2014-02-15 20:08 GMT+04:00 Emre Hasegeli <emre@hasegeli.com>:

Hi,

This is my review about 3th version of the patch. It is an useful
improvement in my opinion. It worked well on my environment.

2013-12-11 17:43:06, Sergey Muraviov <sergey.k.muraviov@gmail.com>:

It works in expanded mode when either format option is set to wrapped
(\pset format wrapped), or we have no pager, or pager doesn't chop long
lines (so you can still use the trick).

I do not like this logic on the IsWrappingNeeded function. It does not
seems right to check the environment variables for less. It would be hard
to explain this behavior to the users. It is better to make this only
the behavior of the wrapped format in expanded mode, in my opinion.

You are right. This logic is too complicated.
New patch works with PRINT_WRAPPED option only.

{
if (opt_border < 2)
fprintf(fout, "%s\n",

dlineptr[line_count].ptr);

else
fprintf(fout, "%-s%*s

%s\n", dlineptr[line_count].ptr,

dwidth -

dlineptr[line_count].width, "",

dformat->rightvrule);

}

Is it necessary to keep this old print line code? It seems to me the new
code works well on (dlineptr[line_count].width <= dwidth) condition.

New code doesn't work with empty strings but I've done minor optimization
for this case.

--
Best regards,
Sergey Muraviov

Attachments:

fix_psql_print_aligned_vertical_v4.patchtext/x-patch; charset=US-ASCII; name=fix_psql_print_aligned_vertical_v4.patchDownload
From 48ba7ed8c5ff82cdc1c912ff9ac966962f18ce54 Mon Sep 17 00:00:00 2001
From: Sergey Muraviov <sergey.k.muraviov@gmail.com>
Date: Sun, 16 Feb 2014 20:00:10 +0400
Subject: [PATCH] Now patch works with PRINT_WRAPPED option only

---
 src/bin/psql/print.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 71 insertions(+), 8 deletions(-)

diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..d7bf412 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1234,6 +1234,45 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+	if (cont->opt->format == PRINT_WRAPPED)
+	{
+		int output_columns = 0;
+		/*
+		 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+		 */
+		if (cont->opt->columns > 0)
+			output_columns = cont->opt->columns;
+		else
+		{
+			if (cont->opt->env_columns > 0)
+				output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+			else
+			{
+				struct winsize screen_size;
+
+				if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+					output_columns = screen_size.ws_col;
+			}
+#endif
+		}
+
+		output_columns -= hwidth;
+
+		if (opt_border == 0)
+			output_columns -= 1;
+		else
+		{
+			output_columns -= 3; /* -+- */
+
+			if (opt_border > 1)
+				output_columns -= 4; /* +--+ */
+		}
+
+		if ((output_columns > 0) && (dwidth > output_columns))
+			dwidth = output_columns;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
@@ -1292,20 +1331,45 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			else
 				fputc(' ', fout);
 
-			if (!dcomplete)
+			if ((!dcomplete) && (dlineptr[line_count].width > 0))
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
-				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+				int offset = 0;
+				int chars_to_output = dlineptr[line_count].width;
+				while (chars_to_output > 0)
+				{
+					int target_width, bytes_to_output;
+					if (offset > 0)
+					{
+						if (opt_border == 2)
+							fprintf(fout, "%s ", dformat->leftvrule);
+
+						fprintf(fout, "%*s", hwidth, " ");
+
+						if (opt_border > 0)
+							fprintf(fout, " %s ", dformat->midvrule);
+						else
+							fputc(' ', fout);
+					}
+
+					target_width = dwidth;
+					bytes_to_output = strlen_max_width(dlineptr[line_count].ptr + offset,
+														&target_width, encoding);
+					fputnbytes(fout, (char *)(dlineptr[line_count].ptr + offset), bytes_to_output);
+					chars_to_output -= target_width;
+					offset += bytes_to_output;
+
+					if (opt_border < 2)
+						fputc('\n', fout);
+					else
+						fprintf(fout, "%*s %s\n", dwidth - target_width, "", dformat->rightvrule);
+				}
 
 				if (!dlineptr[line_count + 1].ptr)
 					dcomplete = 1;
 			}
 			else
 			{
+				dcomplete = 1;
 				if (opt_border < 2)
 					fputc('\n', fout);
 				else
@@ -2175,7 +2239,6 @@ print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
 /* Public functions		*/
 /********************************/
 
-
 /*
  * PageOutput
  *
-- 
1.8.5.3

#3Emre Hasegeli
emre@hasegeli.com
In reply to: Sergey Muraviov (#2)
1 attachment(s)

2014-02-16 18:37, Sergey Muraviov <sergey.k.muraviov@gmail.com>:

New code doesn't work with empty strings but I've done minor optimization
for this case.

It seems better now. I added some new lines and spaces, removed unnecessary
parentheses and marked it as "Ready for Committer".

Attachments:

fix_psql_print_aligned_vertical_v5.patchapplication/octet-stream; name=fix_psql_print_aligned_vertical_v5.patchDownload
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..659d197 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1234,6 +1234,46 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+	if (cont->opt->format == PRINT_WRAPPED)
+	{
+		int output_columns = 0;
+
+		/*
+		 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+		 */
+		if (cont->opt->columns > 0)
+			output_columns = cont->opt->columns;
+		else
+		{
+			if (cont->opt->env_columns > 0)
+				output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+			else
+			{
+				struct winsize screen_size;
+
+				if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+					output_columns = screen_size.ws_col;
+			}
+#endif
+		}
+
+		output_columns -= hwidth;
+
+		if (opt_border == 0)
+			output_columns -= 1;
+		else
+		{
+			output_columns -= 3; /* -+- */
+
+			if (opt_border > 1)
+				output_columns -= 4; /* +--+ */
+		}
+
+		if (output_columns > 0 && dwidth > output_columns)
+			dwidth = output_columns;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
@@ -1292,20 +1332,52 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			else
 				fputc(' ', fout);
 
-			if (!dcomplete)
+			if (!dcomplete && dlineptr[line_count].width > 0)
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
-				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+				int		offset = 0,
+						chars_to_output = dlineptr[line_count].width;
+
+				while (chars_to_output > 0)
+				{
+					int 	target_width,
+							bytes_to_output;
+
+					if (offset > 0)
+					{
+						if (opt_border == 2)
+							fprintf(fout, "%s ", dformat->leftvrule);
+
+						fprintf(fout, "%*s", hwidth, " ");
+
+						if (opt_border > 0)
+							fprintf(fout, " %s ", dformat->midvrule);
+						else
+							fputc(' ', fout);
+					}
+
+					target_width = dwidth;
+					bytes_to_output = strlen_max_width(dlineptr[line_count].ptr + offset,
+													   &target_width, encoding);
+					fputnbytes(fout, (char *)(dlineptr[line_count].ptr + offset),
+							   bytes_to_output);
+
+					chars_to_output -= target_width;
+					offset += bytes_to_output;
+
+					if (opt_border < 2)
+						fputc('\n', fout);
+					else
+						fprintf(fout, "%*s %s\n", dwidth - target_width, "",
+								dformat->rightvrule);
+				}
 
 				if (!dlineptr[line_count + 1].ptr)
 					dcomplete = 1;
 			}
 			else
 			{
+				dcomplete = 1;
+
 				if (opt_border < 2)
 					fputc('\n', fout);
 				else
#4Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Emre Hasegeli (#3)

Thanks.

2014-02-17 12:22 GMT+04:00 Emre Hasegeli <emre@hasegeli.com>:

2014-02-16 18:37, Sergey Muraviov <sergey.k.muraviov@gmail.com>:

New code doesn't work with empty strings but I've done minor optimization
for this case.

It seems better now. I added some new lines and spaces, removed unnecessary
parentheses and marked it as "Ready for Committer".

--
Best regards,
Sergey Muraviov

#5Greg Stark
stark@mit.edu
In reply to: Emre Hasegeli (#1)

On Sat, Feb 15, 2014 at 11:08 AM, Emre Hasegeli <emre@hasegeli.com> wrote:

This is my review about 3th version of the patch. It is an useful
improvement in my opinion. It worked well on my environment.

I'm reviewing this patch.

One thing to comment:

With no doc changes and no regression tests I was halfway inclined to
just reject it out of hand. To be fair there were no regression tests
for wrapped output prior to the patch but still I would have wanted to
see them added. We often pare down regression tests when committing
patches but it's easier to pare them down than write new ones and it
helps show the author's intention.

In this case I'm inclined to expand the regression tests. We've had
bugs in these formatting functions before and at least I find it hard
to touch code like this with any confidence that I'm not breaking
things. Formatting code ends up being pretty spaghetti-like easily and
there are lots of cases so it's easy to unintentionally break cases
you didn't realize you were touching.

In addition there are several cases of logic that looks like this:

if (x)
..
else
{
if (y)
...
else
...
}

I know there are other opinions on this but I find this logic very
difficut to follow. It's almost always clearer to refactor the
branches into a flat if / else if / else if /.../ else form. Even if
it results in some duplication of code (typically there's some trivial
bit of code outside the second "if") it's easy to quickly see whether
all the cases are handled and understand whether any of the cases have
forgotten any steps.

--
greg

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Andres Freund
andres@2ndquadrant.com
In reply to: Greg Stark (#5)

On 2014-04-08 12:15:47 -0400, Greg Stark wrote:

With no doc changes and no regression tests I was halfway inclined to
just reject it out of hand. To be fair there were no regression tests
for wrapped output prior to the patch but still I would have wanted to
see them added. We often pare down regression tests when committing
patches but it's easier to pare them down than write new ones and it
helps show the author's intention.

I don't think this is easily testable that way - doesn't it rely on
determining the width of the terminal? Which you won't have when started
from pg_regress?

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Greg Stark
stark@mit.edu
In reply to: Andres Freund (#6)

On Tue, Apr 8, 2014 at 12:19 PM, Andres Freund <andres@2ndquadrant.com> wrote:

I don't think this is easily testable that way - doesn't it rely on
determining the width of the terminal? Which you won't have when started
from pg_regress?

There's a pset variable to set the target width so at least the
formatting code can be tested. It would be nice to have the ioctl at
least get called on the regression farm so we're sure we aren't doing
something unportable.

--
greg

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Greg Stark (#7)

Hi.

How can I pass or set the value of pset variable for an regression test?

The code with ioctl was copied from print_aligned_text function, which has
a long history.
43ee2282 (Bruce Momjian 2008-05-16 16:59:05 +0000 680)
if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)

2014-04-08 20:27 GMT+04:00 Greg Stark <stark@mit.edu>:

On Tue, Apr 8, 2014 at 12:19 PM, Andres Freund <andres@2ndquadrant.com>
wrote:

I don't think this is easily testable that way - doesn't it rely on
determining the width of the terminal? Which you won't have when started
from pg_regress?

There's a pset variable to set the target width so at least the
formatting code can be tested. It would be nice to have the ioctl at
least get called on the regression farm so we're sure we aren't doing
something unportable.

--
greg

--
Best regards,
Sergey Muraviov

#9Greg Stark
stark@mit.edu
In reply to: Sergey Muraviov (#8)

How can I pass or set the value of pset variable for an regression test?

I just wrote some tests using \pset columns to control the output.

Having figured out what the point of the patch is I'm pretty happy
with the functionality. It definitely is something I would appreciate
having.

One thing I noticed is that it's not using the formatting characters
to indicate newlines and wrapping. I'm trying to add that myself but
it's taking me a bit to figure out what's going on in the formatting
code. I do have a feeling this is all rearranging the deck chairs on
an obsolete technology and this should all be replaced with a web ui.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Greg Stark
stark@mit.edu
In reply to: Greg Stark (#9)
1 attachment(s)

Ok, So I've hacked on this a bit. Below is a test case showing the
problems I've found.

1) It isn't using the "newline" and "wrap" indicators or dividing lines.

2) The header is not being displayed properly when it contains a newline.

I can hack in the newline and wrap indicators but the header
formatting requires reworking the logic a bit. The header and data
need to be stepped through in parallel rather than having a loop to
handle the wrapping within the handling of a single line. I don't
really have time for that today but if you can get to it that would be
fine,

Attachments:

psql-wrapping-tests.txttext/plain; charset=UTF-8; name=psql-wrapping-tests.txtDownload
#11Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Greg Stark (#10)

Hi.

Thanks for your tests.

I've fixed problem with headers, but got new one with data.
I'll try to solve it tomorrow.

2014-04-10 18:45 GMT+04:00 Greg Stark <stark@mit.edu>:

Ok, So I've hacked on this a bit. Below is a test case showing the
problems I've found.

1) It isn't using the "newline" and "wrap" indicators or dividing lines.

2) The header is not being displayed properly when it contains a newline.

I can hack in the newline and wrap indicators but the header
formatting requires reworking the logic a bit. The header and data
need to be stepped through in parallel rather than having a loop to
handle the wrapping within the handling of a single line. I don't
really have time for that today but if you can get to it that would be
fine,

--
Best regards,
Sergey Muraviov

#12Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Sergey Muraviov (#11)
1 attachment(s)

Hi.

I've done some corrections for printing "newline" and "wrap" indicators.
Please review the attached patch.

2014-04-11 0:14 GMT+04:00 Sergey Muraviov <sergey.k.muraviov@gmail.com>:

Hi.

Thanks for your tests.

I've fixed problem with headers, but got new one with data.
I'll try to solve it tomorrow.

2014-04-10 18:45 GMT+04:00 Greg Stark <stark@mit.edu>:

Ok, So I've hacked on this a bit. Below is a test case showing the

problems I've found.

1) It isn't using the "newline" and "wrap" indicators or dividing lines.

2) The header is not being displayed properly when it contains a newline.

I can hack in the newline and wrap indicators but the header
formatting requires reworking the logic a bit. The header and data
need to be stepped through in parallel rather than having a loop to
handle the wrapping within the handling of a single line. I don't
really have time for that today but if you can get to it that would be
fine,

--
Best regards,
Sergey Muraviov

--
Best regards,
Sergey Muraviov

Attachments:

fix_psql_print_aligned_vertical_v6.patchtext/x-patch; charset=US-ASCII; name=fix_psql_print_aligned_vertical_v6.patchDownload
From 5e0f44994d04a81523920a78d3a35603e919170c Mon Sep 17 00:00:00 2001
From: Sergey Muraviov <sergey.k.muraviov@gmail.com>
Date: Fri, 11 Apr 2014 11:03:41 +0400
Subject: [PATCH] Using "newline" and "wrap" indicators

---
 src/bin/psql/print.c | 130 +++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 110 insertions(+), 20 deletions(-)

diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..6463162 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1234,13 +1234,56 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+		if (cont->opt->format == PRINT_WRAPPED)
+	{
+		int output_columns = 0;
+
+		/*
+		 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+		 */
+		if (cont->opt->columns > 0)
+			output_columns = cont->opt->columns;
+		else
+		{
+			if (cont->opt->env_columns > 0)
+				output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+			else
+			{
+				struct winsize screen_size;
+
+				if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+					output_columns = screen_size.ws_col;
+			}
+#endif
+		}
+
+		output_columns -= hwidth;
+
+		if (opt_border == 0)
+			output_columns -= 1;
+		else
+		{
+			output_columns -= 3; /* -+- */
+
+			if (opt_border > 1)
+				output_columns -= 4; /* +--+ */
+		}
+
+		if (output_columns > 0 && dwidth > output_columns)
+			dwidth = output_columns;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
 		printTextRule pos;
-		int			line_count,
+		int			dline,
+					hline,
 					dcomplete,
-					hcomplete;
+					hcomplete,
+					offset,
+					chars_to_output;
 
 		if (cancel_pressed)
 			break;
@@ -1270,48 +1313,95 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 		pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
 					 dlineptr, dheight);
 
-		line_count = 0;
+		dline = hline = 0;
 		dcomplete = hcomplete = 0;
+		offset = 0;
+		chars_to_output = dlineptr[dline].width;
 		while (!dcomplete || !hcomplete)
 		{
+			/* Left border */
 			if (opt_border == 2)
 				fprintf(fout, "%s ", dformat->leftvrule);
+
+			/* Header */
 			if (!hcomplete)
 			{
-				fprintf(fout, "%-s%*s", hlineptr[line_count].ptr,
-						hwidth - hlineptr[line_count].width, "");
+				int swidth = hwidth - hlineptr[hline].width - 1;
+				fprintf(fout, "%-s", hlineptr[hline].ptr);
+				if (swidth > 0) /* spacer */
+					fprintf(fout, "%*s", swidth, "");
 
-				if (!hlineptr[line_count + 1].ptr)
+				if (!hlineptr[hline + 1].ptr)
+				{
+					fputs(" ", fout);
 					hcomplete = 1;
+				}
+				else 
+				{
+					fputs(format->nl_right, fout);
+					hline++;
+				}
 			}
 			else
-				fprintf(fout, "%*s", hwidth, "");
+				fprintf(fout, "%*s", hwidth + 1, "");
 
+			/* Separator */
 			if (opt_border > 0)
-				fprintf(fout, " %s ", dformat->midvrule);
-			else
-				fputc(' ', fout);
+				fprintf(fout, "%s", dformat->midvrule);
 
+			/* Data */
 			if (!dcomplete)
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
+				int target_width,
+					bytes_to_output,
+					swidth;
+
+				fputs(!dcomplete && !offset? " ": format->wrap_left, fout);
+
+				target_width = dwidth;
+				bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
+												   &target_width, encoding);
+				fputnbytes(fout, (char *)(dlineptr[dline].ptr + offset),
+						   bytes_to_output);
+
+				chars_to_output -= target_width;
+				offset += bytes_to_output;
+
+				/* spacer */
+				swidth = dwidth - target_width;
+				if (swidth > 0)
+					fprintf(fout, "%*s", swidth, "");
+
+				if (!chars_to_output)
+				{
+					if (!dlineptr[dline + 1].ptr)
+					{
+						fputs(" ", fout);
+						dcomplete = 1;
+					}
+					else
+					{
+						fputs(format->nl_right, fout);
+						dline++;
+						offset = 0;
+						chars_to_output = dlineptr[dline].width;
+					}
+				}
 				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+					fputs(format->wrap_right, fout);
+
+				if (opt_border == 2)
+					fputs(dformat->rightvrule, fout);
 
-				if (!dlineptr[line_count + 1].ptr)
-					dcomplete = 1;
+				fputs("\n", fout);
 			}
 			else
 			{
 				if (opt_border < 2)
-					fputc('\n', fout);
+					fputs("\n", fout);
 				else
-					fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
+					fprintf(fout, "%*s  %s\n", dwidth, "", dformat->rightvrule);
 			}
-			line_count++;
 		}
 	}
 
-- 
1.8.5.3

#13Greg Stark
stark@mit.edu
In reply to: Sergey Muraviov (#12)
1 attachment(s)

Looks good.

It's still not doing the old-ascii column dividers but to be honest
I'm not sure what the intended behaviour of old-ascii is. I've noticed
old-ascii only displays the line markers for dividing lines, not the
final one. That seems pretty useless and maybe it's why we switched to
the new "ascii" mode, I don't recall.

This is the way old-ascii displays when two columns are wrapping -- it
seems pretty confused to me. The headers are displaying newline
markers from the ascii style instead of : indicators in the dividing
line. The : and ; markers are only displayed for the first column, not
the second one.

Maybe since the : and ; markers aren't shown for the final column that
means the expanded mode doesn't have to do anything since the column
is only ever the final column.

+--------------------+-----------------+
| x | x |
|+ y |+ y |
|+ z |+ z |
+--------------------+-----------------+
| x | xxxxxxxxxxxxxxx |
| xx ; xxxx |
| xxx : xxxxxxxxxxxxxxx |
| xxxx ; xxx |
| xxxxx : xxxxxxxxxxxxxxx |
| xxxxxx ; xx |
| xxxxxxx : xxxxxxxxxxxxxxx |
| xxxxxxxx ; x |
| xxxxxxxxx : xxxxxxxxxxxxxxx |
| xxxxxxxxxx : xxxxxxxxxxxxxx |
| xxxxxxxxxxx : xxxxxxxxxxxxx |
| xxxxxxxxxxxx : xxxxxxxxxxxx |
| xxxxxxxxxxxxx : xxxxxxxxxxx |
| xxxxxxxxxxxxxx : xxxxxxxxxx |
| xxxxxxxxxxxxxxx : xxxxxxxxx |
| xxxxxxxxxxxxxxxx : xxxxxxxx |
| xxxxxxxxxxxxxxxxx : xxxxxxx |
| xxxxxxxxxxxxxxxxxx : xxxxxx |
| xxxxxxxxxxxxxxxxxx : xxxxx |
| x : xxxx |
| xxxxxxxxxxxxxxxxxx : xxx |
| xx : xx |
| xxxxxxxxxxxxxxxxxx : x |
| xxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxxxx |
| xxxxxxxxxxxxxxxxxx |
| xxxxxxx |
+--------------------+-----------------+

Attachments:

printc-debug-3.txttext/plain; charset=UTF-8; name=printc-debug-3.txtDownload
#14Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Greg Stark (#13)
1 attachment(s)

I hope that I realized old-ascii logic correctly.

2014-04-11 19:10 GMT+04:00 Greg Stark <stark@mit.edu>:

Looks good.

It's still not doing the old-ascii column dividers but to be honest
I'm not sure what the intended behaviour of old-ascii is. I've noticed
old-ascii only displays the line markers for dividing lines, not the
final one. That seems pretty useless and maybe it's why we switched to
the new "ascii" mode, I don't recall.

This is the way old-ascii displays when two columns are wrapping -- it
seems pretty confused to me. The headers are displaying newline
markers from the ascii style instead of : indicators in the dividing
line. The : and ; markers are only displayed for the first column, not
the second one.

Maybe since the : and ; markers aren't shown for the final column that
means the expanded mode doesn't have to do anything since the column
is only ever the final column.

+--------------------+-----------------+
| x | x |
|+ y |+ y |
|+ z |+ z |
+--------------------+-----------------+
| x | xxxxxxxxxxxxxxx |
| xx ; xxxx |
| xxx : xxxxxxxxxxxxxxx |
| xxxx ; xxx |
| xxxxx : xxxxxxxxxxxxxxx |
| xxxxxx ; xx |
| xxxxxxx : xxxxxxxxxxxxxxx |
| xxxxxxxx ; x |
| xxxxxxxxx : xxxxxxxxxxxxxxx |
| xxxxxxxxxx : xxxxxxxxxxxxxx |
| xxxxxxxxxxx : xxxxxxxxxxxxx |
| xxxxxxxxxxxx : xxxxxxxxxxxx |
| xxxxxxxxxxxxx : xxxxxxxxxxx |
| xxxxxxxxxxxxxx : xxxxxxxxxx |
| xxxxxxxxxxxxxxx : xxxxxxxxx |
| xxxxxxxxxxxxxxxx : xxxxxxxx |
| xxxxxxxxxxxxxxxxx : xxxxxxx |
| xxxxxxxxxxxxxxxxxx : xxxxxx |
| xxxxxxxxxxxxxxxxxx : xxxxx |
| x : xxxx |
| xxxxxxxxxxxxxxxxxx : xxx |
| xx : xx |
| xxxxxxxxxxxxxxxxxx : x |
| xxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxxx : |
| xxxxxxxxxxxxxxxxxx : |
| xxxxxx |
| xxxxxxxxxxxxxxxxxx |
| xxxxxxx |
+--------------------+-----------------+

--
Best regards,
Sergey Muraviov

Attachments:

fix_psql_print_aligned_vertical_v7.patchtext/x-patch; charset=US-ASCII; name=fix_psql_print_aligned_vertical_v7.patchDownload
From 69d845f05864a5d07a90ee20e10a5cb09b78d1d3 Mon Sep 17 00:00:00 2001
From: Sergey Muraviov <sergey.k.muraviov@gmail.com>
Date: Fri, 11 Apr 2014 20:55:17 +0400
Subject: [PATCH] Support for old-ascii mode

---
 src/bin/psql/print.c | 144 +++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 122 insertions(+), 22 deletions(-)

diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..2c58cb5 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1234,13 +1234,56 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+	if (cont->opt->format == PRINT_WRAPPED)
+	{
+		int output_columns = 0;
+
+		/*
+		 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+		 */
+		if (cont->opt->columns > 0)
+			output_columns = cont->opt->columns;
+		else
+		{
+			if (cont->opt->env_columns > 0)
+				output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+			else
+			{
+				struct winsize screen_size;
+
+				if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+					output_columns = screen_size.ws_col;
+			}
+#endif
+		}
+
+		output_columns -= hwidth;
+
+		if (opt_border == 0)
+			output_columns -= 1;
+		else
+		{
+			output_columns -= 3; /* -+- */
+
+			if (opt_border > 1)
+				output_columns -= 4; /* +--+ */
+		}
+
+		if (output_columns > 0 && dwidth > output_columns)
+			dwidth = output_columns;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
 		printTextRule pos;
-		int			line_count,
+		int			dline,
+					hline,
 					dcomplete,
-					hcomplete;
+					hcomplete,
+					offset,
+					chars_to_output;
 
 		if (cancel_pressed)
 			break;
@@ -1270,48 +1313,105 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 		pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
 					 dlineptr, dheight);
 
-		line_count = 0;
+		dline = hline = 0;
 		dcomplete = hcomplete = 0;
+		offset = 0;
+		chars_to_output = dlineptr[dline].width;
 		while (!dcomplete || !hcomplete)
 		{
+			/* Left border */
 			if (opt_border == 2)
-				fprintf(fout, "%s ", dformat->leftvrule);
+				fputs(dformat->leftvrule, fout);
+
+			/* Header */
 			if (!hcomplete)
 			{
-				fprintf(fout, "%-s%*s", hlineptr[line_count].ptr,
-						hwidth - hlineptr[line_count].width, "");
+				int swidth = hwidth - hlineptr[hline].width - 1;
+				fputs(hline? format->header_nl_left: " ", fout);
+				fprintf(fout, "%-s", hlineptr[hline].ptr);
+				if (swidth > 0) /* spacer */
+					fprintf(fout, "%*s", swidth, "");
 
-				if (!hlineptr[line_count + 1].ptr)
+				if (!hlineptr[hline + 1].ptr)
+				{
+					fputs(" ", fout);
 					hcomplete = 1;
+				}
+				else 
+				{
+					fputs(format->header_nl_right, fout);
+					hline++;
+				}
 			}
 			else
-				fprintf(fout, "%*s", hwidth, "");
+				fprintf(fout, "%*s", hwidth + 2, "");
 
-			if (opt_border > 0)
-				fprintf(fout, " %s ", dformat->midvrule);
-			else
-				fputc(' ', fout);
+			/* Separator */
+			if (opt_border != 0)
+			{
+				if (offset)
+					fputs(format->midvrule_wrap, fout);
+				else if (!dline)
+					fputs(dformat->midvrule, fout);
+				else if (dline)
+					fputs(format->midvrule_nl, fout);
+				else
+					fputs(format->midvrule_blank, fout);
+			}
 
+			/* Data */
 			if (!dcomplete)
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
+				int target_width,
+					bytes_to_output,
+					swidth;
+
+				fputs(!dcomplete && !offset? " ": format->wrap_left, fout);
+
+				target_width = dwidth;
+				bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
+												   &target_width, encoding);
+				fputnbytes(fout, (char *)(dlineptr[dline].ptr + offset),
+						   bytes_to_output);
+
+				chars_to_output -= target_width;
+				offset += bytes_to_output;
+
+				/* spacer */
+				swidth = dwidth - target_width;
+				if (swidth > 0)
+					fprintf(fout, "%*s", swidth, "");
+
+				if (!chars_to_output)
+				{
+					if (!dlineptr[dline + 1].ptr)
+					{
+						fputs(" ", fout);
+						dcomplete = 1;
+					}
+					else
+					{
+						fputs(format->nl_right, fout);
+						dline++;
+						offset = 0;
+						chars_to_output = dlineptr[dline].width;
+					}
+				}
 				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+					fputs(format->wrap_right, fout);
+
+				if (opt_border == 2)
+					fputs(dformat->rightvrule, fout);
 
-				if (!dlineptr[line_count + 1].ptr)
-					dcomplete = 1;
+				fputs("\n", fout);
 			}
 			else
 			{
 				if (opt_border < 2)
-					fputc('\n', fout);
+					fputs("\n", fout);
 				else
-					fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
+					fprintf(fout, "%*s  %s\n", dwidth, "", dformat->rightvrule);
 			}
-			line_count++;
 		}
 	}
 
-- 
1.9.0

#15Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Sergey Muraviov (#14)

Sergey Muraviov wrote:

I hope that I realized old-ascii logic correctly.

I don't know what you changed here, but I don't think we need to
preserve old-ascii behavior in the new code, in any way. If you're
mimicking something obsolete and the end result of the new feature is
not great, perhaps that should be rethought.

Can you please provide sample output for the previous version compared
to this new version? What changed?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Alvaro Herrera (#15)
1 attachment(s)

There were no support for wrapping and old-ascii line style in expanded
mode at all.
But now they are.

2014-04-11 21:58 GMT+04:00 Alvaro Herrera <alvherre@2ndquadrant.com>:

Sergey Muraviov wrote:

I hope that I realized old-ascii logic correctly.

I don't know what you changed here, but I don't think we need to
preserve old-ascii behavior in the new code, in any way. If you're
mimicking something obsolete and the end result of the new feature is
not great, perhaps that should be rethought.

Can you please provide sample output for the previous version compared
to this new version? What changed?

--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Best regards,
Sergey Muraviov

Attachments:

output.txttext/plain; charset=UTF-8; name=output.txtDownload
#17Greg Stark
stark@mit.edu
In reply to: Alvaro Herrera (#15)

Yeah, I think I agree. I'm pretty happy to commit it without old-ascii
doing anything special.

It looks to me like old-ascii just isn't very useful for a single column
output (like expanded mode is implicitly). Maybe that needs to be fixed but
then it needs to be fixed for non expanded mode as well.

I don't think this new output is very useful dive it just displays the
old-ascii info for the header cells. The header cells never wrap and often
have a lot of empty lines so it just looks like noise.

I do think the earlier change today was important. It looks great now with
the wrap and newline indicators in ascii and Unicode mode.

Fwiw I've switched my .psqlrc to use Unicode and wrapped=auto be default.
It makes psql way more usable. It's even better than my old technique of
running it in Emacs and scrolling left and right.

I'll take a look at it this evening and will add regression tests (and
probably more comments too!) and commit. I want to try adding Unicode
regression tests but I'm not sure what the state of the art is for Unicode
fallback behaviour on the build farm. I think there are some existing tests
we can copy iirc.

--
greg

#18Greg Stark
stark@mit.edu
In reply to: Greg Stark (#17)
1 attachment(s)

On Fri, Apr 11, 2014 at 9:47 PM, Greg Stark <stark@mit.edu> wrote:

I'll take a look at it this evening and will add regression tests (and
probably more comments too!) and commit.

Well that evening turned into this morning a week later. Thanks to
Emre who fixed the remaining problems.

I added a regression test that tests every combination of linestyle
and border and format. That makes it kind of long but it's fast to run
and this code is easy to break so I would prefer to have tests for the
next time someone tries to fix something in it.

I expect this regression test to fail on platforms that don't support
utf-8 client-side (I'm assuming we such things?). I don't have such a
platform here and I'm not sure how it would fail so I want to go ahead
and apply it and grab the output to add the alternate output when it
fails on the build-farm. Would that be ok?

--
greg

Attachments:

fix_psql_print_aligned_vertical_v8.patchtext/x-patch; charset=UTF-8; name=fix_psql_print_aligned_vertical_v8.patchDownload
*** a/src/bin/psql/print.c
--- b/src/bin/psql/print.c
***************
*** 1161,1166 **** print_aligned_vertical(const printTableContent *cont, FILE *fout)
--- 1161,1167 ----
  	struct lineptr *hlineptr,
  			   *dlineptr;
  	bool		is_pager = false;
+ 	int			output_columns = 0;		/* Width of interactive console */
  
  	if (cancel_pressed)
  		return;
***************
*** 1234,1250 **** print_aligned_vertical(const printTableContent *cont, FILE *fout)
  			fprintf(fout, "%s\n", cont->title);
  	}
  
  	/* print records */
  	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
  	{
  		printTextRule pos;
! 		int			line_count,
  					dcomplete,
! 					hcomplete;
  
  		if (cancel_pressed)
  			break;
  
  		if (i == 0)
  			pos = PRINT_RULE_TOP;
  		else if (!(*(ptr + 1)))
--- 1235,1302 ----
  			fprintf(fout, "%s\n", cont->title);
  	}
  
+ 	/*
+ 	 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+ 	 */
+ 	if (cont->opt->columns > 0)
+ 		output_columns = cont->opt->columns;
+ 	else if ((fout == stdout && isatty(fileno(stdout))) || is_pager)
+ 	{
+ 		if (cont->opt->env_columns > 0)
+ 			output_columns = cont->opt->env_columns;
+ #ifdef TIOCGWINSZ
+ 		else
+ 		{
+ 			struct winsize screen_size;
+ 
+ 			if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+ 				output_columns = screen_size.ws_col;
+ 		}
+ #endif
+ 	}
+ 
+ 	if (cont->opt->format == PRINT_WRAPPED)
+ 	{
+ 		/* Calculate the available width to wrap the columns to after
+ 		 * subtracting the maximum header width and separators. At a minimum
+ 		 * enough to print "[ RECORD N ]" */
+ 		unsigned int swidth;
+ 
+ 		if (opt_border == 0)
+ 			swidth = 1; /* "header data" */
+ 		else if (opt_border == 1)
+ 			swidth = 3; /* "header | data" */
+ 		else if (opt_border > 1)
+ 			swidth = 7; /* "| header | data |" */
+ 
+ 		/* If no output columns is set (pager or pipe case) then just use the
+ 		 * full display width, effectively disabling wrapping */
+ 		if (output_columns == 0)
+ 			output_columns = dwidth + swidth + hwidth;
+ 
+ 		/* Minimum expanded width is 20 to accomodate "RECORD N" */
+ 		Assert(hwidth + swidth < 20);
+ 		if (output_columns < 20 || dwidth + hwidth + swidth < 20)
+ 			dwidth = 20 - hwidth - swidth;
+ 		else if (output_columns < dwidth + swidth + hwidth)
+ 			dwidth = output_columns - hwidth - swidth;
+ 	}
+ 
  	/* print records */
  	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
  	{
  		printTextRule pos;
! 		int			dline,
! 					hline,
  					dcomplete,
! 					hcomplete,
! 					offset,
! 					chars_to_output;
  
  		if (cancel_pressed)
  			break;
  
+ 		/* TODO ??!? */
  		if (i == 0)
  			pos = PRINT_RULE_TOP;
  		else if (!(*(ptr + 1)))
***************
*** 1252,1257 **** print_aligned_vertical(const printTableContent *cont, FILE *fout)
--- 1304,1310 ----
  		else
  			pos = PRINT_RULE_MIDDLE;
  
+ 		/* Print record header (e.g. "[ RECORD N ]") above each record */
  		if (i % cont->ncolumns == 0)
  		{
  			if (!opt_tuples_only)
***************
*** 1270,1317 **** print_aligned_vertical(const printTableContent *cont, FILE *fout)
  		pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
  					 dlineptr, dheight);
  
! 		line_count = 0;
  		dcomplete = hcomplete = 0;
  		while (!dcomplete || !hcomplete)
  		{
  			if (opt_border == 2)
  				fprintf(fout, "%s ", dformat->leftvrule);
  			if (!hcomplete)
  			{
! 				fprintf(fout, "%-s%*s", hlineptr[line_count].ptr,
! 						hwidth - hlineptr[line_count].width, "");
  
! 				if (!hlineptr[line_count + 1].ptr)
  					hcomplete = 1;
  			}
  			else
! 				fprintf(fout, "%*s", hwidth, "");
  
  			if (opt_border > 0)
! 				fprintf(fout, " %s ", dformat->midvrule);
! 			else
! 				fputc(' ', fout);
  
  			if (!dcomplete)
  			{
! 				if (opt_border < 2)
! 					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
! 				else
! 					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
! 							dwidth - dlineptr[line_count].width, "",
! 							dformat->rightvrule);
  
! 				if (!dlineptr[line_count + 1].ptr)
  					dcomplete = 1;
  			}
  			else
  			{
  				if (opt_border < 2)
! 					fputc('\n', fout);
  				else
! 					fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
  			}
- 			line_count++;
  		}
  	}
  
--- 1323,1428 ----
  		pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
  					 dlineptr, dheight);
  
! 		/* Loop through header and data in parallel dealing with newlines and
! 		 * wrapped lines until they're both exhausted */
! 		dline = hline = 0;
  		dcomplete = hcomplete = 0;
+ 		offset = 0;
+ 		chars_to_output = dlineptr[dline].width;
  		while (!dcomplete || !hcomplete)
  		{
+ 			/* Left border */
  			if (opt_border == 2)
  				fprintf(fout, "%s ", dformat->leftvrule);
+ 
+ 			/* Header (never wrapped so just need to deal with newlines) */
  			if (!hcomplete)
  			{
! 				int twidth = fprintf(fout, "%-s", hlineptr[hline].ptr);
! 				int swidth = hwidth - twidth;
! 				if (swidth > 0) /* spacer */
! 					fprintf(fout, "%*s", swidth, "");
  
! 				if (hlineptr[hline + 1].ptr)
! 				{
! 					/* More lines after this one due to a newline */
! 					fputs(format->nl_right, fout);
! 					hline++;
! 				} 
! 				else 
! 				{
! 					/* This was the last line of the header */
! 					fputs(" ", fout);
  					hcomplete = 1;
+ 				}
  			}
  			else
! 			{
! 				/* Header exhausted but more data for column */
! 				fprintf(fout, "%*s", hwidth + 1, "");
! 			}
  
+ 			/* Separator */
  			if (opt_border > 0)
! 				fprintf(fout, "%s", dformat->midvrule);
  
+ 			/* Data */
  			if (!dcomplete)
  			{
! 				int target_width,
! 					bytes_to_output,
! 					swidth;
! 
! 				fputs(!dcomplete && !offset? " ": format->wrap_left, fout);
! 
! 				target_width = dwidth;
! 				bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
! 												   &target_width, encoding);
! 				fputnbytes(fout, (char *)(dlineptr[dline].ptr + offset),
! 						   bytes_to_output);
! 
! 				chars_to_output -= target_width;
! 				offset += bytes_to_output;
  
! 				/* spacer */
! 				swidth = dwidth - target_width;
! 				if (swidth > 0)
! 					fprintf(fout, "%*s", swidth, "");
! 
! 				if (chars_to_output)
! 				{
! 					/* continuing a wrapped column */
! 					fputs(format->wrap_right, fout);
! 				}
! 				else if (dlineptr[dline + 1].ptr)
! 				{
! 					/* reached a newline in the column */
! 					fputs(format->nl_right, fout);
! 					dline++;
! 					offset = 0;
! 					chars_to_output = dlineptr[dline].width;
! 				}
! 				else
! 				{
! 					/* reached the end of the cell */
! 					fputs(" ", fout);
  					dcomplete = 1;
+ 				}
+ 
+ 				if (opt_border == 2)
+ 					fputs(dformat->rightvrule, fout);
+ 
+ 				fputs("\n", fout);
  			}
  			else
  			{
+ 				/* data exhausted (this can occur if header is longer than the
+ 				 * data due to newlines in the header) */
  				if (opt_border < 2)
! 					fputs("\n", fout);
  				else
! 					fprintf(fout, "%*s  %s\n", dwidth, "", dformat->rightvrule);
  			}
  		}
  	}
  
*** a/src/test/regress/expected/psql.out
--- b/src/test/regress/expected/psql.out
***************
*** 68,70 **** Record separator (recordsep) is <newline>.
--- 68,3104 ----
  Table attributes (tableattr) unset.
  Title (title) unset.
  Tuples only (tuples_only) is off.
+ -- test multi-line headers, wrapping, and newline indicators
+ prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "a
+ 
+ b", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
+ b" from generate_series(1,10) as n(n) group by n>1 ;
+ \pset linestyle ascii
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+          a          +        a         +
+                     +        b          
+          b                              
+ -------------------- ------------------
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                +yyyyyyyyyyyyyyyy  +
+ xxxxxx              +yyyyyyyyyyyyyy    +
+ xxxxxxxx            +yyyyyyyyyyyy      +
+ xxxxxxxxxx          +yyyyyyyyyy        +
+ xxxxxxxxxxxx        +yyyyyyyy          +
+ xxxxxxxxxxxxxx      +yyyyyy            +
+ xxxxxxxxxxxxxxxx    +yyyy              +
+ xxxxxxxxxxxxxxxxxx  +yy                +
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a          +        a         +
+                     +        b          
+          b                              
+ -------------------- ------------------
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                +yyyyyyyyyyyyyyyy  +
+ xxxxxx              +yyyyyyyyyyyyyy    +
+ xxxxxxxx            +yyyyyyyyyyyy      +
+ xxxxxxxxxx          +yyyyyyyyyy        +
+ xxxxxxxxxxxx        +yyyyyyyy          +
+ xxxxxxxxxxxxxx      +yyyyyy            +
+ xxxxxxxxxxxxxxxx    +yyyy              +
+ xxxxxxxxxxxxxxxxxx  +yy                +
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+           a          +|         a         +
+                      +|         b          
+           b           |                    
+ ----------------------+--------------------
+  xx                   | yyyyyyyyyyyyyyyyyy
+  xxxx                +| yyyyyyyyyyyyyyyy  +
+  xxxxxx              +| yyyyyyyyyyyyyy    +
+  xxxxxxxx            +| yyyyyyyyyyyy      +
+  xxxxxxxxxx          +| yyyyyyyyyy        +
+  xxxxxxxxxxxx        +| yyyyyyyy          +
+  xxxxxxxxxxxxxx      +| yyyyyy            +
+  xxxxxxxxxxxxxxxx    +| yyyy              +
+  xxxxxxxxxxxxxxxxxx  +| yy                +
+  xxxxxxxxxxxxxxxxxxxx | 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a        +|         a         +
+                   +|         b          
+          b         |                    
+ -------------------+--------------------
+  xx                | yyyyyyyyyyyyyyyyyy
+  xxxx             +| yyyyyyyyyyyyyyyy  +
+  xxxxxx           +| yyyyyyyyyyyyyy    +
+  xxxxxxxx         +| yyyyyyyyyyyy      +
+  xxxxxxxxxx       +| yyyyyyyyyy        +
+  xxxxxxxxxxxx     +| yyyyyyyy          +
+  xxxxxxxxxxxxxx   +| yyyyyy            +
+  xxxxxxxxxxxxxxxx +| yyyy              +
+  xxxxxxxxxxxxxxxxx.| yy                +
+ .x                +| 
+  xxxxxxxxxxxxxxxxx.| 
+ .xxx               | 
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ +----------------------+--------------------+
+ |          a          +|         a         +|
+ |                     +|         b          |
+ |          b           |                    |
+ +----------------------+--------------------+
+ | xx                   | yyyyyyyyyyyyyyyyyy |
+ | xxxx                +| yyyyyyyyyyyyyyyy  +|
+ | xxxxxx              +| yyyyyyyyyyyyyy    +|
+ | xxxxxxxx            +| yyyyyyyyyyyy      +|
+ | xxxxxxxxxx          +| yyyyyyyyyy        +|
+ | xxxxxxxxxxxx        +| yyyyyyyy          +|
+ | xxxxxxxxxxxxxx      +| yyyyyy            +|
+ | xxxxxxxxxxxxxxxx    +| yyyy              +|
+ | xxxxxxxxxxxxxxxxxx  +| yy                +|
+ | xxxxxxxxxxxxxxxxxxxx |                    |
+ +----------------------+--------------------+
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ +-----------------+--------------------+
+ |        a       +|         a         +|
+ |                +|         b          |
+ |        b        |                    |
+ +-----------------+--------------------+
+ | xx              | yyyyyyyyyyyyyyyyyy |
+ | xxxx           +| yyyyyyyyyyyyyyyy  +|
+ | xxxxxx         +| yyyyyyyyyyyyyy    +|
+ | xxxxxxxx       +| yyyyyyyyyyyy      +|
+ | xxxxxxxxxx     +| yyyyyyyyyy        +|
+ | xxxxxxxxxxxx   +| yyyyyyyy          +|
+ | xxxxxxxxxxxxxx +| yyyyyy            +|
+ | xxxxxxxxxxxxxxx.| yyyy              +|
+ |.x              +| yy                +|
+ | xxxxxxxxxxxxxxx.|                    |
+ |.xxx            +|                    |
+ | xxxxxxxxxxxxxxx.|                    |
+ |.xxxxx           |                    |
+ +-----------------+--------------------+
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ * Record 1           
+ a+ xx                   
+  +
+ b 
+ a+ yyyyyyyyyyyyyyyyyy   
+ b 
+ * Record 2           
+ a+ xxxx                +
+  + xxxxxx              +
+ b  xxxxxxxx            +
+    xxxxxxxxxx          +
+    xxxxxxxxxxxx        +
+    xxxxxxxxxxxxxx      +
+    xxxxxxxxxxxxxxxx    +
+    xxxxxxxxxxxxxxxxxx  +
+    xxxxxxxxxxxxxxxxxxxx 
+ a+ yyyyyyyyyyyyyyyy    +
+ b  yyyyyyyyyyyyyy      +
+    yyyyyyyyyyyy        +
+    yyyyyyyyyy          +
+    yyyyyyyy            +
+    yyyyyy              +
+    yyyy                +
+    yy                  +
+                         
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a+ xx                 
+  +
+ b 
+ a+ yyyyyyyyyyyyyyyyyy 
+ b 
+ * Record 2         
+ a+ xxxx              +
+  + xxxxxx            +
+ b  xxxxxxxx          +
+    xxxxxxxxxx        +
+    xxxxxxxxxxxx      +
+    xxxxxxxxxxxxxx    +
+    xxxxxxxxxxxxxxxx  +
+    xxxxxxxxxxxxxxxxxx+
+    xxxxxxxxxxxxxxxxxx.
+   .xx                 
+ a+ yyyyyyyyyyyyyyyy  +
+ b  yyyyyyyyyyyyyy    +
+    yyyyyyyyyyyy      +
+    yyyyyyyyyy        +
+    yyyyyyyy          +
+    yyyyyy            +
+    yyyy              +
+    yy                +
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ -[ RECORD 1 ]-----------
+ a+| xx                   
+  +|
+ b |
+ a+| yyyyyyyyyyyyyyyyyy   
+ b |
+ -[ RECORD 2 ]-----------
+ a+| xxxx                +
+  +| xxxxxx              +
+ b | xxxxxxxx            +
+   | xxxxxxxxxx          +
+   | xxxxxxxxxxxx        +
+   | xxxxxxxxxxxxxx      +
+   | xxxxxxxxxxxxxxxx    +
+   | xxxxxxxxxxxxxxxxxx  +
+   | xxxxxxxxxxxxxxxxxxxx 
+ a+| yyyyyyyyyyyyyyyy    +
+ b | yyyyyyyyyyyyyy      +
+   | yyyyyyyyyyyy        +
+   | yyyyyyyyyy          +
+   | yyyyyyyy            +
+   | yyyyyy              +
+   | yyyy                +
+   | yy                  +
+   |                      
+ 
+ \pset format wrapped
+ execute q;
+ -[ RECORD 1 ]-------
+ a+| xx               
+  +|
+ b |
+ a+| yyyyyyyyyyyyyyyy.
+ b |.yy               
+ -[ RECORD 2 ]-------
+ a+| xxxx            +
+  +| xxxxxx          +
+ b | xxxxxxxx        +
+   | xxxxxxxxxx      +
+   | xxxxxxxxxxxx    +
+   | xxxxxxxxxxxxxx  +
+   | xxxxxxxxxxxxxxxx+
+   | xxxxxxxxxxxxxxxx.
+   |.xx              +
+   | xxxxxxxxxxxxxxxx.
+   |.xxxx             
+ a+| yyyyyyyyyyyyyyyy+
+ b | yyyyyyyyyyyyyy  +
+   | yyyyyyyyyyyy    +
+   | yyyyyyyyyy      +
+   | yyyyyyyy        +
+   | yyyyyy          +
+   | yyyy            +
+   | yy              +
+   |                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ +-[ RECORD 1 ]-------------+
+ | a+| xx                   |
+ |  +|                      |
+ | b |                      |
+ | a+| yyyyyyyyyyyyyyyyyy   |
+ | b |                      |
+ +-[ RECORD 2 ]-------------+
+ | a+| xxxx                +|
+ |  +| xxxxxx              +|
+ | b | xxxxxxxx            +|
+ |   | xxxxxxxxxx          +|
+ |   | xxxxxxxxxxxx        +|
+ |   | xxxxxxxxxxxxxx      +|
+ |   | xxxxxxxxxxxxxxxx    +|
+ |   | xxxxxxxxxxxxxxxxxx  +|
+ |   | xxxxxxxxxxxxxxxxxxxx |
+ | a+| yyyyyyyyyyyyyyyy    +|
+ | b | yyyyyyyyyyyyyy      +|
+ |   | yyyyyyyyyyyy        +|
+ |   | yyyyyyyyyy          +|
+ |   | yyyyyyyy            +|
+ |   | yyyyyy              +|
+ |   | yyyy                +|
+ |   | yy                  +|
+ |   |                      |
+ +---+----------------------+
+ 
+ \pset format wrapped
+ execute q;
+ +-[ RECORD 1 ]-----+
+ | a+| xx           |
+ |  +|              |
+ | b |              |
+ | a+| yyyyyyyyyyyy.|
+ | b |.yyyyyy       |
+ +-[ RECORD 2 ]-----+
+ | a+| xxxx        +|
+ |  +| xxxxxx      +|
+ | b | xxxxxxxx    +|
+ |   | xxxxxxxxxx  +|
+ |   | xxxxxxxxxxxx+|
+ |   | xxxxxxxxxxxx.|
+ |   |.xx          +|
+ |   | xxxxxxxxxxxx.|
+ |   |.xxxx        +|
+ |   | xxxxxxxxxxxx.|
+ |   |.xxxxxx      +|
+ |   | xxxxxxxxxxxx.|
+ |   |.xxxxxxxx     |
+ | a+| yyyyyyyyyyyy.|
+ | b |.yyyy        +|
+ |   | yyyyyyyyyyyy.|
+ |   |.yy          +|
+ |   | yyyyyyyyyyyy+|
+ |   | yyyyyyyyyy  +|
+ |   | yyyyyyyy    +|
+ |   | yyyyyy      +|
+ |   | yyyy        +|
+ |   | yy          +|
+ |   |              |
+ +---+--------------+
+ 
+ \pset linestyle old-ascii
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+          a                   a         
+                     +        b         
+          b          +                  
+ -------------------- ------------------
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                 yyyyyyyyyyyyyyyy   
+ xxxxxx               yyyyyyyyyyyyyy     
+ xxxxxxxx             yyyyyyyyyyyy       
+ xxxxxxxxxx           yyyyyyyyyy         
+ xxxxxxxxxxxx         yyyyyyyy           
+ xxxxxxxxxxxxxx       yyyyyy             
+ xxxxxxxxxxxxxxxx     yyyy               
+ xxxxxxxxxxxxxxxxxx   yy                 
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a                   a         
+                     +        b         
+          b          +                  
+ -------------------- ------------------
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                 yyyyyyyyyyyyyyyy   
+ xxxxxx               yyyyyyyyyyyyyy     
+ xxxxxxxx             yyyyyyyyyyyy       
+ xxxxxxxxxx           yyyyyyyyyy         
+ xxxxxxxxxxxx         yyyyyyyy           
+ xxxxxxxxxxxxxx       yyyyyy             
+ xxxxxxxxxxxxxxxx     yyyy               
+ xxxxxxxxxxxxxxxxxx   yy                 
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+           a           |         a          
+ +                     |+        b          
+ +         b           |+                   
+ ----------------------+--------------------
+  xx                   | yyyyyyyyyyyyyyyyyy
+  xxxx                 | yyyyyyyyyyyyyyyy   
+  xxxxxx               : yyyyyyyyyyyyyy     
+  xxxxxxxx             : yyyyyyyyyyyy       
+  xxxxxxxxxx           : yyyyyyyyyy         
+  xxxxxxxxxxxx         : yyyyyyyy           
+  xxxxxxxxxxxxxx       : yyyyyy             
+  xxxxxxxxxxxxxxxx     : yyyy               
+  xxxxxxxxxxxxxxxxxx   : yy                 
+  xxxxxxxxxxxxxxxxxxxx : 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a         |         a          
+ +                  |+        b          
+ +        b         |+                   
+ -------------------+--------------------
+  xx                | yyyyyyyyyyyyyyyyyy
+  xxxx              | yyyyyyyyyyyyyyyy   
+  xxxxxx            : yyyyyyyyyyyyyy     
+  xxxxxxxx          : yyyyyyyyyyyy       
+  xxxxxxxxxx        : yyyyyyyyyy         
+  xxxxxxxxxxxx      : yyyyyyyy           
+  xxxxxxxxxxxxxx    : yyyyyy             
+  xxxxxxxxxxxxxxxx  : yyyy               
+  xxxxxxxxxxxxxxxxx : yy                 
+  x                 : 
+  xxxxxxxxxxxxxxxxx   
+  xxx                 
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ +----------------------+--------------------+
+ |          a           |         a          |
+ |+                     |+        b          |
+ |+         b           |+                   |
+ +----------------------+--------------------+
+ | xx                   | yyyyyyyyyyyyyyyyyy |
+ | xxxx                 | yyyyyyyyyyyyyyyy   |
+ | xxxxxx               : yyyyyyyyyyyyyy     |
+ | xxxxxxxx             : yyyyyyyyyyyy       |
+ | xxxxxxxxxx           : yyyyyyyyyy         |
+ | xxxxxxxxxxxx         : yyyyyyyy           |
+ | xxxxxxxxxxxxxx       : yyyyyy             |
+ | xxxxxxxxxxxxxxxx     : yyyy               |
+ | xxxxxxxxxxxxxxxxxx   : yy                 |
+ | xxxxxxxxxxxxxxxxxxxx :                    |
+ +----------------------+--------------------+
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ +-----------------+--------------------+
+ |        a        |         a          |
+ |+                |+        b          |
+ |+       b        |+                   |
+ +-----------------+--------------------+
+ | xx              | yyyyyyyyyyyyyyyyyy |
+ | xxxx            | yyyyyyyyyyyyyyyy   |
+ | xxxxxx          : yyyyyyyyyyyyyy     |
+ | xxxxxxxx        : yyyyyyyyyyyy       |
+ | xxxxxxxxxx      : yyyyyyyyyy         |
+ | xxxxxxxxxxxx    : yyyyyyyy           |
+ | xxxxxxxxxxxxxx  : yyyyyy             |
+ | xxxxxxxxxxxxxxx : yyyy               |
+ | x               : yy                 |
+ | xxxxxxxxxxxxxxx :                    |
+ | xxx                                  |
+ | xxxxxxxxxxxxxxx                      |
+ | xxxxx                                |
+ +-----------------+--------------------+
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ * Record 1           
+ a  xx                   
+   
+ b 
+ a  yyyyyyyyyyyyyyyyyy   
+ b 
+ * Record 2           
+ a  xxxx                 
+    xxxxxx               
+ b  xxxxxxxx             
+    xxxxxxxxxx           
+    xxxxxxxxxxxx         
+    xxxxxxxxxxxxxx       
+    xxxxxxxxxxxxxxxx     
+    xxxxxxxxxxxxxxxxxx   
+    xxxxxxxxxxxxxxxxxxxx 
+ a  yyyyyyyyyyyyyyyy     
+ b  yyyyyyyyyyyyyy       
+    yyyyyyyyyyyy         
+    yyyyyyyyyy           
+    yyyyyyyy             
+    yyyyyy               
+    yyyy                 
+    yy                   
+                         
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a  xx                 
+   
+ b 
+ a  yyyyyyyyyyyyyyyyyy 
+ b 
+ * Record 2         
+ a  xxxx               
+    xxxxxx             
+ b  xxxxxxxx           
+    xxxxxxxxxx         
+    xxxxxxxxxxxx       
+    xxxxxxxxxxxxxx     
+    xxxxxxxxxxxxxxxx   
+    xxxxxxxxxxxxxxxxxx 
+    xxxxxxxxxxxxxxxxxx 
+    xx                 
+ a  yyyyyyyyyyyyyyyy   
+ b  yyyyyyyyyyyyyy     
+    yyyyyyyyyyyy       
+    yyyyyyyyyy         
+    yyyyyyyy           
+    yyyyyy             
+    yyyy               
+    yy                 
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ -[ RECORD 1 ]-----------
+ a | xx                   
+   |
+ b |
+ a | yyyyyyyyyyyyyyyyyy   
+ b |
+ -[ RECORD 2 ]-----------
+ a | xxxx                 
+   | xxxxxx               
+ b | xxxxxxxx             
+   | xxxxxxxxxx           
+   | xxxxxxxxxxxx         
+   | xxxxxxxxxxxxxx       
+   | xxxxxxxxxxxxxxxx     
+   | xxxxxxxxxxxxxxxxxx   
+   | xxxxxxxxxxxxxxxxxxxx 
+ a | yyyyyyyyyyyyyyyy     
+ b | yyyyyyyyyyyyyy       
+   | yyyyyyyyyyyy         
+   | yyyyyyyyyy           
+   | yyyyyyyy             
+   | yyyyyy               
+   | yyyy                 
+   | yy                   
+   |                      
+ 
+ \pset format wrapped
+ execute q;
+ -[ RECORD 1 ]-------
+ a | xx               
+   |
+ b |
+ a | yyyyyyyyyyyyyyyy 
+ b | yy               
+ -[ RECORD 2 ]-------
+ a | xxxx             
+   | xxxxxx           
+ b | xxxxxxxx         
+   | xxxxxxxxxx       
+   | xxxxxxxxxxxx     
+   | xxxxxxxxxxxxxx   
+   | xxxxxxxxxxxxxxxx 
+   | xxxxxxxxxxxxxxxx 
+   | xx               
+   | xxxxxxxxxxxxxxxx 
+   | xxxx             
+ a | yyyyyyyyyyyyyyyy 
+ b | yyyyyyyyyyyyyy   
+   | yyyyyyyyyyyy     
+   | yyyyyyyyyy       
+   | yyyyyyyy         
+   | yyyyyy           
+   | yyyy             
+   | yy               
+   |                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ +-[ RECORD 1 ]-------------+
+ | a | xx                   |
+ |   |                      |
+ | b |                      |
+ | a | yyyyyyyyyyyyyyyyyy   |
+ | b |                      |
+ +-[ RECORD 2 ]-------------+
+ | a | xxxx                 |
+ |   | xxxxxx               |
+ | b | xxxxxxxx             |
+ |   | xxxxxxxxxx           |
+ |   | xxxxxxxxxxxx         |
+ |   | xxxxxxxxxxxxxx       |
+ |   | xxxxxxxxxxxxxxxx     |
+ |   | xxxxxxxxxxxxxxxxxx   |
+ |   | xxxxxxxxxxxxxxxxxxxx |
+ | a | yyyyyyyyyyyyyyyy     |
+ | b | yyyyyyyyyyyyyy       |
+ |   | yyyyyyyyyyyy         |
+ |   | yyyyyyyyyy           |
+ |   | yyyyyyyy             |
+ |   | yyyyyy               |
+ |   | yyyy                 |
+ |   | yy                   |
+ |   |                      |
+ +---+----------------------+
+ 
+ \pset format wrapped
+ execute q;
+ +-[ RECORD 1 ]-----+
+ | a | xx           |
+ |   |              |
+ | b |              |
+ | a | yyyyyyyyyyyy |
+ | b | yyyyyy       |
+ +-[ RECORD 2 ]-----+
+ | a | xxxx         |
+ |   | xxxxxx       |
+ | b | xxxxxxxx     |
+ |   | xxxxxxxxxx   |
+ |   | xxxxxxxxxxxx |
+ |   | xxxxxxxxxxxx |
+ |   | xx           |
+ |   | xxxxxxxxxxxx |
+ |   | xxxx         |
+ |   | xxxxxxxxxxxx |
+ |   | xxxxxx       |
+ |   | xxxxxxxxxxxx |
+ |   | xxxxxxxx     |
+ | a | yyyyyyyyyyyy |
+ | b | yyyy         |
+ |   | yyyyyyyyyyyy |
+ |   | yy           |
+ |   | yyyyyyyyyyyy |
+ |   | yyyyyyyyyy   |
+ |   | yyyyyyyy     |
+ |   | yyyyyy       |
+ |   | yyyy         |
+ |   | yy           |
+ |   |              |
+ +---+--------------+
+ 
+ \pset linestyle unicode
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+          a          ↵        a         ↵
+                     ↵        b          
+          b                              
+ ──────────────────── ──────────────────
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                ↵yyyyyyyyyyyyyyyy  ↵
+ xxxxxx              ↵yyyyyyyyyyyyyy    ↵
+ xxxxxxxx            ↵yyyyyyyyyyyy      ↵
+ xxxxxxxxxx          ↵yyyyyyyyyy        ↵
+ xxxxxxxxxxxx        ↵yyyyyyyy          ↵
+ xxxxxxxxxxxxxx      ↵yyyyyy            ↵
+ xxxxxxxxxxxxxxxx    ↵yyyy              ↵
+ xxxxxxxxxxxxxxxxxx  ↵yy                ↵
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a          ↵        a         ↵
+                     ↵        b          
+          b                              
+ ──────────────────── ──────────────────
+ xx                   yyyyyyyyyyyyyyyyyy
+ xxxx                ↵yyyyyyyyyyyyyyyy  ↵
+ xxxxxx              ↵yyyyyyyyyyyyyy    ↵
+ xxxxxxxx            ↵yyyyyyyyyyyy      ↵
+ xxxxxxxxxx          ↵yyyyyyyyyy        ↵
+ xxxxxxxxxxxx        ↵yyyyyyyy          ↵
+ xxxxxxxxxxxxxx      ↵yyyyyy            ↵
+ xxxxxxxxxxxxxxxx    ↵yyyy              ↵
+ xxxxxxxxxxxxxxxxxx  ↵yy                ↵
+ xxxxxxxxxxxxxxxxxxxx 
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+           a          ↵│         a         ↵
+                      ↵│         b          
+           b           │                    
+ ──────────────────────┼────────────────────
+  xx                   │ yyyyyyyyyyyyyyyyyy
+  xxxx                ↵│ yyyyyyyyyyyyyyyy  ↵
+  xxxxxx              ↵│ yyyyyyyyyyyyyy    ↵
+  xxxxxxxx            ↵│ yyyyyyyyyyyy      ↵
+  xxxxxxxxxx          ↵│ yyyyyyyyyy        ↵
+  xxxxxxxxxxxx        ↵│ yyyyyyyy          ↵
+  xxxxxxxxxxxxxx      ↵│ yyyyyy            ↵
+  xxxxxxxxxxxxxxxx    ↵│ yyyy              ↵
+  xxxxxxxxxxxxxxxxxx  ↵│ yy                ↵
+  xxxxxxxxxxxxxxxxxxxx │ 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+          a        ↵│         a         ↵
+                   ↵│         b          
+          b         │                    
+ ───────────────────┼────────────────────
+  xx                │ yyyyyyyyyyyyyyyyyy
+  xxxx             ↵│ yyyyyyyyyyyyyyyy  ↵
+  xxxxxx           ↵│ yyyyyyyyyyyyyy    ↵
+  xxxxxxxx         ↵│ yyyyyyyyyyyy      ↵
+  xxxxxxxxxx       ↵│ yyyyyyyyyy        ↵
+  xxxxxxxxxxxx     ↵│ yyyyyyyy          ↵
+  xxxxxxxxxxxxxx   ↵│ yyyyyy            ↵
+  xxxxxxxxxxxxxxxx ↵│ yyyy              ↵
+  xxxxxxxxxxxxxxxxx…│ yy                ↵
+ …x                ↵│ 
+  xxxxxxxxxxxxxxxxx…│ 
+ …xxx               │ 
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ xx|yyyyyyyyyyyyyyyyyy
+ xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ ┌──────────────────────┬────────────────────┐
+ │          a          ↵│         a         ↵│
+ │                     ↵│         b          │
+ │          b           │                    │
+ ├──────────────────────┼────────────────────┤
+ │ xx                   │ yyyyyyyyyyyyyyyyyy │
+ │ xxxx                ↵│ yyyyyyyyyyyyyyyy  ↵│
+ │ xxxxxx              ↵│ yyyyyyyyyyyyyy    ↵│
+ │ xxxxxxxx            ↵│ yyyyyyyyyyyy      ↵│
+ │ xxxxxxxxxx          ↵│ yyyyyyyyyy        ↵│
+ │ xxxxxxxxxxxx        ↵│ yyyyyyyy          ↵│
+ │ xxxxxxxxxxxxxx      ↵│ yyyyyy            ↵│
+ │ xxxxxxxxxxxxxxxx    ↵│ yyyy              ↵│
+ │ xxxxxxxxxxxxxxxxxx  ↵│ yy                ↵│
+ │ xxxxxxxxxxxxxxxxxxxx │                    │
+ └──────────────────────┴────────────────────┘
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ ┌─────────────────┬────────────────────┐
+ │        a       ↵│         a         ↵│
+ │                ↵│         b          │
+ │        b        │                    │
+ ├─────────────────┼────────────────────┤
+ │ xx              │ yyyyyyyyyyyyyyyyyy │
+ │ xxxx           ↵│ yyyyyyyyyyyyyyyy  ↵│
+ │ xxxxxx         ↵│ yyyyyyyyyyyyyy    ↵│
+ │ xxxxxxxx       ↵│ yyyyyyyyyyyy      ↵│
+ │ xxxxxxxxxx     ↵│ yyyyyyyyyy        ↵│
+ │ xxxxxxxxxxxx   ↵│ yyyyyyyy          ↵│
+ │ xxxxxxxxxxxxxx ↵│ yyyyyy            ↵│
+ │ xxxxxxxxxxxxxxx…│ yyyy              ↵│
+ │…x              ↵│ yy                ↵│
+ │ xxxxxxxxxxxxxxx…│                    │
+ │…xxx            ↵│                    │
+ │ xxxxxxxxxxxxxxx…│                    │
+ │…xxxxx           │                    │
+ └─────────────────┴────────────────────┘
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ * Record 1           
+ a↵ xx                   
+  ↵
+ b 
+ a↵ yyyyyyyyyyyyyyyyyy   
+ b 
+ * Record 2           
+ a↵ xxxx                ↵
+  ↵ xxxxxx              ↵
+ b  xxxxxxxx            ↵
+    xxxxxxxxxx          ↵
+    xxxxxxxxxxxx        ↵
+    xxxxxxxxxxxxxx      ↵
+    xxxxxxxxxxxxxxxx    ↵
+    xxxxxxxxxxxxxxxxxx  ↵
+    xxxxxxxxxxxxxxxxxxxx 
+ a↵ yyyyyyyyyyyyyyyy    ↵
+ b  yyyyyyyyyyyyyy      ↵
+    yyyyyyyyyyyy        ↵
+    yyyyyyyyyy          ↵
+    yyyyyyyy            ↵
+    yyyyyy              ↵
+    yyyy                ↵
+    yy                  ↵
+                         
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a↵ xx                 
+  ↵
+ b 
+ a↵ yyyyyyyyyyyyyyyyyy 
+ b 
+ * Record 2         
+ a↵ xxxx              ↵
+  ↵ xxxxxx            ↵
+ b  xxxxxxxx          ↵
+    xxxxxxxxxx        ↵
+    xxxxxxxxxxxx      ↵
+    xxxxxxxxxxxxxx    ↵
+    xxxxxxxxxxxxxxxx  ↵
+    xxxxxxxxxxxxxxxxxx↵
+    xxxxxxxxxxxxxxxxxx…
+   …xx                 
+ a↵ yyyyyyyyyyyyyyyy  ↵
+ b  yyyyyyyyyyyyyy    ↵
+    yyyyyyyyyyyy      ↵
+    yyyyyyyyyy        ↵
+    yyyyyyyy          ↵
+    yyyyyy            ↵
+    yyyy              ↵
+    yy                ↵
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ ─[ RECORD 1 ]───────────
+ a↵│ xx                   
+  ↵│
+ b │
+ a↵│ yyyyyyyyyyyyyyyyyy   
+ b │
+ ─[ RECORD 2 ]───────────
+ a↵│ xxxx                ↵
+  ↵│ xxxxxx              ↵
+ b │ xxxxxxxx            ↵
+   │ xxxxxxxxxx          ↵
+   │ xxxxxxxxxxxx        ↵
+   │ xxxxxxxxxxxxxx      ↵
+   │ xxxxxxxxxxxxxxxx    ↵
+   │ xxxxxxxxxxxxxxxxxx  ↵
+   │ xxxxxxxxxxxxxxxxxxxx 
+ a↵│ yyyyyyyyyyyyyyyy    ↵
+ b │ yyyyyyyyyyyyyy      ↵
+   │ yyyyyyyyyyyy        ↵
+   │ yyyyyyyyyy          ↵
+   │ yyyyyyyy            ↵
+   │ yyyyyy              ↵
+   │ yyyy                ↵
+   │ yy                  ↵
+   │                      
+ 
+ \pset format wrapped
+ execute q;
+ ─[ RECORD 1 ]───────
+ a↵│ xx               
+  ↵│
+ b │
+ a↵│ yyyyyyyyyyyyyyyy…
+ b │…yy               
+ ─[ RECORD 2 ]───────
+ a↵│ xxxx            ↵
+  ↵│ xxxxxx          ↵
+ b │ xxxxxxxx        ↵
+   │ xxxxxxxxxx      ↵
+   │ xxxxxxxxxxxx    ↵
+   │ xxxxxxxxxxxxxx  ↵
+   │ xxxxxxxxxxxxxxxx↵
+   │ xxxxxxxxxxxxxxxx…
+   │…xx              ↵
+   │ xxxxxxxxxxxxxxxx…
+   │…xxxx             
+ a↵│ yyyyyyyyyyyyyyyy↵
+ b │ yyyyyyyyyyyyyy  ↵
+   │ yyyyyyyyyyyy    ↵
+   │ yyyyyyyyyy      ↵
+   │ yyyyyyyy        ↵
+   │ yyyyyy          ↵
+   │ yyyy            ↵
+   │ yy              ↵
+   │                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|xx
+ a
+ b|yyyyyyyyyyyyyyyyyy
+ 
+ a
+ 
+ b|xxxx
+ xxxxxx
+ xxxxxxxx
+ xxxxxxxxxx
+ xxxxxxxxxxxx
+ xxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxx
+ a
+ b|yyyyyyyyyyyyyyyy
+ yyyyyyyyyyyyyy
+ yyyyyyyyyyyy
+ yyyyyyyyyy
+ yyyyyyyy
+ yyyyyy
+ yyyy
+ yy
+ 
+ \pset format aligned
+ execute q;
+ ┌─[ RECORD 1 ]─────────────┐
+ │ a↵│ xx                   │
+ │  ↵│                      │
+ │ b │                      │
+ │ a↵│ yyyyyyyyyyyyyyyyyy   │
+ │ b │                      │
+ ├─[ RECORD 2 ]─────────────┤
+ │ a↵│ xxxx                ↵│
+ │  ↵│ xxxxxx              ↵│
+ │ b │ xxxxxxxx            ↵│
+ │   │ xxxxxxxxxx          ↵│
+ │   │ xxxxxxxxxxxx        ↵│
+ │   │ xxxxxxxxxxxxxx      ↵│
+ │   │ xxxxxxxxxxxxxxxx    ↵│
+ │   │ xxxxxxxxxxxxxxxxxx  ↵│
+ │   │ xxxxxxxxxxxxxxxxxxxx │
+ │ a↵│ yyyyyyyyyyyyyyyy    ↵│
+ │ b │ yyyyyyyyyyyyyy      ↵│
+ │   │ yyyyyyyyyyyy        ↵│
+ │   │ yyyyyyyyyy          ↵│
+ │   │ yyyyyyyy            ↵│
+ │   │ yyyyyy              ↵│
+ │   │ yyyy                ↵│
+ │   │ yy                  ↵│
+ │   │                      │
+ └───┴──────────────────────┘
+ 
+ \pset format wrapped
+ execute q;
+ ┌─[ RECORD 1 ]─────┐
+ │ a↵│ xx           │
+ │  ↵│              │
+ │ b │              │
+ │ a↵│ yyyyyyyyyyyy…│
+ │ b │…yyyyyy       │
+ ├─[ RECORD 2 ]─────┤
+ │ a↵│ xxxx        ↵│
+ │  ↵│ xxxxxx      ↵│
+ │ b │ xxxxxxxx    ↵│
+ │   │ xxxxxxxxxx  ↵│
+ │   │ xxxxxxxxxxxx↵│
+ │   │ xxxxxxxxxxxx…│
+ │   │…xx          ↵│
+ │   │ xxxxxxxxxxxx…│
+ │   │…xxxx        ↵│
+ │   │ xxxxxxxxxxxx…│
+ │   │…xxxxxx      ↵│
+ │   │ xxxxxxxxxxxx…│
+ │   │…xxxxxxxx     │
+ │ a↵│ yyyyyyyyyyyy…│
+ │ b │…yyyy        ↵│
+ │   │ yyyyyyyyyyyy…│
+ │   │…yy          ↵│
+ │   │ yyyyyyyyyyyy↵│
+ │   │ yyyyyyyyyy  ↵│
+ │   │ yyyyyyyy    ↵│
+ │   │ yyyyyy      ↵│
+ │   │ yyyy        ↵│
+ │   │ yy          ↵│
+ │   │              │
+ └───┴──────────────┘
+ 
+ deallocate q;
+ -- Do it all over again with a utf character
+ \encoding unicode
+ prepare q as select array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),2*n)),E'\n') as "a
+ 
+ b", array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),20-2*n)),E'\n') as "a
+ b" from generate_series(1,10) as n(n) group by n>1 ;
+ \pset linestyle ascii
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                    a                    +                 a                  +
+                                         +                 b                   
+                    b                                                          
+ ---------------------------------------- ------------------------------------
+ XX                                     XXXXXXXXXXXXXXXXXX
+ XXXX                                +XXXXXXXXXXXXXXXX    +
+ XXXXXX                            +XXXXXXXXXXXXXX        +
+ XXXXXXXX                        +XXXXXXXXXXXX            +
+ XXXXXXXXXX                    +XXXXXXXXXX                +
+ XXXXXXXXXXXX                +XXXXXXXX                    +
+ XXXXXXXXXXXXXX            +XXXXXX                        +
+ XXXXXXXXXXXXXXXX        +XXXX                            +
+ XXXXXXXXXXXXXXXXXX    +XX                                +
+ XXXXXXXXXXXXXXXXXXXX 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+       a       +           a            +
+               +           b             
+       b                                 
+ -------------- ------------------------
+ XX           XXXXXXXXXXXX.
+                XXXXXX
+ XXXX      +XXXXXXXXXXXX.
+ XXXXXX  +XXXX                +
+ XXXXXXX.XXXXXXXXXXXX.
+ X            +XX                    +
+ XXXXXXX.XXXXXXXXXXXX+
+ XXX        +XXXXXXXXXX    +
+ XXXXXXX.XXXXXXXX        +
+ XXXXX    +XXXXXX            +
+ XXXXXXX.XXXX                +
+ XXXXXXX+XX                    +
+ XXXXXXX.
+ XXXXXXX.
+ XX          +
+ XXXXXXX.
+ XXXXXXX.
+ XXXX      +
+ XXXXXXX.
+ XXXXXXX.
+ XXXXXX   
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                     a                    +|                  a                  +
+                                          +|                  b                   
+                     b                     |                                      
+ ------------------------------------------+--------------------------------------
+  XX                                     | XXXXXXXXXXXXXXXXXX
+  XXXX                                +| XXXXXXXXXXXXXXXX    +
+  XXXXXX                            +| XXXXXXXXXXXXXX        +
+  XXXXXXXX                        +| XXXXXXXXXXXX            +
+  XXXXXXXXXX                    +| XXXXXXXXXX                +
+  XXXXXXXXXXXX                +| XXXXXXXX                    +
+  XXXXXXXXXXXXXX            +| XXXXXX                        +
+  XXXXXXXXXXXXXXXX        +| XXXX                            +
+  XXXXXXXXXXXXXXXXXX    +| XX                                +
+  XXXXXXXXXXXXXXXXXXXX | 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+        a      +|           a           +
+               +|           b            
+        b       |                        
+ ---------------+------------------------
+  XX          | XXXXXXXXXXX.
+                |.XXXXXXX
+  XXXX     +| XXXXXXXXXXX.
+  XXXXXX +|.XXXXX            +
+  XXXXXX .| XXXXXXXXXXX.
+ .XX         +|.XXX                +
+  XXXXXX .| XXXXXXXXXXX.
+ .XXXX     +|.X                    +
+  XXXXXX .| XXXXXXXXXX  +
+ .XXXXXX +| XXXXXXXX      +
+  XXXXXX .| XXXXXX          +
+ .XXXXXX .| XXXX              +
+ .XX         +| XX                  +
+  XXXXXX .| 
+ .XXXXXX .| 
+ .XXXX     +| 
+  XXXXXX .| 
+ .XXXXXX .| 
+ .XXXXXX +| 
+  XXXXXX .| 
+ .XXXXXX .| 
+ .XXXXXX .| 
+ .XX          | 
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ +------------------------------------------+--------------------------------------+
+ |                    a                    +|                  a                  +|
+ |                                         +|                  b                   |
+ |                    b                     |                                      |
+ +------------------------------------------+--------------------------------------+
+ | XX                                     | XXXXXXXXXXXXXXXXXX |
+ | XXXX                                +| XXXXXXXXXXXXXXXX    +|
+ | XXXXXX                            +| XXXXXXXXXXXXXX        +|
+ | XXXXXXXX                        +| XXXXXXXXXXXX            +|
+ | XXXXXXXXXX                    +| XXXXXXXXXX                +|
+ | XXXXXXXXXXXX                +| XXXXXXXX                    +|
+ | XXXXXXXXXXXXXX            +| XXXXXX                        +|
+ | XXXXXXXXXXXXXXXX        +| XXXX                            +|
+ | XXXXXXXXXXXXXXXXXX    +| XX                                +|
+ | XXXXXXXXXXXXXXXXXXXX |                                      |
+ +------------------------------------------+--------------------------------------+
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ +--------------+-----------------------+
+ |      a      +|           a          +|
+ |             +|           b           |
+ |      b       |                       |
+ +--------------+-----------------------+
+ | XX         | XXXXXXXXXX .|
+ |              |.XXXXXXXX      |
+ | XXXX    +| XXXXXXXXXX .|
+ | XXXXXX+|.XXXXXX         +|
+ | XXXXXX.| XXXXXXXXXX .|
+ |.XX        +|.XXXX             +|
+ | XXXXXX.| XXXXXXXXXX .|
+ |.XXXX    +|.XX                 +|
+ | XXXXXX.| XXXXXXXXXX +|
+ |.XXXXXX+| XXXXXXXX     +|
+ | XXXXXX.| XXXXXX         +|
+ |.XXXXXX.| XXXX             +|
+ |.XX        +| XX                 +|
+ | XXXXXX.|                       |
+ |.XXXXXX.|                       |
+ |.XXXX    +|                       |
+ | XXXXXX.|                       |
+ |.XXXXXX.|                       |
+ |.XXXXXX+|                       |
+ | XXXXXX.|                       |
+ |.XXXXXX.|                       |
+ |.XXXXXX.|                       |
+ |.XX         |                       |
+ +--------------+-----------------------+
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ * Record 1                               
+ a+ XX                                     
+  +
+ b 
+ a+ XXXXXXXXXXXXXXXXXX     
+ b 
+ * Record 2                               
+ a+ XXXX                                +
+  + XXXXXX                            +
+ b  XXXXXXXX                        +
+    XXXXXXXXXX                    +
+    XXXXXXXXXXXX                +
+    XXXXXXXXXXXXXX            +
+    XXXXXXXXXXXXXXXX        +
+    XXXXXXXXXXXXXXXXXX    +
+    XXXXXXXXXXXXXXXXXXXX 
+ a+ XXXXXXXXXXXXXXXX        +
+ b  XXXXXXXXXXXXXX            +
+    XXXXXXXXXXXX                +
+    XXXXXXXXXX                    +
+    XXXXXXXX                        +
+    XXXXXX                            +
+    XXXX                                +
+    XX                                    +
+                                             
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a+ XX               
+  +
+ b 
+ a+ XXXXXXXXX.
+ b .XXXXXXXXX 
+ * Record 2         
+ a+ XXXX          +
+  + XXXXXX      +
+ b  XXXXXXXX  +
+    XXXXXXXXX.
+   .X                +
+    XXXXXXXXX.
+   .XXX            +
+    XXXXXXXXX.
+   .XXXXX        +
+    XXXXXXXXX.
+   .XXXXXXX    +
+    XXXXXXXXX.
+   .XXXXXXXXX+
+    XXXXXXXXX.
+   .XXXXXXXXX.
+   .XX               
+ a+ XXXXXXXXX.
+ b .XXXXXXX    +
+    XXXXXXXXX.
+   .XXXXX        +
+    XXXXXXXXX.
+   .XXX            +
+    XXXXXXXXX.
+   .X                +
+    XXXXXXXX  +
+    XXXXXX      +
+    XXXX          +
+    XX              +
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ -[ RECORD 1 ]-------------------------------
+ a+| XX                                     
+  +|
+ b |
+ a+| XXXXXXXXXXXXXXXXXX     
+ b |
+ -[ RECORD 2 ]-------------------------------
+ a+| XXXX                                +
+  +| XXXXXX                            +
+ b | XXXXXXXX                        +
+   | XXXXXXXXXX                    +
+   | XXXXXXXXXXXX                +
+   | XXXXXXXXXXXXXX            +
+   | XXXXXXXXXXXXXXXX        +
+   | XXXXXXXXXXXXXXXXXX    +
+   | XXXXXXXXXXXXXXXXXXXX 
+ a+| XXXXXXXXXXXXXXXX        +
+ b | XXXXXXXXXXXXXX            +
+   | XXXXXXXXXXXX                +
+   | XXXXXXXXXX                    +
+   | XXXXXXXX                        +
+   | XXXXXX                            +
+   | XXXX                                +
+   | XX                                    +
+   |                                          
+ 
+ \pset format wrapped
+ execute q;
+ -[ RECORD 1 ]-------
+ a+| XX             
+  +|
+ b |
+ a+| XXXXXXXX.
+ b |.XXXXXXXX.
+   |.XX             
+ -[ RECORD 2 ]-------
+ a+| XXXX        +
+  +| XXXXXX    +
+ b | XXXXXXXX+
+   | XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX.
+   |.XXXX        +
+   | XXXXXXXX.
+   |.XXXXXX    +
+   | XXXXXXXX.
+   |.XXXXXXXX+
+   | XXXXXXXX.
+   |.XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX.
+   |.XXXXXXXX.
+   |.XXXX         
+ a+| XXXXXXXX.
+ b |.XXXXXXXX+
+   | XXXXXXXX.
+   |.XXXXXX    +
+   | XXXXXXXX.
+   |.XXXX        +
+   | XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX+
+   | XXXXXX    +
+   | XXXX        +
+   | XX            +
+   |                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ +-[ RECORD 1 ]---------------------------------+
+ | a+| XX                                     |
+ |  +|                                          |
+ | b |                                          |
+ | a+| XXXXXXXXXXXXXXXXXX     |
+ | b |                                          |
+ +-[ RECORD 2 ]---------------------------------+
+ | a+| XXXX                                +|
+ |  +| XXXXXX                            +|
+ | b | XXXXXXXX                        +|
+ |   | XXXXXXXXXX                    +|
+ |   | XXXXXXXXXXXX                +|
+ |   | XXXXXXXXXXXXXX            +|
+ |   | XXXXXXXXXXXXXXXX        +|
+ |   | XXXXXXXXXXXXXXXXXX    +|
+ |   | XXXXXXXXXXXXXXXXXXXX |
+ | a+| XXXXXXXXXXXXXXXX        +|
+ | b | XXXXXXXXXXXXXX            +|
+ |   | XXXXXXXXXXXX                +|
+ |   | XXXXXXXXXX                    +|
+ |   | XXXXXXXX                        +|
+ |   | XXXXXX                            +|
+ |   | XXXX                                +|
+ |   | XX                                    +|
+ |   |                                          |
+ +---+------------------------------------------+
+ 
+ \pset format wrapped
+ execute q;
+ +-[ RECORD 1 ]-----+
+ | a+| XX         |
+ |  +|              |
+ | b |              |
+ | a+| XXXXXX.|
+ | b |.XXXXXX.|
+ |   |.XXXXXX |
+ +-[ RECORD 2 ]-----+
+ | a+| XXXX    +|
+ |  +| XXXXXX+|
+ | b | XXXXXX.|
+ |   |.XX        +|
+ |   | XXXXXX.|
+ |   |.XXXX    +|
+ |   | XXXXXX.|
+ |   |.XXXXXX+|
+ |   | XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XX        +|
+ |   | XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XXXX    +|
+ |   | XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XXXXXX+|
+ |   | XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XX         |
+ | a+| XXXXXX.|
+ | b |.XXXXXX.|
+ |   |.XXXX    +|
+ |   | XXXXXX.|
+ |   |.XXXXXX.|
+ |   |.XX        +|
+ |   | XXXXXX.|
+ |   |.XXXXXX+|
+ |   | XXXXXX.|
+ |   |.XXXX    +|
+ |   | XXXXXX.|
+ |   |.XX        +|
+ |   | XXXXXX+|
+ |   | XXXX    +|
+ |   | XX        +|
+ |   |              |
+ +---+--------------+
+ 
+ -- old-ascii has a number of disadvantages and should probably be
+ -- removed. When reading this output keep in mind that old-ascii
+ -- doesn't show wrapping on the right-most column (because it uses the
+ -- "right" border style not the "mid" border style) and that we don't
+ -- bother with old-ascii divider markings on headers since we never
+ -- wrap them anwyays so they would always show the newline marker.
+ \pset linestyle old-ascii
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                    a                                      a                  
+                                         +                 b                  
+                    b                    +                                    
+ ---------------------------------------- ------------------------------------
+ XX                                     XXXXXXXXXXXXXXXXXX
+ XXXX                                 XXXXXXXXXXXXXXXX     
+ XXXXXX                             XXXXXXXXXXXXXX         
+ XXXXXXXX                         XXXXXXXXXXXX             
+ XXXXXXXXXX                     XXXXXXXXXX                 
+ XXXXXXXXXXXX                 XXXXXXXX                     
+ XXXXXXXXXXXXXX             XXXXXX                         
+ XXXXXXXXXXXXXXXX         XXXX                             
+ XXXXXXXXXXXXXXXXXX     XX                                 
+ XXXXXXXXXXXXXXXXXXXX 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+       a                   a            
+               +           b            
+       b       +                        
+ -------------- ------------------------
+ XX           XXXXXXXXXXXX 
+                XXXXXX
+ XXXX       XXXXXXXXXXXX 
+ XXXXXX   XXXX                 
+ XXXXXXX XXXXXXXXXXXX 
+ X             XX                     
+ XXXXXXX XXXXXXXXXXXX 
+ XXX         XXXXXXXXXX     
+ XXXXXXX XXXXXXXX         
+ XXXXX     XXXXXX             
+ XXXXXXX XXXX                 
+ XXXXXXX XX                     
+ XXXXXXX 
+ XXXXXXX 
+ XX           
+ XXXXXXX 
+ XXXXXXX 
+ XXXX       
+ XXXXXXX 
+ XXXXXXX 
+ XXXXXX   
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                     a                     |                  a                   
+ +                                         |+                 b                   
+ +                   b                     |+                                     
+ ------------------------------------------+--------------------------------------
+  XX                                     | XXXXXXXXXXXXXXXXXX
+  XXXX                                 | XXXXXXXXXXXXXXXX     
+  XXXXXX                             : XXXXXXXXXXXXXX         
+  XXXXXXXX                         : XXXXXXXXXXXX             
+  XXXXXXXXXX                     : XXXXXXXXXX                 
+  XXXXXXXXXXXX                 : XXXXXXXX                     
+  XXXXXXXXXXXXXX             : XXXXXX                         
+  XXXXXXXXXXXXXXXX         : XXXX                             
+  XXXXXXXXXXXXXXXXXX     : XX                                 
+  XXXXXXXXXXXXXXXXXXXX : 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+        a       |           a            
+ +              |+          b            
+ +      b       |+                       
+ ---------------+------------------------
+  XX          | XXXXXXXXXXX 
+                ; XXXXXXX
+  XXXX      | XXXXXXXXXXX 
+  XXXXXX  ; XXXXX             
+  XXXXXX  : XXXXXXXXXXX 
+  XX          ; XXX                 
+  XXXXXX  : XXXXXXXXXXX 
+  XXXX      ; X                     
+  XXXXXX  : XXXXXXXXXX   
+  XXXXXX  : XXXXXXXX       
+  XXXXXX  : XXXXXX           
+  XXXXXX  : XXXX               
+  XX          : XX                   
+  XXXXXX  : 
+  XXXXXX    
+  XXXX        
+  XXXXXX    
+  XXXXXX    
+  XXXXXX    
+  XXXXXX    
+  XXXXXX    
+  XXXXXX    
+  XX            
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ +------------------------------------------+--------------------------------------+
+ |                    a                     |                  a                   |
+ |+                                         |+                 b                   |
+ |+                   b                     |+                                     |
+ +------------------------------------------+--------------------------------------+
+ | XX                                     | XXXXXXXXXXXXXXXXXX |
+ | XXXX                                 | XXXXXXXXXXXXXXXX     |
+ | XXXXXX                             : XXXXXXXXXXXXXX         |
+ | XXXXXXXX                         : XXXXXXXXXXXX             |
+ | XXXXXXXXXX                     : XXXXXXXXXX                 |
+ | XXXXXXXXXXXX                 : XXXXXXXX                     |
+ | XXXXXXXXXXXXXX             : XXXXXX                         |
+ | XXXXXXXXXXXXXXXX         : XXXX                             |
+ | XXXXXXXXXXXXXXXXXX     : XX                                 |
+ | XXXXXXXXXXXXXXXXXXXX :                                      |
+ +------------------------------------------+--------------------------------------+
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ +--------------+-----------------------+
+ |      a       |           a           |
+ |+             |+          b           |
+ |+     b       |+                      |
+ +--------------+-----------------------+
+ | XX         | XXXXXXXXXX  |
+ |              ; XXXXXXXX      |
+ | XXXX     | XXXXXXXXXX  |
+ | XXXXXX ; XXXXXX          |
+ | XXXXXX : XXXXXXXXXX  |
+ | XX         ; XXXX              |
+ | XXXXXX : XXXXXXXXXX  |
+ | XXXX     ; XX                  |
+ | XXXXXX : XXXXXXXXXX  |
+ | XXXXXX : XXXXXXXX      |
+ | XXXXXX : XXXXXX          |
+ | XXXXXX : XXXX              |
+ | XX         : XX                  |
+ | XXXXXX :                       |
+ | XXXXXX                         |
+ | XXXX                             |
+ | XXXXXX                         |
+ | XXXXXX                         |
+ | XXXXXX                         |
+ | XXXXXX                         |
+ | XXXXXX                         |
+ | XXXXXX                         |
+ | XX                                 |
+ +--------------+-----------------------+
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ * Record 1                               
+ a  XX                                     
+   
+ b 
+ a  XXXXXXXXXXXXXXXXXX     
+ b 
+ * Record 2                               
+ a  XXXX                                 
+    XXXXXX                             
+ b  XXXXXXXX                         
+    XXXXXXXXXX                     
+    XXXXXXXXXXXX                 
+    XXXXXXXXXXXXXX             
+    XXXXXXXXXXXXXXXX         
+    XXXXXXXXXXXXXXXXXX     
+    XXXXXXXXXXXXXXXXXXXX 
+ a  XXXXXXXXXXXXXXXX         
+ b  XXXXXXXXXXXXXX             
+    XXXXXXXXXXXX                 
+    XXXXXXXXXX                     
+    XXXXXXXX                         
+    XXXXXX                             
+    XXXX                                 
+    XX                                     
+                                             
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a  XX               
+   
+ b 
+ a  XXXXXXXXX 
+ b  XXXXXXXXX 
+ * Record 2         
+ a  XXXX           
+    XXXXXX       
+ b  XXXXXXXX   
+    XXXXXXXXX 
+    X                 
+    XXXXXXXXX 
+    XXX             
+    XXXXXXXXX 
+    XXXXX         
+    XXXXXXXXX 
+    XXXXXXX     
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XX               
+ a  XXXXXXXXX 
+ b  XXXXXXX     
+    XXXXXXXXX 
+    XXXXX         
+    XXXXXXXXX 
+    XXX             
+    XXXXXXXXX 
+    X                 
+    XXXXXXXX   
+    XXXXXX       
+    XXXX           
+    XX               
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ -[ RECORD 1 ]-------------------------------
+ a | XX                                     
+   |
+ b |
+ a | XXXXXXXXXXXXXXXXXX     
+ b |
+ -[ RECORD 2 ]-------------------------------
+ a | XXXX                                 
+   | XXXXXX                             
+ b | XXXXXXXX                         
+   | XXXXXXXXXX                     
+   | XXXXXXXXXXXX                 
+   | XXXXXXXXXXXXXX             
+   | XXXXXXXXXXXXXXXX         
+   | XXXXXXXXXXXXXXXXXX     
+   | XXXXXXXXXXXXXXXXXXXX 
+ a | XXXXXXXXXXXXXXXX         
+ b | XXXXXXXXXXXXXX             
+   | XXXXXXXXXXXX                 
+   | XXXXXXXXXX                     
+   | XXXXXXXX                         
+   | XXXXXX                             
+   | XXXX                                 
+   | XX                                     
+   |                                          
+ 
+ \pset format wrapped
+ execute q;
+ -[ RECORD 1 ]-------
+ a | XX             
+   |
+ b |
+ a | XXXXXXXX 
+ b | XXXXXXXX 
+   | XX             
+ -[ RECORD 2 ]-------
+ a | XXXX         
+   | XXXXXX     
+ b | XXXXXXXX 
+   | XXXXXXXX 
+   | XX             
+   | XXXXXXXX 
+   | XXXX         
+   | XXXXXXXX 
+   | XXXXXX     
+   | XXXXXXXX 
+   | XXXXXXXX 
+   | XXXXXXXX 
+   | XXXXXXXX 
+   | XX             
+   | XXXXXXXX 
+   | XXXXXXXX 
+   | XXXX         
+ a | XXXXXXXX 
+ b | XXXXXXXX 
+   | XXXXXXXX 
+   | XXXXXX     
+   | XXXXXXXX 
+   | XXXX         
+   | XXXXXXXX 
+   | XX             
+   | XXXXXXXX 
+   | XXXXXX     
+   | XXXX         
+   | XX             
+   |                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ +-[ RECORD 1 ]---------------------------------+
+ | a | XX                                     |
+ |   |                                          |
+ | b |                                          |
+ | a | XXXXXXXXXXXXXXXXXX     |
+ | b |                                          |
+ +-[ RECORD 2 ]---------------------------------+
+ | a | XXXX                                 |
+ |   | XXXXXX                             |
+ | b | XXXXXXXX                         |
+ |   | XXXXXXXXXX                     |
+ |   | XXXXXXXXXXXX                 |
+ |   | XXXXXXXXXXXXXX             |
+ |   | XXXXXXXXXXXXXXXX         |
+ |   | XXXXXXXXXXXXXXXXXX     |
+ |   | XXXXXXXXXXXXXXXXXXXX |
+ | a | XXXXXXXXXXXXXXXX         |
+ | b | XXXXXXXXXXXXXX             |
+ |   | XXXXXXXXXXXX                 |
+ |   | XXXXXXXXXX                     |
+ |   | XXXXXXXX                         |
+ |   | XXXXXX                             |
+ |   | XXXX                                 |
+ |   | XX                                     |
+ |   |                                          |
+ +---+------------------------------------------+
+ 
+ \pset format wrapped
+ execute q;
+ +-[ RECORD 1 ]-----+
+ | a | XX         |
+ |   |              |
+ | b |              |
+ | a | XXXXXX |
+ | b | XXXXXX |
+ |   | XXXXXX |
+ +-[ RECORD 2 ]-----+
+ | a | XXXX     |
+ |   | XXXXXX |
+ | b | XXXXXX |
+ |   | XX         |
+ |   | XXXXXX |
+ |   | XXXX     |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XX         |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXX     |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XX         |
+ | a | XXXXXX |
+ | b | XXXXXX |
+ |   | XXXX     |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XX         |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXXXX |
+ |   | XXXX     |
+ |   | XXXXXX |
+ |   | XX         |
+ |   | XXXXXX |
+ |   | XXXX     |
+ |   | XX         |
+ |   |              |
+ +---+--------------+
+ 
+ \pset linestyle unicode
+ \pset expanded off
+ \pset columns 40
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                    a                    ↵                 a                  ↵
+                                         ↵                 b                   
+                    b                                                          
+ ──────────────────────────────────────── ────────────────────────────────────
+ XX                                     XXXXXXXXXXXXXXXXXX
+ XXXX                                ↵XXXXXXXXXXXXXXXX    ↵
+ XXXXXX                            ↵XXXXXXXXXXXXXX        ↵
+ XXXXXXXX                        ↵XXXXXXXXXXXX            ↵
+ XXXXXXXXXX                    ↵XXXXXXXXXX                ↵
+ XXXXXXXXXXXX                ↵XXXXXXXX                    ↵
+ XXXXXXXXXXXXXX            ↵XXXXXX                        ↵
+ XXXXXXXXXXXXXXXX        ↵XXXX                            ↵
+ XXXXXXXXXXXXXXXXXX    ↵XX                                ↵
+ XXXXXXXXXXXXXXXXXXXX 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+       a       ↵           a            ↵
+               ↵           b             
+       b                                 
+ ────────────── ────────────────────────
+ XX           XXXXXXXXXXXX…
+                XXXXXX
+ XXXX      ↵XXXXXXXXXXXX…
+ XXXXXX  ↵XXXX                ↵
+ XXXXXXX…XXXXXXXXXXXX…
+ X            ↵XX                    ↵
+ XXXXXXX…XXXXXXXXXXXX↵
+ XXX        ↵XXXXXXXXXX    ↵
+ XXXXXXX…XXXXXXXX        ↵
+ XXXXX    ↵XXXXXX            ↵
+ XXXXXXX…XXXX                ↵
+ XXXXXXX↵XX                    ↵
+ XXXXXXX…
+ XXXXXXX…
+ XX          ↵
+ XXXXXXX…
+ XXXXXXX…
+ XXXX      ↵
+ XXXXXXX…
+ XXXXXXX…
+ XXXXXX   
+ (2 rows)
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+                     a                    ↵│                  a                  ↵
+                                          ↵│                  b                   
+                     b                     │                                      
+ ──────────────────────────────────────────┼──────────────────────────────────────
+  XX                                     │ XXXXXXXXXXXXXXXXXX
+  XXXX                                ↵│ XXXXXXXXXXXXXXXX    ↵
+  XXXXXX                            ↵│ XXXXXXXXXXXXXX        ↵
+  XXXXXXXX                        ↵│ XXXXXXXXXXXX            ↵
+  XXXXXXXXXX                    ↵│ XXXXXXXXXX                ↵
+  XXXXXXXXXXXX                ↵│ XXXXXXXX                    ↵
+  XXXXXXXXXXXXXX            ↵│ XXXXXX                        ↵
+  XXXXXXXXXXXXXXXX        ↵│ XXXX                            ↵
+  XXXXXXXXXXXXXXXXXX    ↵│ XX                                ↵
+  XXXXXXXXXXXXXXXXXXXX │ 
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+        a      ↵│           a           ↵
+               ↵│           b            
+        b       │                        
+ ───────────────┼────────────────────────
+  XX          │ XXXXXXXXXXX…
+                │…XXXXXXX
+  XXXX     ↵│ XXXXXXXXXXX…
+  XXXXXX ↵│…XXXXX            ↵
+  XXXXXX …│ XXXXXXXXXXX…
+ …XX         ↵│…XXX                ↵
+  XXXXXX …│ XXXXXXXXXXX…
+ …XXXX     ↵│…X                    ↵
+  XXXXXX …│ XXXXXXXXXX  ↵
+ …XXXXXX ↵│ XXXXXXXX      ↵
+  XXXXXX …│ XXXXXX          ↵
+ …XXXXXX …│ XXXX              ↵
+ …XX         ↵│ XX                  ↵
+  XXXXXX …│ 
+ …XXXXXX …│ 
+ …XXXX     ↵│ 
+  XXXXXX …│ 
+ …XXXXXX …│ 
+ …XXXXXX ↵│ 
+  XXXXXX …│ 
+ …XXXXXX …│ 
+ …XXXXXX …│ 
+ …XX          │ 
+ (2 rows)
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|a
+ b
+ XX|XXXXXXXXXXXXXXXXXX
+ XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ (2 rows)
+ \pset format aligned
+ execute q;
+ ┌──────────────────────────────────────────┬──────────────────────────────────────┐
+ │                    a                    ↵│                  a                  ↵│
+ │                                         ↵│                  b                   │
+ │                    b                     │                                      │
+ ├──────────────────────────────────────────┼──────────────────────────────────────┤
+ │ XX                                     │ XXXXXXXXXXXXXXXXXX │
+ │ XXXX                                ↵│ XXXXXXXXXXXXXXXX    ↵│
+ │ XXXXXX                            ↵│ XXXXXXXXXXXXXX        ↵│
+ │ XXXXXXXX                        ↵│ XXXXXXXXXXXX            ↵│
+ │ XXXXXXXXXX                    ↵│ XXXXXXXXXX                ↵│
+ │ XXXXXXXXXXXX                ↵│ XXXXXXXX                    ↵│
+ │ XXXXXXXXXXXXXX            ↵│ XXXXXX                        ↵│
+ │ XXXXXXXXXXXXXXXX        ↵│ XXXX                            ↵│
+ │ XXXXXXXXXXXXXXXXXX    ↵│ XX                                ↵│
+ │ XXXXXXXXXXXXXXXXXXXX │                                      │
+ └──────────────────────────────────────────┴──────────────────────────────────────┘
+ (2 rows)
+ 
+ \pset format wrapped
+ execute q;
+ ┌──────────────┬───────────────────────┐
+ │      a      ↵│           a          ↵│
+ │             ↵│           b           │
+ │      b       │                       │
+ ├──────────────┼───────────────────────┤
+ │ XX         │ XXXXXXXXXX …│
+ │              │…XXXXXXXX      │
+ │ XXXX    ↵│ XXXXXXXXXX …│
+ │ XXXXXX↵│…XXXXXX         ↵│
+ │ XXXXXX…│ XXXXXXXXXX …│
+ │…XX        ↵│…XXXX             ↵│
+ │ XXXXXX…│ XXXXXXXXXX …│
+ │…XXXX    ↵│…XX                 ↵│
+ │ XXXXXX…│ XXXXXXXXXX ↵│
+ │…XXXXXX↵│ XXXXXXXX     ↵│
+ │ XXXXXX…│ XXXXXX         ↵│
+ │…XXXXXX…│ XXXX             ↵│
+ │…XX        ↵│ XX                 ↵│
+ │ XXXXXX…│                       │
+ │…XXXXXX…│                       │
+ │…XXXX    ↵│                       │
+ │ XXXXXX…│                       │
+ │…XXXXXX…│                       │
+ │…XXXXXX↵│                       │
+ │ XXXXXX…│                       │
+ │…XXXXXX…│                       │
+ │…XXXXXX…│                       │
+ │…XX         │                       │
+ └──────────────┴───────────────────────┘
+ (2 rows)
+ 
+ \pset expanded on
+ \pset columns 20
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ * Record 1                               
+ a↵ XX                                     
+  ↵
+ b 
+ a↵ XXXXXXXXXXXXXXXXXX     
+ b 
+ * Record 2                               
+ a↵ XXXX                                ↵
+  ↵ XXXXXX                            ↵
+ b  XXXXXXXX                        ↵
+    XXXXXXXXXX                    ↵
+    XXXXXXXXXXXX                ↵
+    XXXXXXXXXXXXXX            ↵
+    XXXXXXXXXXXXXXXX        ↵
+    XXXXXXXXXXXXXXXXXX    ↵
+    XXXXXXXXXXXXXXXXXXXX 
+ a↵ XXXXXXXXXXXXXXXX        ↵
+ b  XXXXXXXXXXXXXX            ↵
+    XXXXXXXXXXXX                ↵
+    XXXXXXXXXX                    ↵
+    XXXXXXXX                        ↵
+    XXXXXX                            ↵
+    XXXX                                ↵
+    XX                                    ↵
+                                             
+ 
+ \pset format wrapped
+ execute q;
+ * Record 1         
+ a↵ XX               
+  ↵
+ b 
+ a↵ XXXXXXXXX…
+ b …XXXXXXXXX 
+ * Record 2         
+ a↵ XXXX          ↵
+  ↵ XXXXXX      ↵
+ b  XXXXXXXX  ↵
+    XXXXXXXXX…
+   …X                ↵
+    XXXXXXXXX…
+   …XXX            ↵
+    XXXXXXXXX…
+   …XXXXX        ↵
+    XXXXXXXXX…
+   …XXXXXXX    ↵
+    XXXXXXXXX…
+   …XXXXXXXXX↵
+    XXXXXXXXX…
+   …XXXXXXXXX…
+   …XX               
+ a↵ XXXXXXXXX…
+ b …XXXXXXX    ↵
+    XXXXXXXXX…
+   …XXXXX        ↵
+    XXXXXXXXX…
+   …XXX            ↵
+    XXXXXXXXX…
+   …X                ↵
+    XXXXXXXX  ↵
+    XXXXXX      ↵
+    XXXX          ↵
+    XX              ↵
+                       
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ ─[ RECORD 1 ]───────────────────────────────
+ a↵│ XX                                     
+  ↵│
+ b │
+ a↵│ XXXXXXXXXXXXXXXXXX     
+ b │
+ ─[ RECORD 2 ]───────────────────────────────
+ a↵│ XXXX                                ↵
+  ↵│ XXXXXX                            ↵
+ b │ XXXXXXXX                        ↵
+   │ XXXXXXXXXX                    ↵
+   │ XXXXXXXXXXXX                ↵
+   │ XXXXXXXXXXXXXX            ↵
+   │ XXXXXXXXXXXXXXXX        ↵
+   │ XXXXXXXXXXXXXXXXXX    ↵
+   │ XXXXXXXXXXXXXXXXXXXX 
+ a↵│ XXXXXXXXXXXXXXXX        ↵
+ b │ XXXXXXXXXXXXXX            ↵
+   │ XXXXXXXXXXXX                ↵
+   │ XXXXXXXXXX                    ↵
+   │ XXXXXXXX                        ↵
+   │ XXXXXX                            ↵
+   │ XXXX                                ↵
+   │ XX                                    ↵
+   │                                          
+ 
+ \pset format wrapped
+ execute q;
+ ─[ RECORD 1 ]───────
+ a↵│ XX             
+  ↵│
+ b │
+ a↵│ XXXXXXXX…
+ b │…XXXXXXXX…
+   │…XX             
+ ─[ RECORD 2 ]───────
+ a↵│ XXXX        ↵
+  ↵│ XXXXXX    ↵
+ b │ XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX…
+   │…XXXX        ↵
+   │ XXXXXXXX…
+   │…XXXXXX    ↵
+   │ XXXXXXXX…
+   │…XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX…
+   │…XXXXXXXX…
+   │…XXXX         
+ a↵│ XXXXXXXX…
+ b │…XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XXXXXX    ↵
+   │ XXXXXXXX…
+   │…XXXX        ↵
+   │ XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX↵
+   │ XXXXXX    ↵
+   │ XXXX        ↵
+   │ XX            ↵
+   │                  
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ a
+ 
+ b|XX
+ a
+ b|XXXXXXXXXXXXXXXXXX
+ 
+ a
+ 
+ b|XXXX
+ XXXXXX
+ XXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXXXXXXXX
+ a
+ b|XXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX
+ XXXXXXXXXXXX
+ XXXXXXXXXX
+ XXXXXXXX
+ XXXXXX
+ XXXX
+ XX
+ 
+ \pset format aligned
+ execute q;
+ ┌─[ RECORD 1 ]─────────────────────────────────┐
+ │ a↵│ XX                                     │
+ │  ↵│                                          │
+ │ b │                                          │
+ │ a↵│ XXXXXXXXXXXXXXXXXX     │
+ │ b │                                          │
+ ├─[ RECORD 2 ]─────────────────────────────────┤
+ │ a↵│ XXXX                                ↵│
+ │  ↵│ XXXXXX                            ↵│
+ │ b │ XXXXXXXX                        ↵│
+ │   │ XXXXXXXXXX                    ↵│
+ │   │ XXXXXXXXXXXX                ↵│
+ │   │ XXXXXXXXXXXXXX            ↵│
+ │   │ XXXXXXXXXXXXXXXX        ↵│
+ │   │ XXXXXXXXXXXXXXXXXX    ↵│
+ │   │ XXXXXXXXXXXXXXXXXXXX │
+ │ a↵│ XXXXXXXXXXXXXXXX        ↵│
+ │ b │ XXXXXXXXXXXXXX            ↵│
+ │   │ XXXXXXXXXXXX                ↵│
+ │   │ XXXXXXXXXX                    ↵│
+ │   │ XXXXXXXX                        ↵│
+ │   │ XXXXXX                            ↵│
+ │   │ XXXX                                ↵│
+ │   │ XX                                    ↵│
+ │   │                                          │
+ └───┴──────────────────────────────────────────┘
+ 
+ \pset format wrapped
+ execute q;
+ ┌─[ RECORD 1 ]─────┐
+ │ a↵│ XX         │
+ │  ↵│              │
+ │ b │              │
+ │ a↵│ XXXXXX…│
+ │ b │…XXXXXX…│
+ │   │…XXXXXX │
+ ├─[ RECORD 2 ]─────┤
+ │ a↵│ XXXX    ↵│
+ │  ↵│ XXXXXX↵│
+ │ b │ XXXXXX…│
+ │   │…XX        ↵│
+ │   │ XXXXXX…│
+ │   │…XXXX    ↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XX        ↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XXXX    ↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XXXXXX↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XX         │
+ │ a↵│ XXXXXX…│
+ │ b │…XXXXXX…│
+ │   │…XXXX    ↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX…│
+ │   │…XX        ↵│
+ │   │ XXXXXX…│
+ │   │…XXXXXX↵│
+ │   │ XXXXXX…│
+ │   │…XXXX    ↵│
+ │   │ XXXXXX…│
+ │   │…XX        ↵│
+ │   │ XXXXXX↵│
+ │   │ XXXX    ↵│
+ │   │ XX        ↵│
+ │   │              │
+ └───┴──────────────┘
+ 
+ deallocate q;
*** a/src/test/regress/sql/psql.sql
--- b/src/test/regress/sql/psql.sql
***************
*** 40,42 **** select 10 as test01, 20 as test02 from generate_series(1,0) \gset
--- 40,406 ----
  
  -- show all pset options
  \pset
+ 
+ -- test multi-line headers, wrapping, and newline indicators
+ prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "a
+ 
+ b", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
+ b" from generate_series(1,10) as n(n) group by n>1 ;
+ 
+ \pset linestyle ascii
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset linestyle old-ascii
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset linestyle unicode
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ 
+ deallocate q;
+ 
+ 
+ -- Do it all over again with a utf character
+ \encoding unicode
+ 
+ prepare q as select array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),2*n)),E'\n') as "a
+ 
+ b", array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),20-2*n)),E'\n') as "a
+ b" from generate_series(1,10) as n(n) group by n>1 ;
+ 
+ \pset linestyle ascii
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ -- old-ascii has a number of disadvantages and should probably be
+ -- removed. When reading this output keep in mind that old-ascii
+ -- doesn't show wrapping on the right-most column (because it uses the
+ -- "right" border style not the "mid" border style) and that we don't
+ -- bother with old-ascii divider markings on headers since we never
+ -- wrap them anwyays so they would always show the newline marker.
+ 
+ \pset linestyle old-ascii
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset linestyle unicode
+ 
+ \pset expanded off
+ \pset columns 40
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset expanded on
+ \pset columns 20
+ 
+ \pset border 0
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 1
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ \pset border 2
+ \pset format unaligned
+ execute q;
+ \pset format aligned
+ execute q;
+ \pset format wrapped
+ execute q;
+ 
+ 
+ deallocate q;
#19Tom Lane
tgl@sss.pgh.pa.us
In reply to: Greg Stark (#18)

Greg Stark <stark@mit.edu> writes:

I expect this regression test to fail on platforms that don't support
utf-8 client-side (I'm assuming we such things?). I don't have such a
platform here and I'm not sure how it would fail so I want to go ahead
and apply it and grab the output to add the alternate output when it
fails on the build-farm. Would that be ok?

Are you expecting to carry an alternate expected file for every possible
encoding choice? That does not seem workable to me, and even if we could
do it the cost/benefit ratio would be pretty grim. I think you should
drop the UTF8-dependent tests.

In other words: there are no encoding dependencies in the existing
standard regression tests. This feature is not the place to start adding
them, and two weeks past feature freeze is not the time to start adding
them either. We don't have time right now to shake out a whole new
set of platform dependencies in the regression tests.

If you feel these tests must be preserved someplace, you could add a
new regression test that isn't run by default, following in the
footsteps of collate.linux.utf8.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Greg Stark
stark@mit.edu
In reply to: Tom Lane (#19)

Not sure what other encodings you mean. Psql uses utf8 for the border and
the test uses utf8 to test the formatting. I was only anticipating an error
on platforms where that didn't work.

I would lean towards having it but I'm fine following your judgement,
especially given the timing.

--
greg

#21Tom Lane
tgl@sss.pgh.pa.us
In reply to: Greg Stark (#20)

Greg Stark <stark@mit.edu> writes:

Not sure what other encodings you mean. Psql uses utf8 for the border and
the test uses utf8 to test the formatting. I was only anticipating an error
on platforms where that didn't work.

Well, there are two likely misbehaviors if the regression test is being
run in some other encoding:

1. If it's a single-byte encoding, you probably won't get any bad-encoding
complaints, but the code will think the utf8 characters represent multiple
logical characters, resulting in (at least) spacing differences. It's
possible that all single-byte encodings would act the same, but I'm not
sure.

2. If it's a multi-byte encoding different from utf8, you're almost
certainly going to get badly-encoded-data complaints, at different places
depending on the particular encoding.

I don't remember how many different multibyte encodings we support,
but I'm pretty sure we'd need a separate expected file for each one.
Plus at least one for the single-byters.

The real problem is that I don't have a lot of confidence that the
buildfarm would provide us with full coverage of all the encodings
that somebody might use in the field. So we might not find out about
omissions or wrong expected-files until after we ship.

Anyway, the bottom line for me is that this test isn't worth that
much trouble. I'm okay with putting it in as a separate test file
that we don't support running in non-utf8 encodings.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Peter Eisentraut
peter_e@gmx.net
In reply to: Greg Stark (#18)

Please fix this compiler warning. I think it came from this patch.

print.c: In function ‘print_aligned_vertical’:
print.c:1354:10: error: pointer targets in passing argument 1 of ‘strlen_max_width’ differ in signedness [-Werror=pointer-sign]
encoding);
^
print.c:126:12: note: expected ‘unsigned char *’ but argument is of type ‘char *’
static int strlen_max_width(unsigned char *str, int *target_width, int encoding);
^

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Peter Eisentraut (#22)
1 attachment(s)

fixed

2014-04-29 5:52 GMT+04:00 Peter Eisentraut <peter_e@gmx.net>:

Please fix this compiler warning. I think it came from this patch.

print.c: In function ‘print_aligned_vertical’:
print.c:1354:10: error: pointer targets in passing argument 1 of
‘strlen_max_width’ differ in signedness [-Werror=pointer-sign]
encoding);
^
print.c:126:12: note: expected ‘unsigned char *’ but argument is of type
‘char *’
static int strlen_max_width(unsigned char *str, int *target_width, int
encoding);
^

--
Best regards,
Sergey Muraviov

Attachments:

fix_psql_print_aligned_vertical_v12.patchtext/x-patch; charset=UTF-8; name=fix_psql_print_aligned_vertical_v12.patchDownload
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..b2f56a3 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1161,6 +1161,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 	struct lineptr *hlineptr,
 			   *dlineptr;
 	bool		is_pager = false;
+	int			output_columns = 0;		/* Width of interactive console */
 
 	if (cancel_pressed)
 		return;
@@ -1234,24 +1235,86 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+	/*
+	 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+	 */
+	if (cont->opt->columns > 0)
+		output_columns = cont->opt->columns;
+	else if ((fout == stdout && isatty(fileno(stdout))) || is_pager)
+	{
+		if (cont->opt->env_columns > 0)
+			output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+		else
+		{
+			struct winsize screen_size;
+
+			if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+				output_columns = screen_size.ws_col;
+		}
+#endif
+	}
+
+	if (cont->opt->format == PRINT_WRAPPED)
+	{
+		/* Calculate the available width to wrap the columns to after
+		 * subtracting the maximum header width and separators. At a minimum
+		 * enough to print "[ RECORD N ]" */
+		unsigned int width, swidth;
+
+		if (opt_border == 0)
+			swidth = 1; /* "header data" */
+		else if (opt_border == 1)
+			swidth = 3; /* "header | data" */
+		else if (opt_border > 1)
+			swidth = 7; /* "| header | data |" */
+
+		/* Wrap to maximum width */
+		width = dwidth + swidth + hwidth;
+		if ((output_columns > 0) && (width > output_columns))
+		{
+			dwidth = output_columns - hwidth - swidth;
+			width = output_columns;
+		}
+
+		/* Wrap to minimum width */
+		if (!opt_tuples_only)
+		{
+			int delta = 1 + log10(cont->nrows) - width;
+			if (opt_border == 0)
+				delta += 6; /* "* RECORD " */
+			else if (opt_border == 1)
+				delta += 10; /* "-[ RECORD  ]" */
+			else if (opt_border == 2)
+				delta += 15; /* "+-[ RECORD  ]-+" */
+
+			if (delta > 0)
+				dwidth += delta;
+		}
+		else if (dwidth < 3)
+			dwidth = 3;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
 		printTextRule pos;
-		int			line_count,
+		int			dline,
+					hline,
 					dcomplete,
-					hcomplete;
+					hcomplete,
+					offset,
+					chars_to_output;
 
 		if (cancel_pressed)
 			break;
 
 		if (i == 0)
 			pos = PRINT_RULE_TOP;
-		else if (!(*(ptr + 1)))
-			pos = PRINT_RULE_BOTTOM;
 		else
 			pos = PRINT_RULE_MIDDLE;
 
+		/* Print record header (e.g. "[ RECORD N ]") above each record */
 		if (i % cont->ncolumns == 0)
 		{
 			if (!opt_tuples_only)
@@ -1270,48 +1333,119 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 		pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
 					 dlineptr, dheight);
 
-		line_count = 0;
+		/* Loop through header and data in parallel dealing with newlines and
+		 * wrapped lines until they're both exhausted */
+		dline = hline = 0;
 		dcomplete = hcomplete = 0;
+		offset = 0;
+		chars_to_output = dlineptr[dline].width;
 		while (!dcomplete || !hcomplete)
 		{
+			/* Left border */
 			if (opt_border == 2)
-				fprintf(fout, "%s ", dformat->leftvrule);
+				fprintf(fout, "%s", dformat->leftvrule);
+
+			/* Header (never wrapped so just need to deal with newlines) */
 			if (!hcomplete)
 			{
-				fprintf(fout, "%-s%*s", hlineptr[line_count].ptr,
-						hwidth - hlineptr[line_count].width, "");
+				int swidth, twidth = hwidth + 1;
+				fputs(hline? format->header_nl_left: " ", fout);
+				strlen_max_width(hlineptr[hline].ptr, &twidth, encoding);
+				fprintf(fout, "%-s", hlineptr[hline].ptr);
+
+				swidth = hwidth - twidth;
+				if (swidth > 0) /* spacer */
+					fprintf(fout, "%*s", swidth, " ");
 
-				if (!hlineptr[line_count + 1].ptr)
+				if (hlineptr[hline + 1].ptr)
+				{
+					/* More lines after this one due to a newline */
+					fputs(format->header_nl_right, fout);
+					hline++;
+				} 
+				else 
+				{
+					/* This was the last line of the header */
+					fputs(" ", fout);
 					hcomplete = 1;
+				}
 			}
 			else
-				fprintf(fout, "%*s", hwidth, "");
+			{
+				/* Header exhausted but more data for column */
+				fprintf(fout, "%*s", hwidth + 2, "");
+			}
 
+			/* Separator */
 			if (opt_border > 0)
-				fprintf(fout, " %s ", dformat->midvrule);
-			else
-				fputc(' ', fout);
+			{
+				if (offset)
+					fputs(format->midvrule_wrap, fout);
+				else if (!dline)
+					fputs(dformat->midvrule, fout);
+				else if (dline)
+					fputs(format->midvrule_nl, fout);
+				else
+					fputs(format->midvrule_blank, fout);
+			}
 
+			/* Data */
 			if (!dcomplete)
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
-				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+				int target_width,
+					bytes_to_output,
+					swidth;
+
+				fputs(!dcomplete && !offset? " ": format->wrap_left, fout);
 
-				if (!dlineptr[line_count + 1].ptr)
+				target_width = dwidth;
+				bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
+												   &target_width, encoding);
+				fputnbytes(fout, (char *)(dlineptr[dline].ptr + offset),
+						   bytes_to_output);
+
+				chars_to_output -= target_width;
+				offset += bytes_to_output;
+
+				/* spacer */
+				swidth = dwidth - target_width;
+				if (swidth > 0)
+					fprintf(fout, "%*s", swidth, "");
+
+				if (chars_to_output)
+				{
+					/* continuing a wrapped column */
+					fputs(format->wrap_right, fout);
+				}
+				else if (dlineptr[dline + 1].ptr)
+				{
+					/* reached a newline in the column */
+					fputs(format->nl_right, fout);
+					dline++;
+					offset = 0;
+					chars_to_output = dlineptr[dline].width;
+				}
+				else
+				{
+					/* reached the end of the cell */
+					fputs(" ", fout);
 					dcomplete = 1;
+				}
+
+				if (opt_border == 2)
+					fputs(dformat->rightvrule, fout);
+
+				fputs("\n", fout);
 			}
 			else
 			{
+				/* data exhausted (this can occur if header is longer than the
+				 * data due to newlines in the header) */
 				if (opt_border < 2)
-					fputc('\n', fout);
+					fputs("\n", fout);
 				else
-					fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
+					fprintf(fout, "%*s  %s\n", dwidth, "", dformat->rightvrule);
 			}
-			line_count++;
 		}
 	}
 
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
index 2bbee7d..83c2f05 100644
--- a/src/test/regress/expected/psql.out
+++ b/src/test/regress/expected/psql.out
@@ -68,3 +68,3037 @@ Record separator (recordsep) is <newline>.
 Table attributes (tableattr) unset.
 Title (title) unset.
 Tuples only (tuples_only) is off.
+-- test multi-line headers, wrapping, and newline indicators
+prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "a
+
+b", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
+b" from generate_series(1,10) as n(n) group by n>1 ;
+\pset linestyle ascii
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+         a          +        a         +
+                    +        b          
+         b                              
+-------------------- ------------------
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                +yyyyyyyyyyyyyyyy  +
+xxxxxx              +yyyyyyyyyyyyyy    +
+xxxxxxxx            +yyyyyyyyyyyy      +
+xxxxxxxxxx          +yyyyyyyyyy        +
+xxxxxxxxxxxx        +yyyyyyyy          +
+xxxxxxxxxxxxxx      +yyyyyy            +
+xxxxxxxxxxxxxxxx    +yyyy              +
+xxxxxxxxxxxxxxxxxx  +yy                +
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a          +        a         +
+                    +        b          
+         b                              
+-------------------- ------------------
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                +yyyyyyyyyyyyyyyy  +
+xxxxxx              +yyyyyyyyyyyyyy    +
+xxxxxxxx            +yyyyyyyyyyyy      +
+xxxxxxxxxx          +yyyyyyyyyy        +
+xxxxxxxxxxxx        +yyyyyyyy          +
+xxxxxxxxxxxxxx      +yyyyyy            +
+xxxxxxxxxxxxxxxx    +yyyy              +
+xxxxxxxxxxxxxxxxxx  +yy                +
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+          a          +|         a         +
+                     +|         b          
+          b           |                    
+----------------------+--------------------
+ xx                   | yyyyyyyyyyyyyyyyyy
+ xxxx                +| yyyyyyyyyyyyyyyy  +
+ xxxxxx              +| yyyyyyyyyyyyyy    +
+ xxxxxxxx            +| yyyyyyyyyyyy      +
+ xxxxxxxxxx          +| yyyyyyyyyy        +
+ xxxxxxxxxxxx        +| yyyyyyyy          +
+ xxxxxxxxxxxxxx      +| yyyyyy            +
+ xxxxxxxxxxxxxxxx    +| yyyy              +
+ xxxxxxxxxxxxxxxxxx  +| yy                +
+ xxxxxxxxxxxxxxxxxxxx | 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a        +|         a         +
+                  +|         b          
+         b         |                    
+-------------------+--------------------
+ xx                | yyyyyyyyyyyyyyyyyy
+ xxxx             +| yyyyyyyyyyyyyyyy  +
+ xxxxxx           +| yyyyyyyyyyyyyy    +
+ xxxxxxxx         +| yyyyyyyyyyyy      +
+ xxxxxxxxxx       +| yyyyyyyyyy        +
+ xxxxxxxxxxxx     +| yyyyyyyy          +
+ xxxxxxxxxxxxxx   +| yyyyyy            +
+ xxxxxxxxxxxxxxxx +| yyyy              +
+ xxxxxxxxxxxxxxxxx.| yy                +
+.x                +| 
+ xxxxxxxxxxxxxxxxx.| 
+.xxx               | 
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
++----------------------+--------------------+
+|          a          +|         a         +|
+|                     +|         b          |
+|          b           |                    |
++----------------------+--------------------+
+| xx                   | yyyyyyyyyyyyyyyyyy |
+| xxxx                +| yyyyyyyyyyyyyyyy  +|
+| xxxxxx              +| yyyyyyyyyyyyyy    +|
+| xxxxxxxx            +| yyyyyyyyyyyy      +|
+| xxxxxxxxxx          +| yyyyyyyyyy        +|
+| xxxxxxxxxxxx        +| yyyyyyyy          +|
+| xxxxxxxxxxxxxx      +| yyyyyy            +|
+| xxxxxxxxxxxxxxxx    +| yyyy              +|
+| xxxxxxxxxxxxxxxxxx  +| yy                +|
+| xxxxxxxxxxxxxxxxxxxx |                    |
++----------------------+--------------------+
+(2 rows)
+
+\pset format wrapped
+execute q;
++-----------------+--------------------+
+|        a       +|         a         +|
+|                +|         b          |
+|        b        |                    |
++-----------------+--------------------+
+| xx              | yyyyyyyyyyyyyyyyyy |
+| xxxx           +| yyyyyyyyyyyyyyyy  +|
+| xxxxxx         +| yyyyyyyyyyyyyy    +|
+| xxxxxxxx       +| yyyyyyyyyyyy      +|
+| xxxxxxxxxx     +| yyyyyyyyyy        +|
+| xxxxxxxxxxxx   +| yyyyyyyy          +|
+| xxxxxxxxxxxxxx +| yyyyyy            +|
+| xxxxxxxxxxxxxxx.| yyyy              +|
+|.x              +| yy                +|
+| xxxxxxxxxxxxxxx.|                    |
+|.xxx            +|                    |
+| xxxxxxxxxxxxxxx.|                    |
+|.xxxxx           |                    |
++-----------------+--------------------+
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+* Record 1           
+ a+ xx                   
+  +
+ b 
+ a+ yyyyyyyyyyyyyyyyyy   
+ b 
+* Record 2           
+ a+ xxxx                +
+  + xxxxxx              +
+ b  xxxxxxxx            +
+    xxxxxxxxxx          +
+    xxxxxxxxxxxx        +
+    xxxxxxxxxxxxxx      +
+    xxxxxxxxxxxxxxxx    +
+    xxxxxxxxxxxxxxxxxx  +
+    xxxxxxxxxxxxxxxxxxxx 
+ a+ yyyyyyyyyyyyyyyy    +
+ b  yyyyyyyyyyyyyy      +
+    yyyyyyyyyyyy        +
+    yyyyyyyyyy          +
+    yyyyyyyy            +
+    yyyyyy              +
+    yyyy                +
+    yy                  +
+                         
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a+ xx                 
+  +
+ b 
+ a+ yyyyyyyyyyyyyyyyyy 
+ b 
+* Record 2         
+ a+ xxxx              +
+  + xxxxxx            +
+ b  xxxxxxxx          +
+    xxxxxxxxxx        +
+    xxxxxxxxxxxx      +
+    xxxxxxxxxxxxxx    +
+    xxxxxxxxxxxxxxxx  +
+    xxxxxxxxxxxxxxxxxx+
+    xxxxxxxxxxxxxxxxxx.
+   .xx                 
+ a+ yyyyyyyyyyyyyyyy  +
+ b  yyyyyyyyyyyyyy    +
+    yyyyyyyyyyyy      +
+    yyyyyyyyyy        +
+    yyyyyyyy          +
+    yyyyyy            +
+    yyyy              +
+    yy                +
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+-[ RECORD 1 ]-----------
+ a+| xx                   
+  +|
+ b |
+ a+| yyyyyyyyyyyyyyyyyy   
+ b |
+-[ RECORD 2 ]-----------
+ a+| xxxx                +
+  +| xxxxxx              +
+ b | xxxxxxxx            +
+   | xxxxxxxxxx          +
+   | xxxxxxxxxxxx        +
+   | xxxxxxxxxxxxxx      +
+   | xxxxxxxxxxxxxxxx    +
+   | xxxxxxxxxxxxxxxxxx  +
+   | xxxxxxxxxxxxxxxxxxxx 
+ a+| yyyyyyyyyyyyyyyy    +
+ b | yyyyyyyyyyyyyy      +
+   | yyyyyyyyyyyy        +
+   | yyyyyyyyyy          +
+   | yyyyyyyy            +
+   | yyyyyy              +
+   | yyyy                +
+   | yy                  +
+   |                      
+
+\pset format wrapped
+execute q;
+-[ RECORD 1 ]-------
+ a+| xx               
+  +|
+ b |
+ a+| yyyyyyyyyyyyyyyy.
+ b |.yy               
+-[ RECORD 2 ]-------
+ a+| xxxx            +
+  +| xxxxxx          +
+ b | xxxxxxxx        +
+   | xxxxxxxxxx      +
+   | xxxxxxxxxxxx    +
+   | xxxxxxxxxxxxxx  +
+   | xxxxxxxxxxxxxxxx+
+   | xxxxxxxxxxxxxxxx.
+   |.xx              +
+   | xxxxxxxxxxxxxxxx.
+   |.xxxx             
+ a+| yyyyyyyyyyyyyyyy+
+ b | yyyyyyyyyyyyyy  +
+   | yyyyyyyyyyyy    +
+   | yyyyyyyyyy      +
+   | yyyyyyyy        +
+   | yyyyyy          +
+   | yyyy            +
+   | yy              +
+   |                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
++-[ RECORD 1 ]-------------+
+| a+| xx                   |
+|  +|                      |
+| b |                      |
+| a+| yyyyyyyyyyyyyyyyyy   |
+| b |                      |
++-[ RECORD 2 ]-------------+
+| a+| xxxx                +|
+|  +| xxxxxx              +|
+| b | xxxxxxxx            +|
+|   | xxxxxxxxxx          +|
+|   | xxxxxxxxxxxx        +|
+|   | xxxxxxxxxxxxxx      +|
+|   | xxxxxxxxxxxxxxxx    +|
+|   | xxxxxxxxxxxxxxxxxx  +|
+|   | xxxxxxxxxxxxxxxxxxxx |
+| a+| yyyyyyyyyyyyyyyy    +|
+| b | yyyyyyyyyyyyyy      +|
+|   | yyyyyyyyyyyy        +|
+|   | yyyyyyyyyy          +|
+|   | yyyyyyyy            +|
+|   | yyyyyy              +|
+|   | yyyy                +|
+|   | yy                  +|
+|   |                      |
++---+----------------------+
+
+\pset format wrapped
+execute q;
++-[ RECORD 1 ]-----+
+| a+| xx           |
+|  +|              |
+| b |              |
+| a+| yyyyyyyyyyyy.|
+| b |.yyyyyy       |
++-[ RECORD 2 ]-----+
+| a+| xxxx        +|
+|  +| xxxxxx      +|
+| b | xxxxxxxx    +|
+|   | xxxxxxxxxx  +|
+|   | xxxxxxxxxxxx+|
+|   | xxxxxxxxxxxx.|
+|   |.xx          +|
+|   | xxxxxxxxxxxx.|
+|   |.xxxx        +|
+|   | xxxxxxxxxxxx.|
+|   |.xxxxxx      +|
+|   | xxxxxxxxxxxx.|
+|   |.xxxxxxxx     |
+| a+| yyyyyyyyyyyy.|
+| b |.yyyy        +|
+|   | yyyyyyyyyyyy.|
+|   |.yy          +|
+|   | yyyyyyyyyyyy+|
+|   | yyyyyyyyyy  +|
+|   | yyyyyyyy    +|
+|   | yyyyyy      +|
+|   | yyyy        +|
+|   | yy          +|
+|   |              |
++---+--------------+
+
+\pset linestyle old-ascii
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+         a                   a         
+                    +        b         
+         b          +                  
+-------------------- ------------------
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                 yyyyyyyyyyyyyyyy   
+xxxxxx               yyyyyyyyyyyyyy     
+xxxxxxxx             yyyyyyyyyyyy       
+xxxxxxxxxx           yyyyyyyyyy         
+xxxxxxxxxxxx         yyyyyyyy           
+xxxxxxxxxxxxxx       yyyyyy             
+xxxxxxxxxxxxxxxx     yyyy               
+xxxxxxxxxxxxxxxxxx   yy                 
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a                   a         
+                    +        b         
+         b          +                  
+-------------------- ------------------
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                 yyyyyyyyyyyyyyyy   
+xxxxxx               yyyyyyyyyyyyyy     
+xxxxxxxx             yyyyyyyyyyyy       
+xxxxxxxxxx           yyyyyyyyyy         
+xxxxxxxxxxxx         yyyyyyyy           
+xxxxxxxxxxxxxx       yyyyyy             
+xxxxxxxxxxxxxxxx     yyyy               
+xxxxxxxxxxxxxxxxxx   yy                 
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+          a           |         a          
++                     |+        b          
++         b           |+                   
+----------------------+--------------------
+ xx                   | yyyyyyyyyyyyyyyyyy
+ xxxx                 | yyyyyyyyyyyyyyyy   
+ xxxxxx               : yyyyyyyyyyyyyy     
+ xxxxxxxx             : yyyyyyyyyyyy       
+ xxxxxxxxxx           : yyyyyyyyyy         
+ xxxxxxxxxxxx         : yyyyyyyy           
+ xxxxxxxxxxxxxx       : yyyyyy             
+ xxxxxxxxxxxxxxxx     : yyyy               
+ xxxxxxxxxxxxxxxxxx   : yy                 
+ xxxxxxxxxxxxxxxxxxxx : 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a         |         a          
++                  |+        b          
++        b         |+                   
+-------------------+--------------------
+ xx                | yyyyyyyyyyyyyyyyyy
+ xxxx              | yyyyyyyyyyyyyyyy   
+ xxxxxx            : yyyyyyyyyyyyyy     
+ xxxxxxxx          : yyyyyyyyyyyy       
+ xxxxxxxxxx        : yyyyyyyyyy         
+ xxxxxxxxxxxx      : yyyyyyyy           
+ xxxxxxxxxxxxxx    : yyyyyy             
+ xxxxxxxxxxxxxxxx  : yyyy               
+ xxxxxxxxxxxxxxxxx : yy                 
+ x                 : 
+ xxxxxxxxxxxxxxxxx   
+ xxx                 
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
++----------------------+--------------------+
+|          a           |         a          |
+|+                     |+        b          |
+|+         b           |+                   |
++----------------------+--------------------+
+| xx                   | yyyyyyyyyyyyyyyyyy |
+| xxxx                 | yyyyyyyyyyyyyyyy   |
+| xxxxxx               : yyyyyyyyyyyyyy     |
+| xxxxxxxx             : yyyyyyyyyyyy       |
+| xxxxxxxxxx           : yyyyyyyyyy         |
+| xxxxxxxxxxxx         : yyyyyyyy           |
+| xxxxxxxxxxxxxx       : yyyyyy             |
+| xxxxxxxxxxxxxxxx     : yyyy               |
+| xxxxxxxxxxxxxxxxxx   : yy                 |
+| xxxxxxxxxxxxxxxxxxxx :                    |
++----------------------+--------------------+
+(2 rows)
+
+\pset format wrapped
+execute q;
++-----------------+--------------------+
+|        a        |         a          |
+|+                |+        b          |
+|+       b        |+                   |
++-----------------+--------------------+
+| xx              | yyyyyyyyyyyyyyyyyy |
+| xxxx            | yyyyyyyyyyyyyyyy   |
+| xxxxxx          : yyyyyyyyyyyyyy     |
+| xxxxxxxx        : yyyyyyyyyyyy       |
+| xxxxxxxxxx      : yyyyyyyyyy         |
+| xxxxxxxxxxxx    : yyyyyyyy           |
+| xxxxxxxxxxxxxx  : yyyyyy             |
+| xxxxxxxxxxxxxxx : yyyy               |
+| x               : yy                 |
+| xxxxxxxxxxxxxxx :                    |
+| xxx                                  |
+| xxxxxxxxxxxxxxx                      |
+| xxxxx                                |
++-----------------+--------------------+
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+* Record 1           
+ a  xx                   
++  
++b 
+ a  yyyyyyyyyyyyyyyyyy   
++b 
+* Record 2           
+ a  xxxx                 
++   xxxxxx               
++b  xxxxxxxx             
+    xxxxxxxxxx           
+    xxxxxxxxxxxx         
+    xxxxxxxxxxxxxx       
+    xxxxxxxxxxxxxxxx     
+    xxxxxxxxxxxxxxxxxx   
+    xxxxxxxxxxxxxxxxxxxx 
+ a  yyyyyyyyyyyyyyyy     
++b  yyyyyyyyyyyyyy       
+    yyyyyyyyyyyy         
+    yyyyyyyyyy           
+    yyyyyyyy             
+    yyyyyy               
+    yyyy                 
+    yy                   
+                         
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a  xx                 
++  
++b 
+ a  yyyyyyyyyyyyyyyyyy 
++b 
+* Record 2         
+ a  xxxx               
++   xxxxxx             
++b  xxxxxxxx           
+    xxxxxxxxxx         
+    xxxxxxxxxxxx       
+    xxxxxxxxxxxxxx     
+    xxxxxxxxxxxxxxxx   
+    xxxxxxxxxxxxxxxxxx 
+    xxxxxxxxxxxxxxxxxx 
+    xx                 
+ a  yyyyyyyyyyyyyyyy   
++b  yyyyyyyyyyyyyy     
+    yyyyyyyyyyyy       
+    yyyyyyyyyy         
+    yyyyyyyy           
+    yyyyyy             
+    yyyy               
+    yy                 
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+-[ RECORD 1 ]-----------
+ a | xx                   
++  ;
++b ;
+ a | yyyyyyyyyyyyyyyyyy   
++b ;
+-[ RECORD 2 ]-----------
+ a | xxxx                 
++  : xxxxxx               
++b : xxxxxxxx             
+   : xxxxxxxxxx           
+   : xxxxxxxxxxxx         
+   : xxxxxxxxxxxxxx       
+   : xxxxxxxxxxxxxxxx     
+   : xxxxxxxxxxxxxxxxxx   
+   : xxxxxxxxxxxxxxxxxxxx 
+ a | yyyyyyyyyyyyyyyy     
++b : yyyyyyyyyyyyyy       
+   : yyyyyyyyyyyy         
+   : yyyyyyyyyy           
+   : yyyyyyyy             
+   : yyyyyy               
+   : yyyy                 
+   : yy                   
+   :                      
+
+\pset format wrapped
+execute q;
+-[ RECORD 1 ]-------
+ a | xx               
++  ;
++b ;
+ a | yyyyyyyyyyyyyyyy 
++b ; yy               
+-[ RECORD 2 ]-------
+ a | xxxx             
++  : xxxxxx           
++b : xxxxxxxx         
+   : xxxxxxxxxx       
+   : xxxxxxxxxxxx     
+   : xxxxxxxxxxxxxx   
+   : xxxxxxxxxxxxxxxx 
+   : xxxxxxxxxxxxxxxx 
+   ; xx               
+   : xxxxxxxxxxxxxxxx 
+   ; xxxx             
+ a | yyyyyyyyyyyyyyyy 
++b : yyyyyyyyyyyyyy   
+   : yyyyyyyyyyyy     
+   : yyyyyyyyyy       
+   : yyyyyyyy         
+   : yyyyyy           
+   : yyyy             
+   : yy               
+   :                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
++-[ RECORD 1 ]-------------+
+| a | xx                   |
+|+  ;                      |
+|+b ;                      |
+| a | yyyyyyyyyyyyyyyyyy   |
+|+b ;                      |
++-[ RECORD 2 ]-------------+
+| a | xxxx                 |
+|+  : xxxxxx               |
+|+b : xxxxxxxx             |
+|   : xxxxxxxxxx           |
+|   : xxxxxxxxxxxx         |
+|   : xxxxxxxxxxxxxx       |
+|   : xxxxxxxxxxxxxxxx     |
+|   : xxxxxxxxxxxxxxxxxx   |
+|   : xxxxxxxxxxxxxxxxxxxx |
+| a | yyyyyyyyyyyyyyyy     |
+|+b : yyyyyyyyyyyyyy       |
+|   : yyyyyyyyyyyy         |
+|   : yyyyyyyyyy           |
+|   : yyyyyyyy             |
+|   : yyyyyy               |
+|   : yyyy                 |
+|   : yy                   |
+|   :                      |
++---+----------------------+
+
+\pset format wrapped
+execute q;
++-[ RECORD 1 ]-----+
+| a | xx           |
+|+  ;              |
+|+b ;              |
+| a | yyyyyyyyyyyy |
+|+b ; yyyyyy       |
++-[ RECORD 2 ]-----+
+| a | xxxx         |
+|+  : xxxxxx       |
+|+b : xxxxxxxx     |
+|   : xxxxxxxxxx   |
+|   : xxxxxxxxxxxx |
+|   : xxxxxxxxxxxx |
+|   ; xx           |
+|   : xxxxxxxxxxxx |
+|   ; xxxx         |
+|   : xxxxxxxxxxxx |
+|   ; xxxxxx       |
+|   : xxxxxxxxxxxx |
+|   ; xxxxxxxx     |
+| a | yyyyyyyyyyyy |
+|+b ; yyyy         |
+|   : yyyyyyyyyyyy |
+|   ; yy           |
+|   : yyyyyyyyyyyy |
+|   : yyyyyyyyyy   |
+|   : yyyyyyyy     |
+|   : yyyyyy       |
+|   : yyyy         |
+|   : yy           |
+|   :              |
++---+--------------+
+
+\pset linestyle unicode
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+         a          ↵        a         ↵
+                    ↵        b          
+         b                              
+──────────────────── ──────────────────
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                ↵yyyyyyyyyyyyyyyy  ↵
+xxxxxx              ↵yyyyyyyyyyyyyy    ↵
+xxxxxxxx            ↵yyyyyyyyyyyy      ↵
+xxxxxxxxxx          ↵yyyyyyyyyy        ↵
+xxxxxxxxxxxx        ↵yyyyyyyy          ↵
+xxxxxxxxxxxxxx      ↵yyyyyy            ↵
+xxxxxxxxxxxxxxxx    ↵yyyy              ↵
+xxxxxxxxxxxxxxxxxx  ↵yy                ↵
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a          ↵        a         ↵
+                    ↵        b          
+         b                              
+──────────────────── ──────────────────
+xx                   yyyyyyyyyyyyyyyyyy
+xxxx                ↵yyyyyyyyyyyyyyyy  ↵
+xxxxxx              ↵yyyyyyyyyyyyyy    ↵
+xxxxxxxx            ↵yyyyyyyyyyyy      ↵
+xxxxxxxxxx          ↵yyyyyyyyyy        ↵
+xxxxxxxxxxxx        ↵yyyyyyyy          ↵
+xxxxxxxxxxxxxx      ↵yyyyyy            ↵
+xxxxxxxxxxxxxxxx    ↵yyyy              ↵
+xxxxxxxxxxxxxxxxxx  ↵yy                ↵
+xxxxxxxxxxxxxxxxxxxx 
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+          a          ↵│         a         ↵
+                     ↵│         b          
+          b           │                    
+──────────────────────┼────────────────────
+ xx                   │ yyyyyyyyyyyyyyyyyy
+ xxxx                ↵│ yyyyyyyyyyyyyyyy  ↵
+ xxxxxx              ↵│ yyyyyyyyyyyyyy    ↵
+ xxxxxxxx            ↵│ yyyyyyyyyyyy      ↵
+ xxxxxxxxxx          ↵│ yyyyyyyyyy        ↵
+ xxxxxxxxxxxx        ↵│ yyyyyyyy          ↵
+ xxxxxxxxxxxxxx      ↵│ yyyyyy            ↵
+ xxxxxxxxxxxxxxxx    ↵│ yyyy              ↵
+ xxxxxxxxxxxxxxxxxx  ↵│ yy                ↵
+ xxxxxxxxxxxxxxxxxxxx │ 
+(2 rows)
+
+\pset format wrapped
+execute q;
+         a        ↵│         a         ↵
+                  ↵│         b          
+         b         │                    
+───────────────────┼────────────────────
+ xx                │ yyyyyyyyyyyyyyyyyy
+ xxxx             ↵│ yyyyyyyyyyyyyyyy  ↵
+ xxxxxx           ↵│ yyyyyyyyyyyyyy    ↵
+ xxxxxxxx         ↵│ yyyyyyyyyyyy      ↵
+ xxxxxxxxxx       ↵│ yyyyyyyyyy        ↵
+ xxxxxxxxxxxx     ↵│ yyyyyyyy          ↵
+ xxxxxxxxxxxxxx   ↵│ yyyyyy            ↵
+ xxxxxxxxxxxxxxxx ↵│ yyyy              ↵
+ xxxxxxxxxxxxxxxxx…│ yy                ↵
+…x                ↵│ 
+ xxxxxxxxxxxxxxxxx…│ 
+…xxx               │ 
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+xx|yyyyyyyyyyyyyyyyyy
+xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+(2 rows)
+\pset format aligned
+execute q;
+┌──────────────────────┬────────────────────┐
+│          a          ↵│         a         ↵│
+│                     ↵│         b          │
+│          b           │                    │
+├──────────────────────┼────────────────────┤
+│ xx                   │ yyyyyyyyyyyyyyyyyy │
+│ xxxx                ↵│ yyyyyyyyyyyyyyyy  ↵│
+│ xxxxxx              ↵│ yyyyyyyyyyyyyy    ↵│
+│ xxxxxxxx            ↵│ yyyyyyyyyyyy      ↵│
+│ xxxxxxxxxx          ↵│ yyyyyyyyyy        ↵│
+│ xxxxxxxxxxxx        ↵│ yyyyyyyy          ↵│
+│ xxxxxxxxxxxxxx      ↵│ yyyyyy            ↵│
+│ xxxxxxxxxxxxxxxx    ↵│ yyyy              ↵│
+│ xxxxxxxxxxxxxxxxxx  ↵│ yy                ↵│
+│ xxxxxxxxxxxxxxxxxxxx │                    │
+└──────────────────────┴────────────────────┘
+(2 rows)
+
+\pset format wrapped
+execute q;
+┌─────────────────┬────────────────────┐
+│        a       ↵│         a         ↵│
+│                ↵│         b          │
+│        b        │                    │
+├─────────────────┼────────────────────┤
+│ xx              │ yyyyyyyyyyyyyyyyyy │
+│ xxxx           ↵│ yyyyyyyyyyyyyyyy  ↵│
+│ xxxxxx         ↵│ yyyyyyyyyyyyyy    ↵│
+│ xxxxxxxx       ↵│ yyyyyyyyyyyy      ↵│
+│ xxxxxxxxxx     ↵│ yyyyyyyyyy        ↵│
+│ xxxxxxxxxxxx   ↵│ yyyyyyyy          ↵│
+│ xxxxxxxxxxxxxx ↵│ yyyyyy            ↵│
+│ xxxxxxxxxxxxxxx…│ yyyy              ↵│
+│…x              ↵│ yy                ↵│
+│ xxxxxxxxxxxxxxx…│                    │
+│…xxx            ↵│                    │
+│ xxxxxxxxxxxxxxx…│                    │
+│…xxxxx           │                    │
+└─────────────────┴────────────────────┘
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+* Record 1           
+ a↵ xx                   
+  ↵
+ b 
+ a↵ yyyyyyyyyyyyyyyyyy   
+ b 
+* Record 2           
+ a↵ xxxx                ↵
+  ↵ xxxxxx              ↵
+ b  xxxxxxxx            ↵
+    xxxxxxxxxx          ↵
+    xxxxxxxxxxxx        ↵
+    xxxxxxxxxxxxxx      ↵
+    xxxxxxxxxxxxxxxx    ↵
+    xxxxxxxxxxxxxxxxxx  ↵
+    xxxxxxxxxxxxxxxxxxxx 
+ a↵ yyyyyyyyyyyyyyyy    ↵
+ b  yyyyyyyyyyyyyy      ↵
+    yyyyyyyyyyyy        ↵
+    yyyyyyyyyy          ↵
+    yyyyyyyy            ↵
+    yyyyyy              ↵
+    yyyy                ↵
+    yy                  ↵
+                         
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a↵ xx                 
+  ↵
+ b 
+ a↵ yyyyyyyyyyyyyyyyyy 
+ b 
+* Record 2         
+ a↵ xxxx              ↵
+  ↵ xxxxxx            ↵
+ b  xxxxxxxx          ↵
+    xxxxxxxxxx        ↵
+    xxxxxxxxxxxx      ↵
+    xxxxxxxxxxxxxx    ↵
+    xxxxxxxxxxxxxxxx  ↵
+    xxxxxxxxxxxxxxxxxx↵
+    xxxxxxxxxxxxxxxxxx…
+   …xx                 
+ a↵ yyyyyyyyyyyyyyyy  ↵
+ b  yyyyyyyyyyyyyy    ↵
+    yyyyyyyyyyyy      ↵
+    yyyyyyyyyy        ↵
+    yyyyyyyy          ↵
+    yyyyyy            ↵
+    yyyy              ↵
+    yy                ↵
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+─[ RECORD 1 ]───────────
+ a↵│ xx                   
+  ↵│
+ b │
+ a↵│ yyyyyyyyyyyyyyyyyy   
+ b │
+─[ RECORD 2 ]───────────
+ a↵│ xxxx                ↵
+  ↵│ xxxxxx              ↵
+ b │ xxxxxxxx            ↵
+   │ xxxxxxxxxx          ↵
+   │ xxxxxxxxxxxx        ↵
+   │ xxxxxxxxxxxxxx      ↵
+   │ xxxxxxxxxxxxxxxx    ↵
+   │ xxxxxxxxxxxxxxxxxx  ↵
+   │ xxxxxxxxxxxxxxxxxxxx 
+ a↵│ yyyyyyyyyyyyyyyy    ↵
+ b │ yyyyyyyyyyyyyy      ↵
+   │ yyyyyyyyyyyy        ↵
+   │ yyyyyyyyyy          ↵
+   │ yyyyyyyy            ↵
+   │ yyyyyy              ↵
+   │ yyyy                ↵
+   │ yy                  ↵
+   │                      
+
+\pset format wrapped
+execute q;
+─[ RECORD 1 ]───────
+ a↵│ xx               
+  ↵│
+ b │
+ a↵│ yyyyyyyyyyyyyyyy…
+ b │…yy               
+─[ RECORD 2 ]───────
+ a↵│ xxxx            ↵
+  ↵│ xxxxxx          ↵
+ b │ xxxxxxxx        ↵
+   │ xxxxxxxxxx      ↵
+   │ xxxxxxxxxxxx    ↵
+   │ xxxxxxxxxxxxxx  ↵
+   │ xxxxxxxxxxxxxxxx↵
+   │ xxxxxxxxxxxxxxxx…
+   │…xx              ↵
+   │ xxxxxxxxxxxxxxxx…
+   │…xxxx             
+ a↵│ yyyyyyyyyyyyyyyy↵
+ b │ yyyyyyyyyyyyyy  ↵
+   │ yyyyyyyyyyyy    ↵
+   │ yyyyyyyyyy      ↵
+   │ yyyyyyyy        ↵
+   │ yyyyyy          ↵
+   │ yyyy            ↵
+   │ yy              ↵
+   │                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|xx
+a
+b|yyyyyyyyyyyyyyyyyy
+
+a
+
+b|xxxx
+xxxxxx
+xxxxxxxx
+xxxxxxxxxx
+xxxxxxxxxxxx
+xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxx
+a
+b|yyyyyyyyyyyyyyyy
+yyyyyyyyyyyyyy
+yyyyyyyyyyyy
+yyyyyyyyyy
+yyyyyyyy
+yyyyyy
+yyyy
+yy
+
+\pset format aligned
+execute q;
+┌─[ RECORD 1 ]─────────────┐
+│ a↵│ xx                   │
+│  ↵│                      │
+│ b │                      │
+│ a↵│ yyyyyyyyyyyyyyyyyy   │
+│ b │                      │
+├─[ RECORD 2 ]─────────────┤
+│ a↵│ xxxx                ↵│
+│  ↵│ xxxxxx              ↵│
+│ b │ xxxxxxxx            ↵│
+│   │ xxxxxxxxxx          ↵│
+│   │ xxxxxxxxxxxx        ↵│
+│   │ xxxxxxxxxxxxxx      ↵│
+│   │ xxxxxxxxxxxxxxxx    ↵│
+│   │ xxxxxxxxxxxxxxxxxx  ↵│
+│   │ xxxxxxxxxxxxxxxxxxxx │
+│ a↵│ yyyyyyyyyyyyyyyy    ↵│
+│ b │ yyyyyyyyyyyyyy      ↵│
+│   │ yyyyyyyyyyyy        ↵│
+│   │ yyyyyyyyyy          ↵│
+│   │ yyyyyyyy            ↵│
+│   │ yyyyyy              ↵│
+│   │ yyyy                ↵│
+│   │ yy                  ↵│
+│   │                      │
+└───┴──────────────────────┘
+
+\pset format wrapped
+execute q;
+┌─[ RECORD 1 ]─────┐
+│ a↵│ xx           │
+│  ↵│              │
+│ b │              │
+│ a↵│ yyyyyyyyyyyy…│
+│ b │…yyyyyy       │
+├─[ RECORD 2 ]─────┤
+│ a↵│ xxxx        ↵│
+│  ↵│ xxxxxx      ↵│
+│ b │ xxxxxxxx    ↵│
+│   │ xxxxxxxxxx  ↵│
+│   │ xxxxxxxxxxxx↵│
+│   │ xxxxxxxxxxxx…│
+│   │…xx          ↵│
+│   │ xxxxxxxxxxxx…│
+│   │…xxxx        ↵│
+│   │ xxxxxxxxxxxx…│
+│   │…xxxxxx      ↵│
+│   │ xxxxxxxxxxxx…│
+│   │…xxxxxxxx     │
+│ a↵│ yyyyyyyyyyyy…│
+│ b │…yyyy        ↵│
+│   │ yyyyyyyyyyyy…│
+│   │…yy          ↵│
+│   │ yyyyyyyyyyyy↵│
+│   │ yyyyyyyyyy  ↵│
+│   │ yyyyyyyy    ↵│
+│   │ yyyyyy      ↵│
+│   │ yyyy        ↵│
+│   │ yy          ↵│
+│   │              │
+└───┴──────────────┘
+
+deallocate q;
+-- Do it all over again with a utf character
+\encoding unicode
+prepare q as select array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),2*n)),E'\n') as "a
+
+b", array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),20-2*n)),E'\n') as "a
+b" from generate_series(1,10) as n(n) group by n>1 ;
+\pset linestyle ascii
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                   a                    +                 a                  +
+                                        +                 b                   
+                   b                                                          
+---------------------------------------- ------------------------------------
+XX                                     XXXXXXXXXXXXXXXXXX
+XXXX                                +XXXXXXXXXXXXXXXX    +
+XXXXXX                            +XXXXXXXXXXXXXX        +
+XXXXXXXX                        +XXXXXXXXXXXX            +
+XXXXXXXXXX                    +XXXXXXXXXX                +
+XXXXXXXXXXXX                +XXXXXXXX                    +
+XXXXXXXXXXXXXX            +XXXXXX                        +
+XXXXXXXXXXXXXXXX        +XXXX                            +
+XXXXXXXXXXXXXXXXXX    +XX                                +
+XXXXXXXXXXXXXXXXXXXX 
+(2 rows)
+
+\pset format wrapped
+execute q;
+      a       +           a            +
+              +           b             
+      b                                 
+-------------- ------------------------
+XX           XXXXXXXXXXXX.
+               XXXXXX
+XXXX      +XXXXXXXXXXXX.
+XXXXXX  +XXXX                +
+XXXXXXX.XXXXXXXXXXXX.
+X            +XX                    +
+XXXXXXX.XXXXXXXXXXXX+
+XXX        +XXXXXXXXXX    +
+XXXXXXX.XXXXXXXX        +
+XXXXX    +XXXXXX            +
+XXXXXXX.XXXX                +
+XXXXXXX+XX                    +
+XXXXXXX.
+XXXXXXX.
+XX          +
+XXXXXXX.
+XXXXXXX.
+XXXX      +
+XXXXXXX.
+XXXXXXX.
+XXXXXX   
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                    a                    +|                  a                  +
+                                         +|                  b                   
+                    b                     |                                      
+------------------------------------------+--------------------------------------
+ XX                                     | XXXXXXXXXXXXXXXXXX
+ XXXX                                +| XXXXXXXXXXXXXXXX    +
+ XXXXXX                            +| XXXXXXXXXXXXXX        +
+ XXXXXXXX                        +| XXXXXXXXXXXX            +
+ XXXXXXXXXX                    +| XXXXXXXXXX                +
+ XXXXXXXXXXXX                +| XXXXXXXX                    +
+ XXXXXXXXXXXXXX            +| XXXXXX                        +
+ XXXXXXXXXXXXXXXX        +| XXXX                            +
+ XXXXXXXXXXXXXXXXXX    +| XX                                +
+ XXXXXXXXXXXXXXXXXXXX | 
+(2 rows)
+
+\pset format wrapped
+execute q;
+       a      +|           a           +
+              +|           b            
+       b       |                        
+---------------+------------------------
+ XX          | XXXXXXXXXXX.
+               |.XXXXXXX
+ XXXX     +| XXXXXXXXXXX.
+ XXXXXX +|.XXXXX            +
+ XXXXXX .| XXXXXXXXXXX.
+.XX         +|.XXX                +
+ XXXXXX .| XXXXXXXXXXX.
+.XXXX     +|.X                    +
+ XXXXXX .| XXXXXXXXXX  +
+.XXXXXX +| XXXXXXXX      +
+ XXXXXX .| XXXXXX          +
+.XXXXXX .| XXXX              +
+.XX         +| XX                  +
+ XXXXXX .| 
+.XXXXXX .| 
+.XXXX     +| 
+ XXXXXX .| 
+.XXXXXX .| 
+.XXXXXX +| 
+ XXXXXX .| 
+.XXXXXX .| 
+.XXXXXX .| 
+.XX          | 
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
++------------------------------------------+--------------------------------------+
+|                    a                    +|                  a                  +|
+|                                         +|                  b                   |
+|                    b                     |                                      |
++------------------------------------------+--------------------------------------+
+| XX                                     | XXXXXXXXXXXXXXXXXX |
+| XXXX                                +| XXXXXXXXXXXXXXXX    +|
+| XXXXXX                            +| XXXXXXXXXXXXXX        +|
+| XXXXXXXX                        +| XXXXXXXXXXXX            +|
+| XXXXXXXXXX                    +| XXXXXXXXXX                +|
+| XXXXXXXXXXXX                +| XXXXXXXX                    +|
+| XXXXXXXXXXXXXX            +| XXXXXX                        +|
+| XXXXXXXXXXXXXXXX        +| XXXX                            +|
+| XXXXXXXXXXXXXXXXXX    +| XX                                +|
+| XXXXXXXXXXXXXXXXXXXX |                                      |
++------------------------------------------+--------------------------------------+
+(2 rows)
+
+\pset format wrapped
+execute q;
++--------------+-----------------------+
+|      a      +|           a          +|
+|             +|           b           |
+|      b       |                       |
++--------------+-----------------------+
+| XX         | XXXXXXXXXX .|
+|              |.XXXXXXXX      |
+| XXXX    +| XXXXXXXXXX .|
+| XXXXXX+|.XXXXXX         +|
+| XXXXXX.| XXXXXXXXXX .|
+|.XX        +|.XXXX             +|
+| XXXXXX.| XXXXXXXXXX .|
+|.XXXX    +|.XX                 +|
+| XXXXXX.| XXXXXXXXXX +|
+|.XXXXXX+| XXXXXXXX     +|
+| XXXXXX.| XXXXXX         +|
+|.XXXXXX.| XXXX             +|
+|.XX        +| XX                 +|
+| XXXXXX.|                       |
+|.XXXXXX.|                       |
+|.XXXX    +|                       |
+| XXXXXX.|                       |
+|.XXXXXX.|                       |
+|.XXXXXX+|                       |
+| XXXXXX.|                       |
+|.XXXXXX.|                       |
+|.XXXXXX.|                       |
+|.XX         |                       |
++--------------+-----------------------+
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+* Record 1                               
+ a+ XX                                     
+  +
+ b 
+ a+ XXXXXXXXXXXXXXXXXX     
+ b 
+* Record 2                               
+ a+ XXXX                                +
+  + XXXXXX                            +
+ b  XXXXXXXX                        +
+    XXXXXXXXXX                    +
+    XXXXXXXXXXXX                +
+    XXXXXXXXXXXXXX            +
+    XXXXXXXXXXXXXXXX        +
+    XXXXXXXXXXXXXXXXXX    +
+    XXXXXXXXXXXXXXXXXXXX 
+ a+ XXXXXXXXXXXXXXXX        +
+ b  XXXXXXXXXXXXXX            +
+    XXXXXXXXXXXX                +
+    XXXXXXXXXX                    +
+    XXXXXXXX                        +
+    XXXXXX                            +
+    XXXX                                +
+    XX                                    +
+                                             
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a+ XX               
+  +
+ b 
+ a+ XXXXXXXXX.
+ b .XXXXXXXXX 
+* Record 2         
+ a+ XXXX          +
+  + XXXXXX      +
+ b  XXXXXXXX  +
+    XXXXXXXXX.
+   .X                +
+    XXXXXXXXX.
+   .XXX            +
+    XXXXXXXXX.
+   .XXXXX        +
+    XXXXXXXXX.
+   .XXXXXXX    +
+    XXXXXXXXX.
+   .XXXXXXXXX+
+    XXXXXXXXX.
+   .XXXXXXXXX.
+   .XX               
+ a+ XXXXXXXXX.
+ b .XXXXXXX    +
+    XXXXXXXXX.
+   .XXXXX        +
+    XXXXXXXXX.
+   .XXX            +
+    XXXXXXXXX.
+   .X                +
+    XXXXXXXX  +
+    XXXXXX      +
+    XXXX          +
+    XX              +
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+-[ RECORD 1 ]-------------------------------
+ a+| XX                                     
+  +|
+ b |
+ a+| XXXXXXXXXXXXXXXXXX     
+ b |
+-[ RECORD 2 ]-------------------------------
+ a+| XXXX                                +
+  +| XXXXXX                            +
+ b | XXXXXXXX                        +
+   | XXXXXXXXXX                    +
+   | XXXXXXXXXXXX                +
+   | XXXXXXXXXXXXXX            +
+   | XXXXXXXXXXXXXXXX        +
+   | XXXXXXXXXXXXXXXXXX    +
+   | XXXXXXXXXXXXXXXXXXXX 
+ a+| XXXXXXXXXXXXXXXX        +
+ b | XXXXXXXXXXXXXX            +
+   | XXXXXXXXXXXX                +
+   | XXXXXXXXXX                    +
+   | XXXXXXXX                        +
+   | XXXXXX                            +
+   | XXXX                                +
+   | XX                                    +
+   |                                          
+
+\pset format wrapped
+execute q;
+-[ RECORD 1 ]-------
+ a+| XX             
+  +|
+ b |
+ a+| XXXXXXXX.
+ b |.XXXXXXXX.
+   |.XX             
+-[ RECORD 2 ]-------
+ a+| XXXX        +
+  +| XXXXXX    +
+ b | XXXXXXXX+
+   | XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX.
+   |.XXXX        +
+   | XXXXXXXX.
+   |.XXXXXX    +
+   | XXXXXXXX.
+   |.XXXXXXXX+
+   | XXXXXXXX.
+   |.XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX.
+   |.XXXXXXXX.
+   |.XXXX         
+ a+| XXXXXXXX.
+ b |.XXXXXXXX+
+   | XXXXXXXX.
+   |.XXXXXX    +
+   | XXXXXXXX.
+   |.XXXX        +
+   | XXXXXXXX.
+   |.XX            +
+   | XXXXXXXX+
+   | XXXXXX    +
+   | XXXX        +
+   | XX            +
+   |                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
++-[ RECORD 1 ]---------------------------------+
+| a+| XX                                     |
+|  +|                                          |
+| b |                                          |
+| a+| XXXXXXXXXXXXXXXXXX     |
+| b |                                          |
++-[ RECORD 2 ]---------------------------------+
+| a+| XXXX                                +|
+|  +| XXXXXX                            +|
+| b | XXXXXXXX                        +|
+|   | XXXXXXXXXX                    +|
+|   | XXXXXXXXXXXX                +|
+|   | XXXXXXXXXXXXXX            +|
+|   | XXXXXXXXXXXXXXXX        +|
+|   | XXXXXXXXXXXXXXXXXX    +|
+|   | XXXXXXXXXXXXXXXXXXXX |
+| a+| XXXXXXXXXXXXXXXX        +|
+| b | XXXXXXXXXXXXXX            +|
+|   | XXXXXXXXXXXX                +|
+|   | XXXXXXXXXX                    +|
+|   | XXXXXXXX                        +|
+|   | XXXXXX                            +|
+|   | XXXX                                +|
+|   | XX                                    +|
+|   |                                          |
++---+------------------------------------------+
+
+\pset format wrapped
+execute q;
++-[ RECORD 1 ]-----+
+| a+| XX         |
+|  +|              |
+| b |              |
+| a+| XXXXXX.|
+| b |.XXXXXX.|
+|   |.XXXXXX |
++-[ RECORD 2 ]-----+
+| a+| XXXX    +|
+|  +| XXXXXX+|
+| b | XXXXXX.|
+|   |.XX        +|
+|   | XXXXXX.|
+|   |.XXXX    +|
+|   | XXXXXX.|
+|   |.XXXXXX+|
+|   | XXXXXX.|
+|   |.XXXXXX.|
+|   |.XX        +|
+|   | XXXXXX.|
+|   |.XXXXXX.|
+|   |.XXXX    +|
+|   | XXXXXX.|
+|   |.XXXXXX.|
+|   |.XXXXXX+|
+|   | XXXXXX.|
+|   |.XXXXXX.|
+|   |.XXXXXX.|
+|   |.XX         |
+| a+| XXXXXX.|
+| b |.XXXXXX.|
+|   |.XXXX    +|
+|   | XXXXXX.|
+|   |.XXXXXX.|
+|   |.XX        +|
+|   | XXXXXX.|
+|   |.XXXXXX+|
+|   | XXXXXX.|
+|   |.XXXX    +|
+|   | XXXXXX.|
+|   |.XX        +|
+|   | XXXXXX+|
+|   | XXXX    +|
+|   | XX        +|
+|   |              |
++---+--------------+
+
+-- old-ascii has a number of disadvantages and should probably be
+-- removed. When reading this output keep in mind that old-ascii
+-- doesn't show wrapping on the right-most column (because it uses the
+-- "right" border style not the "mid" border style) and that we don't
+-- bother with old-ascii divider markings on headers since we never
+-- wrap them anwyays so they would always show the newline marker.
+\pset linestyle old-ascii
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                   a                                      a                  
+                                        +                 b                  
+                   b                    +                                    
+---------------------------------------- ------------------------------------
+XX                                     XXXXXXXXXXXXXXXXXX
+XXXX                                 XXXXXXXXXXXXXXXX     
+XXXXXX                             XXXXXXXXXXXXXX         
+XXXXXXXX                         XXXXXXXXXXXX             
+XXXXXXXXXX                     XXXXXXXXXX                 
+XXXXXXXXXXXX                 XXXXXXXX                     
+XXXXXXXXXXXXXX             XXXXXX                         
+XXXXXXXXXXXXXXXX         XXXX                             
+XXXXXXXXXXXXXXXXXX     XX                                 
+XXXXXXXXXXXXXXXXXXXX 
+(2 rows)
+
+\pset format wrapped
+execute q;
+      a                   a            
+              +           b            
+      b       +                        
+-------------- ------------------------
+XX           XXXXXXXXXXXX 
+               XXXXXX
+XXXX       XXXXXXXXXXXX 
+XXXXXX   XXXX                 
+XXXXXXX XXXXXXXXXXXX 
+X             XX                     
+XXXXXXX XXXXXXXXXXXX 
+XXX         XXXXXXXXXX     
+XXXXXXX XXXXXXXX         
+XXXXX     XXXXXX             
+XXXXXXX XXXX                 
+XXXXXXX XX                     
+XXXXXXX 
+XXXXXXX 
+XX           
+XXXXXXX 
+XXXXXXX 
+XXXX       
+XXXXXXX 
+XXXXXXX 
+XXXXXX   
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                    a                     |                  a                   
++                                         |+                 b                   
++                   b                     |+                                     
+------------------------------------------+--------------------------------------
+ XX                                     | XXXXXXXXXXXXXXXXXX
+ XXXX                                 | XXXXXXXXXXXXXXXX     
+ XXXXXX                             : XXXXXXXXXXXXXX         
+ XXXXXXXX                         : XXXXXXXXXXXX             
+ XXXXXXXXXX                     : XXXXXXXXXX                 
+ XXXXXXXXXXXX                 : XXXXXXXX                     
+ XXXXXXXXXXXXXX             : XXXXXX                         
+ XXXXXXXXXXXXXXXX         : XXXX                             
+ XXXXXXXXXXXXXXXXXX     : XX                                 
+ XXXXXXXXXXXXXXXXXXXX : 
+(2 rows)
+
+\pset format wrapped
+execute q;
+       a       |           a            
++              |+          b            
++      b       |+                       
+---------------+------------------------
+ XX          | XXXXXXXXXXX 
+               ; XXXXXXX
+ XXXX      | XXXXXXXXXXX 
+ XXXXXX  ; XXXXX             
+ XXXXXX  : XXXXXXXXXXX 
+ XX          ; XXX                 
+ XXXXXX  : XXXXXXXXXXX 
+ XXXX      ; X                     
+ XXXXXX  : XXXXXXXXXX   
+ XXXXXX  : XXXXXXXX       
+ XXXXXX  : XXXXXX           
+ XXXXXX  : XXXX               
+ XX          : XX                   
+ XXXXXX  : 
+ XXXXXX    
+ XXXX        
+ XXXXXX    
+ XXXXXX    
+ XXXXXX    
+ XXXXXX    
+ XXXXXX    
+ XXXXXX    
+ XX            
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
++------------------------------------------+--------------------------------------+
+|                    a                     |                  a                   |
+|+                                         |+                 b                   |
+|+                   b                     |+                                     |
++------------------------------------------+--------------------------------------+
+| XX                                     | XXXXXXXXXXXXXXXXXX |
+| XXXX                                 | XXXXXXXXXXXXXXXX     |
+| XXXXXX                             : XXXXXXXXXXXXXX         |
+| XXXXXXXX                         : XXXXXXXXXXXX             |
+| XXXXXXXXXX                     : XXXXXXXXXX                 |
+| XXXXXXXXXXXX                 : XXXXXXXX                     |
+| XXXXXXXXXXXXXX             : XXXXXX                         |
+| XXXXXXXXXXXXXXXX         : XXXX                             |
+| XXXXXXXXXXXXXXXXXX     : XX                                 |
+| XXXXXXXXXXXXXXXXXXXX :                                      |
++------------------------------------------+--------------------------------------+
+(2 rows)
+
+\pset format wrapped
+execute q;
++--------------+-----------------------+
+|      a       |           a           |
+|+             |+          b           |
+|+     b       |+                      |
++--------------+-----------------------+
+| XX         | XXXXXXXXXX  |
+|              ; XXXXXXXX      |
+| XXXX     | XXXXXXXXXX  |
+| XXXXXX ; XXXXXX          |
+| XXXXXX : XXXXXXXXXX  |
+| XX         ; XXXX              |
+| XXXXXX : XXXXXXXXXX  |
+| XXXX     ; XX                  |
+| XXXXXX : XXXXXXXXXX  |
+| XXXXXX : XXXXXXXX      |
+| XXXXXX : XXXXXX          |
+| XXXXXX : XXXX              |
+| XX         : XX                  |
+| XXXXXX :                       |
+| XXXXXX                         |
+| XXXX                             |
+| XXXXXX                         |
+| XXXXXX                         |
+| XXXXXX                         |
+| XXXXXX                         |
+| XXXXXX                         |
+| XXXXXX                         |
+| XX                                 |
++--------------+-----------------------+
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+* Record 1                               
+ a  XX                                     
++  
++b 
+ a  XXXXXXXXXXXXXXXXXX     
++b 
+* Record 2                               
+ a  XXXX                                 
++   XXXXXX                             
++b  XXXXXXXX                         
+    XXXXXXXXXX                     
+    XXXXXXXXXXXX                 
+    XXXXXXXXXXXXXX             
+    XXXXXXXXXXXXXXXX         
+    XXXXXXXXXXXXXXXXXX     
+    XXXXXXXXXXXXXXXXXXXX 
+ a  XXXXXXXXXXXXXXXX         
++b  XXXXXXXXXXXXXX             
+    XXXXXXXXXXXX                 
+    XXXXXXXXXX                     
+    XXXXXXXX                         
+    XXXXXX                             
+    XXXX                                 
+    XX                                     
+                                             
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a  XX               
++  
++b 
+ a  XXXXXXXXX 
++b  XXXXXXXXX 
+* Record 2         
+ a  XXXX           
++   XXXXXX       
++b  XXXXXXXX   
+    XXXXXXXXX 
+    X                 
+    XXXXXXXXX 
+    XXX             
+    XXXXXXXXX 
+    XXXXX         
+    XXXXXXXXX 
+    XXXXXXX     
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XXXXXXXXX 
+    XX               
+ a  XXXXXXXXX 
++b  XXXXXXX     
+    XXXXXXXXX 
+    XXXXX         
+    XXXXXXXXX 
+    XXX             
+    XXXXXXXXX 
+    X                 
+    XXXXXXXX   
+    XXXXXX       
+    XXXX           
+    XX               
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+-[ RECORD 1 ]-------------------------------
+ a | XX                                     
++  ;
++b ;
+ a | XXXXXXXXXXXXXXXXXX     
++b ;
+-[ RECORD 2 ]-------------------------------
+ a | XXXX                                 
++  : XXXXXX                             
++b : XXXXXXXX                         
+   : XXXXXXXXXX                     
+   : XXXXXXXXXXXX                 
+   : XXXXXXXXXXXXXX             
+   : XXXXXXXXXXXXXXXX         
+   : XXXXXXXXXXXXXXXXXX     
+   : XXXXXXXXXXXXXXXXXXXX 
+ a | XXXXXXXXXXXXXXXX         
++b : XXXXXXXXXXXXXX             
+   : XXXXXXXXXXXX                 
+   : XXXXXXXXXX                     
+   : XXXXXXXX                         
+   : XXXXXX                             
+   : XXXX                                 
+   : XX                                     
+   :                                          
+
+\pset format wrapped
+execute q;
+-[ RECORD 1 ]-------
+ a | XX             
++  ;
++b ;
+ a | XXXXXXXX 
++b ; XXXXXXXX 
+   ; XX             
+-[ RECORD 2 ]-------
+ a | XXXX         
++  : XXXXXX     
++b : XXXXXXXX 
+   : XXXXXXXX 
+   ; XX             
+   : XXXXXXXX 
+   ; XXXX         
+   : XXXXXXXX 
+   ; XXXXXX     
+   : XXXXXXXX 
+   ; XXXXXXXX 
+   : XXXXXXXX 
+   ; XXXXXXXX 
+   ; XX             
+   : XXXXXXXX 
+   ; XXXXXXXX 
+   ; XXXX         
+ a | XXXXXXXX 
++b ; XXXXXXXX 
+   : XXXXXXXX 
+   ; XXXXXX     
+   : XXXXXXXX 
+   ; XXXX         
+   : XXXXXXXX 
+   ; XX             
+   : XXXXXXXX 
+   : XXXXXX     
+   : XXXX         
+   : XX             
+   :                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
++-[ RECORD 1 ]---------------------------------+
+| a | XX                                     |
+|+  ;                                          |
+|+b ;                                          |
+| a | XXXXXXXXXXXXXXXXXX     |
+|+b ;                                          |
++-[ RECORD 2 ]---------------------------------+
+| a | XXXX                                 |
+|+  : XXXXXX                             |
+|+b : XXXXXXXX                         |
+|   : XXXXXXXXXX                     |
+|   : XXXXXXXXXXXX                 |
+|   : XXXXXXXXXXXXXX             |
+|   : XXXXXXXXXXXXXXXX         |
+|   : XXXXXXXXXXXXXXXXXX     |
+|   : XXXXXXXXXXXXXXXXXXXX |
+| a | XXXXXXXXXXXXXXXX         |
+|+b : XXXXXXXXXXXXXX             |
+|   : XXXXXXXXXXXX                 |
+|   : XXXXXXXXXX                     |
+|   : XXXXXXXX                         |
+|   : XXXXXX                             |
+|   : XXXX                                 |
+|   : XX                                     |
+|   :                                          |
++---+------------------------------------------+
+
+\pset format wrapped
+execute q;
++-[ RECORD 1 ]-----+
+| a | XX         |
+|+  ;              |
+|+b ;              |
+| a | XXXXXX |
+|+b ; XXXXXX |
+|   ; XXXXXX |
++-[ RECORD 2 ]-----+
+| a | XXXX     |
+|+  : XXXXXX |
+|+b : XXXXXX |
+|   ; XX         |
+|   : XXXXXX |
+|   ; XXXX     |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   ; XX         |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   ; XXXX     |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   ; XXXXXX |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   ; XXXXXX |
+|   ; XX         |
+| a | XXXXXX |
+|+b ; XXXXXX |
+|   ; XXXX     |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   ; XX         |
+|   : XXXXXX |
+|   ; XXXXXX |
+|   : XXXXXX |
+|   ; XXXX     |
+|   : XXXXXX |
+|   ; XX         |
+|   : XXXXXX |
+|   : XXXX     |
+|   : XX         |
+|   :              |
++---+--------------+
+
+\pset linestyle unicode
+\pset expanded off
+\pset columns 40
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                   a                    ↵                 a                  ↵
+                                        ↵                 b                   
+                   b                                                          
+──────────────────────────────────────── ────────────────────────────────────
+XX                                     XXXXXXXXXXXXXXXXXX
+XXXX                                ↵XXXXXXXXXXXXXXXX    ↵
+XXXXXX                            ↵XXXXXXXXXXXXXX        ↵
+XXXXXXXX                        ↵XXXXXXXXXXXX            ↵
+XXXXXXXXXX                    ↵XXXXXXXXXX                ↵
+XXXXXXXXXXXX                ↵XXXXXXXX                    ↵
+XXXXXXXXXXXXXX            ↵XXXXXX                        ↵
+XXXXXXXXXXXXXXXX        ↵XXXX                            ↵
+XXXXXXXXXXXXXXXXXX    ↵XX                                ↵
+XXXXXXXXXXXXXXXXXXXX 
+(2 rows)
+
+\pset format wrapped
+execute q;
+      a       ↵           a            ↵
+              ↵           b             
+      b                                 
+────────────── ────────────────────────
+XX           XXXXXXXXXXXX…
+               XXXXXX
+XXXX      ↵XXXXXXXXXXXX…
+XXXXXX  ↵XXXX                ↵
+XXXXXXX…XXXXXXXXXXXX…
+X            ↵XX                    ↵
+XXXXXXX…XXXXXXXXXXXX↵
+XXX        ↵XXXXXXXXXX    ↵
+XXXXXXX…XXXXXXXX        ↵
+XXXXX    ↵XXXXXX            ↵
+XXXXXXX…XXXX                ↵
+XXXXXXX↵XX                    ↵
+XXXXXXX…
+XXXXXXX…
+XX          ↵
+XXXXXXX…
+XXXXXXX…
+XXXX      ↵
+XXXXXXX…
+XXXXXXX…
+XXXXXX   
+(2 rows)
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+                    a                    ↵│                  a                  ↵
+                                         ↵│                  b                   
+                    b                     │                                      
+──────────────────────────────────────────┼──────────────────────────────────────
+ XX                                     │ XXXXXXXXXXXXXXXXXX
+ XXXX                                ↵│ XXXXXXXXXXXXXXXX    ↵
+ XXXXXX                            ↵│ XXXXXXXXXXXXXX        ↵
+ XXXXXXXX                        ↵│ XXXXXXXXXXXX            ↵
+ XXXXXXXXXX                    ↵│ XXXXXXXXXX                ↵
+ XXXXXXXXXXXX                ↵│ XXXXXXXX                    ↵
+ XXXXXXXXXXXXXX            ↵│ XXXXXX                        ↵
+ XXXXXXXXXXXXXXXX        ↵│ XXXX                            ↵
+ XXXXXXXXXXXXXXXXXX    ↵│ XX                                ↵
+ XXXXXXXXXXXXXXXXXXXX │ 
+(2 rows)
+
+\pset format wrapped
+execute q;
+       a      ↵│           a           ↵
+              ↵│           b            
+       b       │                        
+───────────────┼────────────────────────
+ XX          │ XXXXXXXXXXX…
+               │…XXXXXXX
+ XXXX     ↵│ XXXXXXXXXXX…
+ XXXXXX ↵│…XXXXX            ↵
+ XXXXXX …│ XXXXXXXXXXX…
+…XX         ↵│…XXX                ↵
+ XXXXXX …│ XXXXXXXXXXX…
+…XXXX     ↵│…X                    ↵
+ XXXXXX …│ XXXXXXXXXX  ↵
+…XXXXXX ↵│ XXXXXXXX      ↵
+ XXXXXX …│ XXXXXX          ↵
+…XXXXXX …│ XXXX              ↵
+…XX         ↵│ XX                  ↵
+ XXXXXX …│ 
+…XXXXXX …│ 
+…XXXX     ↵│ 
+ XXXXXX …│ 
+…XXXXXX …│ 
+…XXXXXX ↵│ 
+ XXXXXX …│ 
+…XXXXXX …│ 
+…XXXXXX …│ 
+…XX          │ 
+(2 rows)
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|a
+b
+XX|XXXXXXXXXXXXXXXXXX
+XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+(2 rows)
+\pset format aligned
+execute q;
+┌──────────────────────────────────────────┬──────────────────────────────────────┐
+│                    a                    ↵│                  a                  ↵│
+│                                         ↵│                  b                   │
+│                    b                     │                                      │
+├──────────────────────────────────────────┼──────────────────────────────────────┤
+│ XX                                     │ XXXXXXXXXXXXXXXXXX │
+│ XXXX                                ↵│ XXXXXXXXXXXXXXXX    ↵│
+│ XXXXXX                            ↵│ XXXXXXXXXXXXXX        ↵│
+│ XXXXXXXX                        ↵│ XXXXXXXXXXXX            ↵│
+│ XXXXXXXXXX                    ↵│ XXXXXXXXXX                ↵│
+│ XXXXXXXXXXXX                ↵│ XXXXXXXX                    ↵│
+│ XXXXXXXXXXXXXX            ↵│ XXXXXX                        ↵│
+│ XXXXXXXXXXXXXXXX        ↵│ XXXX                            ↵│
+│ XXXXXXXXXXXXXXXXXX    ↵│ XX                                ↵│
+│ XXXXXXXXXXXXXXXXXXXX │                                      │
+└──────────────────────────────────────────┴──────────────────────────────────────┘
+(2 rows)
+
+\pset format wrapped
+execute q;
+┌──────────────┬───────────────────────┐
+│      a      ↵│           a          ↵│
+│             ↵│           b           │
+│      b       │                       │
+├──────────────┼───────────────────────┤
+│ XX         │ XXXXXXXXXX …│
+│              │…XXXXXXXX      │
+│ XXXX    ↵│ XXXXXXXXXX …│
+│ XXXXXX↵│…XXXXXX         ↵│
+│ XXXXXX…│ XXXXXXXXXX …│
+│…XX        ↵│…XXXX             ↵│
+│ XXXXXX…│ XXXXXXXXXX …│
+│…XXXX    ↵│…XX                 ↵│
+│ XXXXXX…│ XXXXXXXXXX ↵│
+│…XXXXXX↵│ XXXXXXXX     ↵│
+│ XXXXXX…│ XXXXXX         ↵│
+│…XXXXXX…│ XXXX             ↵│
+│…XX        ↵│ XX                 ↵│
+│ XXXXXX…│                       │
+│…XXXXXX…│                       │
+│…XXXX    ↵│                       │
+│ XXXXXX…│                       │
+│…XXXXXX…│                       │
+│…XXXXXX↵│                       │
+│ XXXXXX…│                       │
+│…XXXXXX…│                       │
+│…XXXXXX…│                       │
+│…XX         │                       │
+└──────────────┴───────────────────────┘
+(2 rows)
+
+\pset expanded on
+\pset columns 20
+\pset border 0
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+* Record 1                               
+ a↵ XX                                     
+  ↵
+ b 
+ a↵ XXXXXXXXXXXXXXXXXX     
+ b 
+* Record 2                               
+ a↵ XXXX                                ↵
+  ↵ XXXXXX                            ↵
+ b  XXXXXXXX                        ↵
+    XXXXXXXXXX                    ↵
+    XXXXXXXXXXXX                ↵
+    XXXXXXXXXXXXXX            ↵
+    XXXXXXXXXXXXXXXX        ↵
+    XXXXXXXXXXXXXXXXXX    ↵
+    XXXXXXXXXXXXXXXXXXXX 
+ a↵ XXXXXXXXXXXXXXXX        ↵
+ b  XXXXXXXXXXXXXX            ↵
+    XXXXXXXXXXXX                ↵
+    XXXXXXXXXX                    ↵
+    XXXXXXXX                        ↵
+    XXXXXX                            ↵
+    XXXX                                ↵
+    XX                                    ↵
+                                             
+
+\pset format wrapped
+execute q;
+* Record 1         
+ a↵ XX               
+  ↵
+ b 
+ a↵ XXXXXXXXX…
+ b …XXXXXXXXX 
+* Record 2         
+ a↵ XXXX          ↵
+  ↵ XXXXXX      ↵
+ b  XXXXXXXX  ↵
+    XXXXXXXXX…
+   …X                ↵
+    XXXXXXXXX…
+   …XXX            ↵
+    XXXXXXXXX…
+   …XXXXX        ↵
+    XXXXXXXXX…
+   …XXXXXXX    ↵
+    XXXXXXXXX…
+   …XXXXXXXXX↵
+    XXXXXXXXX…
+   …XXXXXXXXX…
+   …XX               
+ a↵ XXXXXXXXX…
+ b …XXXXXXX    ↵
+    XXXXXXXXX…
+   …XXXXX        ↵
+    XXXXXXXXX…
+   …XXX            ↵
+    XXXXXXXXX…
+   …X                ↵
+    XXXXXXXX  ↵
+    XXXXXX      ↵
+    XXXX          ↵
+    XX              ↵
+                       
+
+\pset border 1
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+─[ RECORD 1 ]───────────────────────────────
+ a↵│ XX                                     
+  ↵│
+ b │
+ a↵│ XXXXXXXXXXXXXXXXXX     
+ b │
+─[ RECORD 2 ]───────────────────────────────
+ a↵│ XXXX                                ↵
+  ↵│ XXXXXX                            ↵
+ b │ XXXXXXXX                        ↵
+   │ XXXXXXXXXX                    ↵
+   │ XXXXXXXXXXXX                ↵
+   │ XXXXXXXXXXXXXX            ↵
+   │ XXXXXXXXXXXXXXXX        ↵
+   │ XXXXXXXXXXXXXXXXXX    ↵
+   │ XXXXXXXXXXXXXXXXXXXX 
+ a↵│ XXXXXXXXXXXXXXXX        ↵
+ b │ XXXXXXXXXXXXXX            ↵
+   │ XXXXXXXXXXXX                ↵
+   │ XXXXXXXXXX                    ↵
+   │ XXXXXXXX                        ↵
+   │ XXXXXX                            ↵
+   │ XXXX                                ↵
+   │ XX                                    ↵
+   │                                          
+
+\pset format wrapped
+execute q;
+─[ RECORD 1 ]───────
+ a↵│ XX             
+  ↵│
+ b │
+ a↵│ XXXXXXXX…
+ b │…XXXXXXXX…
+   │…XX             
+─[ RECORD 2 ]───────
+ a↵│ XXXX        ↵
+  ↵│ XXXXXX    ↵
+ b │ XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX…
+   │…XXXX        ↵
+   │ XXXXXXXX…
+   │…XXXXXX    ↵
+   │ XXXXXXXX…
+   │…XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX…
+   │…XXXXXXXX…
+   │…XXXX         
+ a↵│ XXXXXXXX…
+ b │…XXXXXXXX↵
+   │ XXXXXXXX…
+   │…XXXXXX    ↵
+   │ XXXXXXXX…
+   │…XXXX        ↵
+   │ XXXXXXXX…
+   │…XX            ↵
+   │ XXXXXXXX↵
+   │ XXXXXX    ↵
+   │ XXXX        ↵
+   │ XX            ↵
+   │                  
+
+\pset border 2
+\pset format unaligned
+execute q;
+a
+
+b|XX
+a
+b|XXXXXXXXXXXXXXXXXX
+
+a
+
+b|XXXX
+XXXXXX
+XXXXXXXX
+XXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXX
+a
+b|XXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXX
+XXXXXXXXXXXX
+XXXXXXXXXX
+XXXXXXXX
+XXXXXX
+XXXX
+XX
+
+\pset format aligned
+execute q;
+┌─[ RECORD 1 ]─────────────────────────────────┐
+│ a↵│ XX                                     │
+│  ↵│                                          │
+│ b │                                          │
+│ a↵│ XXXXXXXXXXXXXXXXXX     │
+│ b │                                          │
+├─[ RECORD 2 ]─────────────────────────────────┤
+│ a↵│ XXXX                                ↵│
+│  ↵│ XXXXXX                            ↵│
+│ b │ XXXXXXXX                        ↵│
+│   │ XXXXXXXXXX                    ↵│
+│   │ XXXXXXXXXXXX                ↵│
+│   │ XXXXXXXXXXXXXX            ↵│
+│   │ XXXXXXXXXXXXXXXX        ↵│
+│   │ XXXXXXXXXXXXXXXXXX    ↵│
+│   │ XXXXXXXXXXXXXXXXXXXX │
+│ a↵│ XXXXXXXXXXXXXXXX        ↵│
+│ b │ XXXXXXXXXXXXXX            ↵│
+│   │ XXXXXXXXXXXX                ↵│
+│   │ XXXXXXXXXX                    ↵│
+│   │ XXXXXXXX                        ↵│
+│   │ XXXXXX                            ↵│
+│   │ XXXX                                ↵│
+│   │ XX                                    ↵│
+│   │                                          │
+└───┴──────────────────────────────────────────┘
+
+\pset format wrapped
+execute q;
+┌─[ RECORD 1 ]─────┐
+│ a↵│ XX         │
+│  ↵│              │
+│ b │              │
+│ a↵│ XXXXXX…│
+│ b │…XXXXXX…│
+│   │…XXXXXX │
+├─[ RECORD 2 ]─────┤
+│ a↵│ XXXX    ↵│
+│  ↵│ XXXXXX↵│
+│ b │ XXXXXX…│
+│   │…XX        ↵│
+│   │ XXXXXX…│
+│   │…XXXX    ↵│
+│   │ XXXXXX…│
+│   │…XXXXXX↵│
+│   │ XXXXXX…│
+│   │…XXXXXX…│
+│   │…XX        ↵│
+│   │ XXXXXX…│
+│   │…XXXXXX…│
+│   │…XXXX    ↵│
+│   │ XXXXXX…│
+│   │…XXXXXX…│
+│   │…XXXXXX↵│
+│   │ XXXXXX…│
+│   │…XXXXXX…│
+│   │…XXXXXX…│
+│   │…XX         │
+│ a↵│ XXXXXX…│
+│ b │…XXXXXX…│
+│   │…XXXX    ↵│
+│   │ XXXXXX…│
+│   │…XXXXXX…│
+│   │…XX        ↵│
+│   │ XXXXXX…│
+│   │…XXXXXX↵│
+│   │ XXXXXX…│
+│   │…XXXX    ↵│
+│   │ XXXXXX…│
+│   │…XX        ↵│
+│   │ XXXXXX↵│
+│   │ XXXX    ↵│
+│   │ XX        ↵│
+│   │              │
+└───┴──────────────┘
+
+deallocate q;
diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql
index 99ad5b4..8751899 100644
--- a/src/test/regress/sql/psql.sql
+++ b/src/test/regress/sql/psql.sql
@@ -40,3 +40,367 @@ select 10 as test01, 20 as test02 from generate_series(1,0) \gset
 
 -- show all pset options
 \pset
+
+-- test multi-line headers, wrapping, and newline indicators
+prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "a
+
+b", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
+b" from generate_series(1,10) as n(n) group by n>1 ;
+
+\pset linestyle ascii
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset linestyle old-ascii
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset linestyle unicode
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+
+deallocate q;
+
+
+-- Do it all over again with a utf character
+\encoding unicode
+
+prepare q as select array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),2*n)),E'\n') as "a
+
+b", array_to_string(array_agg(repeat(convert_from('\xEFBCB8'::bytea,'utf-8'),20-2*n)),E'\n') as "a
+b" from generate_series(1,10) as n(n) group by n>1 ;
+
+\pset linestyle ascii
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+-- old-ascii has a number of disadvantages and should probably be
+-- removed. When reading this output keep in mind that old-ascii
+-- doesn't show wrapping on the right-most column (because it uses the
+-- "right" border style not the "mid" border style) and that we don't
+-- bother with old-ascii divider markings on headers since we never
+-- wrap them anwyays so they would always show the newline marker.
+
+\pset linestyle old-ascii
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset linestyle unicode
+
+\pset expanded off
+\pset columns 40
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset expanded on
+\pset columns 20
+
+\pset border 0
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 1
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+\pset border 2
+\pset format unaligned
+execute q;
+\pset format aligned
+execute q;
+\pset format wrapped
+execute q;
+
+
+deallocate q;
#24Michael Paquier
michael.paquier@gmail.com
In reply to: Sergey Muraviov (#23)

On Tue, Apr 29, 2014 at 12:37 PM, Sergey Muraviov
<sergey.k.muraviov@gmail.com> wrote:

2014-04-29 5:52 GMT+04:00 Peter Eisentraut <peter_e@gmx.net>:

Please fix this compiler warning. I think it came from this patch.
print.c: In function 'print_aligned_vertical':
print.c:1354:10: error: pointer targets in passing argument 1 of
'strlen_max_width' differ in signedness [-Werror=pointer-sign]
encoding);
^
print.c:126:12: note: expected 'unsigned char *' but argument is of type
'char *'
static int strlen_max_width(unsigned char *str, int *target_width, int
encoding);
^

fixed

Your patch has been committed by Greg not so long ago, you should send
for this warning a patch rebased on the latest master branch commit :)
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#25Sergey Muraviov
sergey.k.muraviov@gmail.com
In reply to: Michael Paquier (#24)
1 attachment(s)

rebased

2014-04-29 7:43 GMT+04:00 Michael Paquier <michael.paquier@gmail.com>:

On Tue, Apr 29, 2014 at 12:37 PM, Sergey Muraviov
<sergey.k.muraviov@gmail.com> wrote:

2014-04-29 5:52 GMT+04:00 Peter Eisentraut <peter_e@gmx.net>:

Please fix this compiler warning. I think it came from this patch.
print.c: In function 'print_aligned_vertical':
print.c:1354:10: error: pointer targets in passing argument 1 of
'strlen_max_width' differ in signedness [-Werror=pointer-sign]
encoding);
^
print.c:126:12: note: expected 'unsigned char *' but argument is of type
'char *'
static int strlen_max_width(unsigned char *str, int *target_width, int
encoding);
^

fixed

Your patch has been committed by Greg not so long ago, you should send
for this warning a patch rebased on the latest master branch commit :)
--
Michael

--
Best regards,
Sergey Muraviov

Attachments:

fix_psql_print_aligned_vertical_v13.patchtext/x-patch; charset=US-ASCII; name=fix_psql_print_aligned_vertical_v13.patchDownload
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 0ebffff..b2f56a3 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1350,8 +1350,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			{
 				int swidth, twidth = hwidth + 1;
 				fputs(hline? format->header_nl_left: " ", fout);
-				strlen_max_width((char *) hlineptr[hline].ptr, &twidth,
-								 encoding);
+				strlen_max_width(hlineptr[hline].ptr, &twidth, encoding);
 				fprintf(fout, "%-s", hlineptr[hline].ptr);
 
 				swidth = hwidth - twidth;
#26Greg Stark
stark@mit.edu
In reply to: Peter Eisentraut (#22)

On Tue, Apr 29, 2014 at 2:52 AM, Peter Eisentraut <peter_e@gmx.net> wrote:

Please fix this compiler warning. I think it came from this patch.

Oops, I fixed it in a previous version but didn't notice it had crept
back in in the back-and-forth. Will do.

--
greg

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers