Please check this patch.

2014-05-12 22:56 GMT+04:00 Sergey Muraviov <sergey.k.murav...@gmail.com>:

> Hi.
>
> I'll try to fix it tomorrow.
>
>
> 2014-05-12 18:42 GMT+04:00 Tom Lane <t...@sss.pgh.pa.us>:
>
> Greg Stark <st...@mit.edu> writes:
>> > On Mon, May 12, 2014 at 2:12 PM, Greg Stark <st...@mit.edu> wrote:
>> >> Hm, there was an off by one error earlier in some cases, maybe we
>> >> fixed it by breaking other case. Will investigate.
>>
>> > Those spaces are coming from the ascii wrapping indicators. i.e. the
>> periods in:
>>
>> Ah.  I wonder whether anyone will complain that the format changed?
>>
>> > Apparently we used to print those with border=1 in normal mode but in
>> > expanded mode we left out the space for those on the outermost edges
>> > since there was no need for them. If we put them in for wrapped mode
>> > then we'll be inconsistent if we don't for nonwrapped mode though. And
>> > if we don't put them in for wrapped mode then there's no way to
>> > indicate wrapping versus newlines.
>>
>> Barring anyone complaining that the format changed, I'd say the issue
>> is not that you added them but that the accounting for line length
>> fails to include them.
>>
>>                         regards, tom lane
>>
>
>
>
> --
> Best regards,
> Sergey Muraviov
>



-- 
Best regards,
Sergey MuraviovH
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 62850d8..69f4efe 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1258,45 +1258,67 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 	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 ]"
+		 * Separators width
 		 */
 		unsigned int width,
+					min_width,
 					swidth;
 
 		if (opt_border == 0)
-			swidth = 1;			/* "header data" */
+			/*
+			 * For border = 0, one space in the middle.
+			 */
+			swidth = 1;
 		else if (opt_border == 1)
-			swidth = 3;			/* "header | data" */
-		else
-			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;
+			/*
+			 * For border = 1, one for the pipe (|) in the middle
+			 * between the two spaces.
+			 */
+			swidth = 3;
 		}
+		else
+			/*
+			 * For border = 2, two more for the pipes (|) at the begging and
+			 * at the end of the lines.
+			 */
+			swidth = 7;
 
-		/* Wrap to minimum width */
+		min_width = hwidth + swidth + 3;
+
+		/* 
+		 * Record header width
+		 */
 		if (!opt_tuples_only)
 		{
-			int			delta = 1 + log10(cont->nrows) - width;
-
+			/* 
+			 * Record number
+			 */
+			unsigned int rwidth = 1 + log10(cont->nrows);
 			if (opt_border == 0)
-				delta += 6;		/* "* RECORD " */
+				rwidth += 9;	/* "* RECORD " */
 			else if (opt_border == 1)
-				delta += 10;	/* "-[ RECORD  ]" */
+				rwidth += 12;	/* "-[ RECORD  ]" */
 			else
-				delta += 15;	/* "+-[ RECORD  ]-+" */
+				rwidth += 15;	/* "+-[ RECORD  ]-+" */
 
-			if (delta > 0)
-				dwidth += delta;
+			if (rwidth > min_width)
+				min_width = rwidth;
 		}
-		else if (dwidth < 3)
-			dwidth = 3;
+
+		if ((hheight > 1) && (opt_border < 2))
+			hwidth++;  /* for wrapping indicator*/
+
+		/* Wrap to minimum width */
+		width = hwidth + swidth + dwidth;
+		if ((width < min_width) || (output_columns < min_width))
+			dwidth = min_width - hwidth - swidth;
+		else if ((output_columns > 0) &&
+				 (width > output_columns))
+			/*
+			 * Wrap to maximum width
+			 */
+			dwidth = output_columns - hwidth - swidth;
 	}
 
 	/* print records */
@@ -1357,12 +1379,17 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 				int			swidth,
 							twidth = hwidth + 1;
 
-				fputs(hline ? format->header_nl_left : " ", fout);
+				if ((hheight > 1) || (opt_border == 2))
+					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 ((hheight > 1) &&
+					(opt_border < 2) && 
+					(cont->opt->format == PRINT_WRAPPED))
+					swidth--;
 				if (swidth > 0) /* spacer */
 					fprintf(fout, "%*s", swidth, " ");
 
