On Sat, Oct 24, 2009 at 06:23:24PM +0100, Roger Leigh wrote:
> On Fri, Oct 16, 2009 at 01:38:15PM +0300, Peter Eisentraut wrote:
> > I like the new Unicode tables, but the marking of continuation lines
> > looks pretty horrible:
> > 
> >                              List of databases
> >      Name      │ Owner │ Encoding │ Collation │ Ctype │ Access
> > privileges
> > ───────────────┼───────┼──────────┼───────────┼───────┼───────────────────
> >  pl_regression │ peter │ LATIN2   │ cs_CZ     │ cs_CZ │
> >  postgres      │ peter │ LATIN2   │ cs_CZ     │ cs_CZ │
> >  template0     │ peter │ LATIN2   │ cs_CZ     │ cs_CZ │ =c/peter
> >                ╷       ╷          ╷           ╷       ╎ peter=CTc/peter
> >  template1     │ peter │ LATIN2   │ cs_CZ     │ cs_CZ │ =c/peter
> >                ╷       ╷          ╷           ╷       ╎ peter=CTc/peter
> > (4 rows)

Just for reference, this is what the output looks like (abridged)
using the attached patch.  Should display fine if your mail client handles
UTF-8 messages correctly:

rleigh=# \l
                                     List of databases
      Name       │  Owner   │ Encoding │  Collation  │    Ctype    │   Access 
privileges
─────────────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────
 merkelpb        │ rleigh   │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │
 postgres        │ postgres │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │
 projectb        │ rleigh   │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │
 rleigh          │ rleigh   │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │
[…]
 template0       │ postgres │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │ 
=c/postgres          ↵
                 │          │          │             │             │ 
postgres=CTc/postgres
 template1       │ postgres │ UTF8     │ en_GB.UTF-8 │ en_GB.UTF-8 │ 
=c/postgres          ↵
                 │          │          │             │             │ 
postgres=CTc/postgres
[…]
(17 rows)

> > This looks more like a rendering mistake than something sensible, and
> > also it doesn't actually help the viewer to tell what lines are
> > continued, which was the original purpose.
> 
> I've worked on a solution to this, and the preliminary patch for this
> is attached.  Note there are additional comments in the patch text.

I've attached an updated version of the patch.  This now
- adds one column extra padding in wrapped mode if border=0 to allow
  correct display of wrap marks on the rightmost column.  Removed
  special cases needed to suppress marks on the rightmost column.
- updated unicode symbols to use more commonly-available symbol
  (ellipsis) rather than hooked arrows.  Also makes wrapping more
  visually distinct cf. newlines.  The CR and ellipsis symbols are
  commonly available in several character sets other than unicode,
  and are available in many common fonts, including all the Windows
  monospaced terminal fonts.  Symbol availability isn't an issue on
  GNU/Linux.
- updated ASCII symbols to use similar-looking symbols to the Unicode
  ones.
- added some more comments to code
- removed redundant enum values

I've also attached a trivial test script to run through psql to test
the wrapping, as well as the output I get for psql from 8.4.1 and
the current mainline (both Unicode and ASCII) for comparison.
Hopefully I'm not the only one that finds the proposed change clearer
and more logical than the existing display!


There's just one tiny display glitch I can see, and that's if you have
mixed wrapping and newlines, you miss the lefthand wrap mark if the line
is the last wrapped line and it ends in a newline.  It might not be
possible to pick that up if we can't discover that from the line state
when printing out the line.  Might possibly require storing the wrap
state so we know what happened on the previous line, though if there's
a slightly cleverer approach to detecting if we're already wrapped
that would be better.


Regards,
Roger

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.
From 80a956c0d24e53a1b44619774b099364a585cdd0 Mon Sep 17 00:00:00 2001
From: Roger Leigh <rle...@debian.org>
Date: Sat, 24 Oct 2009 18:11:01 +0100
Subject: [PATCH] psql: Clean up line wrapping for Unicode display
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previously, there were two different methods for displaying
wrapping:
1) Columns headers used a "+" symbol in the left-hand border
   when the column heading contained newlines.
2) Data lines used either a ":" or ";" symbol to represent
   wrapped and new lines, and " " to represent empty lines.
   These symbols replaced the "|" immediately to the left of the
   column.

This patch unifies both of these, by making (1)-like formatting
the behaviour for all new lines in both column headers and data.
It indicates wrapping by using "." symbols in the border for
continuations.  When using Unicode, these are replaced by "↵"
(carriage return) for newlines and "…" (ellipses) for
continuations.
---
 src/bin/psql/print.c |  120 +++++++++++++++++++++++++++++---------------------
 src/bin/psql/print.h |   15 +++++-
 2 files changed, 81 insertions(+), 54 deletions(-)

diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 026e043..212e9a1 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -54,9 +54,10 @@ const printTextFormat pg_asciiformat =
 		{ "-", "+", "+", "+" },
 		{ "",  "|", "|", "|" }
 	},
-	":",
-	";",
-	" "
+	" ",
+	"+",
+	".",
+	"."
 };
 
 const printTextFormat pg_utf8format =
@@ -72,12 +73,13 @@ const printTextFormat pg_utf8format =
 		/* N/A, │, │, │ */
 		{ "", "\342\224\202", "\342\224\202", "\342\224\202" }
 	},
-	/* ╎ */
-	"\342\225\216",
-	/* ┊ */
-	"\342\224\212",
-	/* ╷ */
-	"\342\225\267"
+	" ",
+	/* ↵ */
+	"\342\206\265",
+	/* … */
+	"\342\200\246",
+	/* … */
+	"\342\200\246"
 };
 
 
@@ -575,7 +577,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 
 	/* adjust the total display width based on border style */
 	if (opt_border == 0)
-		width_total = col_count - 1;
+		width_total = col_count;
 	else if (opt_border == 1)
 		width_total = col_count * 3 - 1;
 	else
@@ -770,16 +772,16 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 			while (more_col_wrapping)
 			{
 				if (opt_border == 2)
-					fprintf(fout, "%s%c", dformat->leftvrule,
-							curr_nl_line ? '+' : ' ');
-				else if (opt_border == 1)
-					fputc(curr_nl_line ? '+' : ' ', fout);
+					fputs(dformat->leftvrule, fout);
 
 				for (i = 0; i < cont->ncolumns; i++)
 				{
 					struct lineptr *this_line = col_lineptrs[i] + curr_nl_line;
 					unsigned int nbspace;
 
+					if (opt_border != 0)
+						fputs(curr_nl_line ? format->cont_left : " ", fout);
+
 					if (!header_done[i])
 					{
 						nbspace = width_wrap[i] - this_line->width;
@@ -796,21 +798,16 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 					}
 					else
 						fprintf(fout, "%*s", width_wrap[i], "");
-					if (i < col_count - 1)
-					{
-						if (opt_border == 0)
-							fputc(curr_nl_line ? '+' : ' ', fout);
-						else
-							fprintf(fout, " %s%c", dformat->midvrule,
-									curr_nl_line ? '+' : ' ');
-					}
+
+					fputs(!header_done[i] ? format->cont_right : " ", fout);
+
+					if (opt_border != 0 && i < col_count - 1)
+						fputs(dformat->midvrule, fout);
 				}
 				curr_nl_line++;
 
 				if (opt_border == 2)
-					fprintf(fout, " %s", dformat->rightvrule);
-				else if (opt_border == 1)
-					fputc(' ', fout);
+					fputs(dformat->rightvrule, fout);
 				fputc('\n', fout);
 			}
 
@@ -861,18 +858,39 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 
 			/* left border */
 			if (opt_border == 2)