@@ -1382,7 +1409,11 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			else
 			{
 				/* Header exhausted but more data for column */
-				fprintf(fout, "%*s", hwidth + 2, "");
+				unsigned int ewidth = hwidth + 2;
+				if ((opt_border < 2) &&
+					(cont->opt->format == PRINT_WRAPPED))
+					ewidth--;
+				fprintf(fout, "%*s", ewidth, "");
 			}
 
 			/* Separator */
@@ -1401,13 +1432,24 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			/* Data */
 			if (!dcomplete)
 			{
-				int			target_width,
+				int			target_width = dwidth,
 							bytes_to_output,
 							swidth;
 
-				fputs(!dcomplete && !offset ? " " : format->wrap_left, fout);
+				if (dheight > 1)
+				{
+					fputs(!dcomplete && !offset ? " " : format->wrap_left, fout);
+					if (cont->opt->format == PRINT_WRAPPED)
+					{
+						if (opt_border < 2)
+							target_width--;
+						if (opt_border < 1)
+							target_width--;
+					}
+				}
+				else if (opt_border > 0)
+					fputs(" ", fout);
 
-				target_width = dwidth;
 				bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
 												   &target_width, encoding);
 				fputnbytes(fout, (char *) (dlineptr[dline].ptr + offset),
@@ -1418,6 +1460,13 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 
 				/* spacer */
 				swidth = dwidth - target_width;
+				if (cont->opt->format == PRINT_WRAPPED)
+				{
+					if (opt_border < 2)
+						swidth--;
+					if (opt_border < 1)
+						swidth--;
+				}
 				if (swidth > 0)
 					fprintf(fout, "%*s", swidth, "");
 
@@ -1437,7 +1486,8 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 				else
 				{
 					/* reached the end of the cell */
-					fputs(" ", fout);
+					if ((dheight > 1) || (opt_border == 2))
+						fputs(" ", fout);
 					dcomplete = 1;
 				}
 
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
index c7dbd54..dcc32b0 100644
--- a/src/test/regress/expected/psql.out
+++ b/src/test/regress/expected/psql.out
@@ -334,31 +334,34 @@ execute q;
 \pset format wrapped
 execute q;
 * Record 1         
- a+ xx                 
+ a+ xx              
   +
  b 
- a+ yyyyyyyyyyyyyyyyyy 
- b 
+ a+ yyyyyyyyyyyyyyy.
+ b .yyy             
 * Record 2         
- a+ xxxx              +
-  + xxxxxx            +
- b  xxxxxxxx          +
-    xxxxxxxxxx        +
-    xxxxxxxxxxxx      +
-    xxxxxxxxxxxxxx    +
-    xxxxxxxxxxxxxxxx  +
-    xxxxxxxxxxxxxxxxxx+
-    xxxxxxxxxxxxxxxxxx.
-   .xx                 
- a+ yyyyyyyyyyyyyyyy  +
- b  yyyyyyyyyyyyyy    +
-    yyyyyyyyyyyy      +
-    yyyyyyyyyy        +
-    yyyyyyyy          +
-    yyyyyy            +
-    yyyy              +
-    yy                +
-                       
+ a+ xxxx           +
+  + xxxxxx         +
+ b  xxxxxxxx       +
+    xxxxxxxxxx     +
+    xxxxxxxxxxxx   +
+    xxxxxxxxxxxxxx +
+    xxxxxxxxxxxxxxx.
+   .x              +
+    xxxxxxxxxxxxxxx.
+   .xxx            +
+    xxxxxxxxxxxxxxx.
+   .xxxxx           
+ a+ yyyyyyyyyyyyyyy.
+ b .y              +
+    yyyyyyyyyyyyyy +
+    yyyyyyyyyyyy   +
+    yyyyyyyyyy     +
+    yyyyyyyy       +
+    yyyyyy         +
+    yyyy           +
+    yy             +
+                    
 
 \pset border 1
 \pset format unaligned
@@ -421,32 +424,34 @@ execute q;
 \pset format wrapped
 execute q;
 -[ RECORD 1 ]-------
- a+| xx               
+ a+| xx             
   +|
  b |
- a+| yyyyyyyyyyyyyyyy.
- b |.yy               
+ a+| yyyyyyyyyyyyyy.
+ b |.yyyy           
 -[ 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              +
-   |                  
+ a+| xxxx          +
+  +| xxxxxx        +
+ b | xxxxxxxx      +
+   | xxxxxxxxxx    +
+   | xxxxxxxxxxxx  +
+   | xxxxxxxxxxxxxx+
+   | xxxxxxxxxxxxxx.
+   |.xx            +
+   | xxxxxxxxxxxxxx.
+   |.xxxx          +
+   | xxxxxxxxxxxxxx.
+   |.xxxxxx         
+ a+| yyyyyyyyyyyyyy.
+ b |.yy            +
+   | yyyyyyyyyyyyyy+
+   | yyyyyyyyyyyy  +
+   | yyyyyyyyyy    +
+   | yyyyyyyy      +
+   | yyyyyy        +
+   | yyyy          +
+   | yy            +
+   |                
 
 \pset border 2
 \pset format unaligned
@@ -803,31 +808,34 @@ execute q;
 \pset format wrapped
 execute q;
 * Record 1         
- a  xx                 
+ a  xx              
 +  
 +b 
- a  yyyyyyyyyyyyyyyyyy 
-+b 
+ a  yyyyyyyyyyyyyyy 
++b  yyy             
 * Record 2         
- a  xxxx               
-+   xxxxxx             
-+b  xxxxxxxx           
-    xxxxxxxxxx         
-    xxxxxxxxxxxx       
-    xxxxxxxxxxxxxx     
-    xxxxxxxxxxxxxxxx   
-    xxxxxxxxxxxxxxxxxx 
-    xxxxxxxxxxxxxxxxxx 
-    xx                 
- a  yyyyyyyyyyyyyyyy   
-+b  yyyyyyyyyyyyyy     
-    yyyyyyyyyyyy       
-    yyyyyyyyyy         
-    yyyyyyyy           
-    yyyyyy             
-    yyyy               
-    yy                 
-                       
+ a  xxxx            
++   xxxxxx          
++b  xxxxxxxx        
+    xxxxxxxxxx      
+    xxxxxxxxxxxx    
+    xxxxxxxxxxxxxx  
+    xxxxxxxxxxxxxxx 
+    x               
+    xxxxxxxxxxxxxxx 
+    xxx             
+    xxxxxxxxxxxxxxx 
+    xxxxx           
+ a  yyyyyyyyyyyyyyy 
++b  y               
+    yyyyyyyyyyyyyy  
+    yyyyyyyyyyyy    
+    yyyyyyyyyy      
+    yyyyyyyy        
+    yyyyyy          
+    yyyy            
+    yy              
+                    
 
 \pset border 1
 \pset format unaligned
@@ -890,32 +898,34 @@ execute q;
 \pset format wrapped
 execute q;
 -[ RECORD 1 ]-------
- a | xx               
+ a | xx             
 +  ;
 +b ;
- a | yyyyyyyyyyyyyyyy 
-+b ; yy               
+ a | yyyyyyyyyyyyyy 
++b ; yyyy           
 -[ 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               
-   :                  
+ a | xxxx           
++  : xxxxxx         
++b : xxxxxxxx       
+   : xxxxxxxxxx     
+   : xxxxxxxxxxxx   
+   : xxxxxxxxxxxxxx 
+   : xxxxxxxxxxxxxx 
+   ; xx             
+   : xxxxxxxxxxxxxx 
+   ; xxxx           
+   : xxxxxxxxxxxxxx 
+   ; xxxxxx         
+ a | yyyyyyyyyyyyyy 
++b ; yy             
+   : yyyyyyyyyyyyyy 
+   : yyyyyyyyyyyy   
+   : yyyyyyyyyy     
+   : yyyyyyyy       
+   : yyyyyy         
+   : yyyy           
+   : yy             
+   :                
 
 \pset border 2
 \pset format unaligned
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to