-				fprintf(fout, "%s ", dformat->leftvrule);
-			else if (opt_border == 1)
-				fputc(' ', fout);
+				fputs(dformat->leftvrule, fout);
 
 			/* for each column */
 			for (j = 0; j < col_count; j++)
 			{
 				/* We have a valid array element, so index it */
 				struct lineptr *this_line = &col_lineptrs[j][curr_nl_line[j]];
-				int			bytes_to_output;
-				int			chars_to_output = width_wrap[j];
+				int		bytes_to_output;
+				int		chars_to_output = width_wrap[j];
 				bool		finalspaces = (opt_border == 2 || j < col_count - 1);
+				printTextLineWrap wrapping = PRINT_LINE_WRAP_NONE;
+
+				/* Determine if column is wrapped or a newline */
+				if (col_lineptrs[j][curr_nl_line[j]].ptr == NULL)
+					wrapping = PRINT_LINE_WRAP_NONE;
+				else
+				{
+					if (bytes_output[j] != 0)
+						wrapping |= PRINT_LINE_WRAP_WRAP;
+					else if (curr_nl_line[j] != 0)
+						wrapping |= PRINT_LINE_WRAP_CONT;
+				}
+
+				/* Print left-hand wrap or newline mark */
+				if (opt_border != 0)
+				{
+					if (wrapping & PRINT_LINE_WRAP_WRAP)
+						fputs(format->wrap_left, fout);
+					else if (wrapping & PRINT_LINE_WRAP_CONT)
+						fputs(format->cont_left, fout);
+					else
+						fputc(' ', fout);
+				}
 
 				if (!this_line->ptr)
 				{
@@ -908,7 +926,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 						/* spaces second */
 						fprintf(fout, "%.*s", bytes_to_output,
 								this_line->ptr + bytes_output[j]);
-						if (finalspaces)
+						if (finalspaces || col_lineptrs[j][curr_nl_line[j]].ptr != NULL)
 							fprintf(fout, "%*s", width_wrap[j] - chars_to_output, "");
 					}
 
@@ -927,29 +945,31 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 					}
 				}
 
-				/* print a divider, if not the last column */
-				if (j < col_count - 1)
+				/* Determine if next line for this column is wrapped or a newline */
+				if (col_lineptrs[j][curr_nl_line[j]].ptr == NULL)
+					wrapping = PRINT_LINE_WRAP_NONE;
+				else
 				{
-					if (opt_border == 0)
-						fputc(' ', fout);
-					/* Next value is beyond past newlines? */
-					else if (col_lineptrs[j + 1][curr_nl_line[j + 1]].ptr == NULL)
-						fprintf(fout, " %s ", format->midvrule_blank);
-					/* In wrapping of value? */
-					else if (bytes_output[j + 1] != 0)
-						fprintf(fout, " %s ", format->midvrule_wrap);
-					/* After first newline value */
-					else if (curr_nl_line[j + 1] != 0)
-						fprintf(fout, " %s ", format->midvrule_cont);
-					/* Ordinary line */
-					else
-						fprintf(fout, " %s ", dformat->midvrule);
+					if (bytes_output[j] != 0)
+						wrapping |= PRINT_LINE_WRAP_WRAP;
+					else if (curr_nl_line[j] != 0)
+						wrapping |= PRINT_LINE_WRAP_CONT;
 				}
+
+				/* Print right-hand wrap or newline mark */
+				if (wrapping & PRINT_LINE_WRAP_WRAP)
+					fputs(format->wrap_right, fout);
+				else if (wrapping & PRINT_LINE_WRAP_CONT)
+					fputs(format->cont_right, fout);
+				else if (!(opt_border == 0 && j == col_count - 1))
+					fputc(' ', fout);
+				if (opt_border != 0 && j < col_count - 1)
+					fputs(dformat->midvrule, fout);
 			}
 
 			/* end-of-row border */
 			if (opt_border == 2)
-				fprintf(fout, " %s", dformat->rightvrule);
+				fputs(dformat->rightvrule, fout);
 			fputc('\n', fout);
 
 		} while (more_lines);
@@ -1196,9 +1216,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 				fprintf(fout, "%*s", hwidth, "");
 
 			if (opt_border > 0)
-				fprintf(fout, " %s ",
-						(line_count == 0) ?
-						format->midvrule_cont : dformat->midvrule);
+				fprintf(fout, " %s ", dformat->midvrule);
 			else
 				fputc(' ', fout);
 
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index 056aaa6..087d972 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -41,14 +41,23 @@ typedef enum printTextRule
 	PRINT_RULE_DATA				/* data line (hrule is unused here) */
 } printTextRule;
 
+typedef enum printTextLineWrap
+{
+	/* Types of line continuation and wrapping */
+	PRINT_LINE_WRAP_NONE = 0,      /* No wrapping */
+	PRINT_LINE_WRAP_WRAP = 1 << 0, /* Line is wrapped */
+	PRINT_LINE_WRAP_CONT = 1 << 1, /* Continuation after newline */
+} printTextLineWrap;
+
 typedef struct printTextFormat
 {
 	/* A complete line style */
 	const char *name;				/* for display purposes */
 	printTextLineFormat lrule[4];	/* indexed by enum printTextRule */
-	const char *midvrule_cont;	/* vertical line for continue after newline */
-	const char *midvrule_wrap;	/* vertical line for wrapped data */
-	const char *midvrule_blank;	/* vertical line for blank data */
+	const char *cont_left;	/* continue after newline */
+	const char *cont_right;/* continue after newline */
+	const char *wrap_left;	/* wrapped data */
+	const char *wrap_right;	/* wrapped data */
 } printTextFormat;
 
 typedef struct printTableOpt
-- 
1.6.5

\pset pager off

\pset border 0

SELECT 'sit amet,
consectetur
adipisicing
elit' AS "Lorem
ipsum
dolor", 5 AS num;

\pset border 1

SELECT 'sit amet,
consectetur
adipisicing
elit' AS "Lorem
ipsum
dolor", 5 AS num;

\pset border 2

SELECT 'sit amet,
consectetur
adipisicing
elit' AS "Lorem
ipsum
dolor", 5 AS num;

\pset format wrapped

\pset border 0

SELECT
5 AS num,
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat.
Duis
aute
irure
dolor
in
reprehenderit'
AS "Lorem ipsum dolor";

\pset border 1

SELECT
5 AS num,
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat.
Duis
aute
irure
dolor
in
reprehenderit'
AS "Lorem ipsum dolor";

\pset border 2

SELECT
5 AS num,
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat.
Duis
aute
irure
dolor
in
reprehenderit'
AS "Lorem ipsum dolor";
psql from pg 8.4.1
------------------

rleigh=# \i test.sql
Pager usage is off. 
Border style is 0.  
   Lorem    num     
   ipsum   +        
   dolor   +        
----------- ---     
sit amet,     5     
consectetur         
adipisicing         
elit                
(1 row)             

Border style is 1.
    Lorem    | num 
+   ipsum    |+    
+   dolor    |+    
-------------+-----
 sit amet,   |   5 
 consectetur       
 adipisicing       
 elit              
(1 row)            

Border style is 2.
+-------------+-----+
|    Lorem    | num |
|+   ipsum    |+    |
|+   dolor    |+    |
+-------------+-----+
| sit amet,   |   5 |
| consectetur       |
| adipisicing       |
| elit              |
+-------------+-----+
(1 row)              

Output format is wrapped.
Border style is 0.       
num                              Lorem ipsum dolor                              
--- ----------------------------------------------------------------------------
  5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tem
    por incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, qu
    is nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo conseq
    uat.                                                                        
    Duis                                                                        
    aute                                                                        
    irure                                                                       
    dolor                                                                       
    in                                                                          
    reprehenderit                                                               
(1 row)                                                                         

Border style is 1.
 num |                            Lorem ipsum dolor                             
-----+--------------------------------------------------------------------------
   5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
     ;  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim ve 
     ; niam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea co 
     ; mmodo consequat.                                                         
     : Duis                                                                     
     : aute                                                                     
     : irure                                                                    
     : dolor                                                                    
     : in                                                                       
     : reprehenderit                                                            
(1 row)                                                                         

Border style is 2.
+-----+------------------------------------------------------------------------+
| num |                           Lorem ipsum dolor                            |
+-----+------------------------------------------------------------------------+
|   5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusm |
|     ; od tempor incididunt ut labore et dolore magna aliqua. Ut enim ad mini |
|     ; m veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex |
|     ;  ea commodo consequat.                                                 |
|     : Duis                                                                   |
|     : aute                                                                   |
|     : irure                                                                  |
|     : dolor                                                                  |
|     : in                                                                     |
|     : reprehenderit                                                          |
+-----+------------------------------------------------------------------------+
(1 row)

psql from current git + patch (UTF-8)
-------------------------------------

rleigh=# \i test.sql
Pager usage is off. 
Border style is 0.  
   Lorem   ↵num     
   ipsum   ↵        
   dolor            
─────────── ───     
sit amet,  ↵  5     
consectetur↵        
adipisicing↵        
elit                
(1 row)             

Border style is 1.
    Lorem   ↵│ num 
    ipsum   ↵│     
    dolor    │     
─────────────┼─────
 sit amet,  ↵│   5 
 consectetur↵│     
 adipisicing↵│     
 elit        │     
(1 row)            

Border style is 2.
┌─────────────┬─────┐
│    Lorem   ↵│ num │
│    ipsum   ↵│     │
│    dolor    │     │
├─────────────┼─────┤
│ sit amet,  ↵│   5 │
│ consectetur↵│     │
│ adipisicing↵│     │
│ elit        │     │
└─────────────┴─────┘
(1 row)              

Output format is wrapped.
Border style is 0.       
num                              Lorem ipsum dolor                              
─── ─────────────────────────────────────────────────────────────────────────── 
  5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod te…
    mpor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, …
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con…
    sequat.                                                                    …
    Duis                                                                       ↵
    aute                                                                       ↵
    irure                                                                      ↵
    dolor                                                                      ↵
    in                                                                         ↵
    reprehenderit                                                               
(1 row)                                                                         

Border style is 1.
 num │                            Lorem ipsum dolor                             
─────┼──────────────────────────────────────────────────────────────────────────
   5 │ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod…
     │… tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim ve…
     │…niam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea co…
     │…mmodo consequat.                                                        …
     │ Duis                                                                    ↵
     │ aute                                                                    ↵
     │ irure                                                                   ↵
     │ dolor                                                                   ↵
     │ in                                                                      ↵
     │ reprehenderit                                                            
(1 row)                                                                         

Border style is 2.
┌─────┬────────────────────────────────────────────────────────────────────────┐
│ num │                           Lorem ipsum dolor                            │
├─────┼────────────────────────────────────────────────────────────────────────┤
│   5 │ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusm…│
│     │…od tempor incididunt ut labore et dolore magna aliqua. Ut enim ad mini…│
│     │…m veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex…│
│     │… ea commodo consequat.                                                …│
│     │ Duis                                                                  ↵│
│     │ aute                                                                  ↵│
│     │ irure                                                                 ↵│
│     │ dolor                                                                 ↵│
│     │ in                                                                    ↵│
│     │ reprehenderit                                                          │
└─────┴────────────────────────────────────────────────────────────────────────┘
(1 row)

psql from current git + patch (SQL_ASCII)
-----------------------------------------

rleigh=# \encoding SQL_ASCII 
rleigh=# \i test.sql
Pager usage is off. 
Border style is 0.  
   Lorem   +num     
   ipsum   +        
   dolor            
----------- ---     
sit amet,  +  5     
consectetur+        
adipisicing+        
elit                
(1 row)             

Border style is 1.
    Lorem   +| num 
    ipsum   +|     
    dolor    |     
-------------+-----
 sit amet,  +|   5 
 consectetur+|     
 adipisicing+|     
 elit        |     
(1 row)            

Border style is 2.
+-------------+-----+
|    Lorem   +| num |
|    ipsum   +|     |
|    dolor    |     |
+-------------+-----+
| sit amet,  +|   5 |
| consectetur+|     |
| adipisicing+|     |
| elit        |     |
+-------------+-----+
(1 row)              

Output format is wrapped.
Border style is 0.       
num                              Lorem ipsum dolor                              
--- --------------------------------------------------------------------------- 
  5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod te.
    mpor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, .
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con.
    sequat.                                                                    .
    Duis                                                                       +
    aute                                                                       +
    irure                                                                      +
    dolor                                                                      +
    in                                                                         +
    reprehenderit
(1 row)

Border style is 1.
 num |                            Lorem ipsum dolor
-----+--------------------------------------------------------------------------
   5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.
     |. tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim ve.
     |.niam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea co.
     |.mmodo consequat.                                                        .
     | Duis                                                                    +
     | aute                                                                    +
     | irure                                                                   +
     | dolor                                                                   +
     | in                                                                      +
     | reprehenderit
(1 row)

Border style is 2.
+-----+------------------------------------------------------------------------+
| num |                           Lorem ipsum dolor                            |
+-----+------------------------------------------------------------------------+
|   5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusm.|
|     |.od tempor incididunt ut labore et dolore magna aliqua. Ut enim ad mini.|
|     |.m veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex.|
|     |. ea commodo consequat.                                                .|
|     | Duis                                                                  +|
|     | aute                                                                  +|
|     | irure                                                                 +|
|     | dolor                                                                 +|
|     | in                                                                    +|
|     | reprehenderit                                                          |
+-----+------------------------------------------------------------------------+
(1 row)

Attachment: signature.asc
Description: Digital signature

Reply via email to