@@ -1160,7 +1160,9 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
11601160dformatsize = 0 ;
11611161struct lineptr * hlineptr ,
11621162* dlineptr ;
1163- bool is_pager = false;
1163+ bool is_pager = false,
1164+ hmultiline = false,
1165+ dmultiline = false;
11641166int output_columns = 0 ;/* Width of interactive console */
11651167
11661168if (cancel_pressed )
@@ -1196,7 +1198,10 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
11961198if (width > hwidth )
11971199hwidth = width ;
11981200if (height > hheight )
1201+ {
11991202hheight = height ;
1203+ hmultiline = true;
1204+ }
12001205if (fs > hformatsize )
12011206hformatsize = fs ;
12021207}
@@ -1213,7 +1218,10 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
12131218if (width > dwidth )
12141219dwidth = width ;
12151220if (height > dheight )
1221+ {
12161222dheight = height ;
1223+ dmultiline = true;
1224+ }
12171225if (fs > dformatsize )
12181226dformatsize = fs ;
12191227}
@@ -1258,45 +1266,82 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
12581266if (cont -> opt -> format == PRINT_WRAPPED )
12591267{
12601268/*
1261- * Calculate the available width to wrap the columns to after
1262- * subtracting the maximum header width and separators. At a minimum
1263- * enough to print "[ RECORD N ]"
1269+ * Separators width
12641270 */
12651271unsignedint width ,
1266- swidth ;
1272+ min_width ,
1273+ swidth ,
1274+ iwidth = 0 ;
12671275
12681276if (opt_border == 0 )
1269- swidth = 1 ;/* "header data" */
1277+ {
1278+ /*
1279+ * For border = 0, one space in the middle.
1280+ */
1281+ swidth = 1 ;
1282+ }
12701283else if (opt_border == 1 )
1271- swidth = 3 ;/* "header | data" */
1272- else
1273- swidth = 7 ;/* "| header | data |" */
1274-
1275- /* Wrap to maximum width */
1276- width = dwidth + swidth + hwidth ;
1277- if ((output_columns > 0 )&& (width > output_columns ))
12781284{
1279- dwidth = output_columns - hwidth - swidth ;
1280- width = output_columns ;
1285+ /*
1286+ * For border = 1, one for the pipe (|) in the middle
1287+ * between the two spaces.
1288+ */
1289+ swidth = 3 ;
12811290}
1291+ else
1292+ /*
1293+ * For border = 2, two more for the pipes (|) at the begging and
1294+ * at the end of the lines.
1295+ */
1296+ swidth = 7 ;
12821297
1283- /* Wrap to minimum width */
1298+ if ((opt_border < 2 )&&
1299+ ((hmultiline &&
1300+ (format == & pg_asciiformat_old ))||
1301+ (dmultiline &&
1302+ (format != & pg_asciiformat_old ))))
1303+ iwidth ++ ;/* for newline indicators */
1304+
1305+ min_width = hwidth + iwidth + swidth + 3 ;
1306+
1307+ /*
1308+ * Record header width
1309+ */
12841310if (!opt_tuples_only )
12851311{
1286- int delta = 1 + log10 (cont -> nrows )- width ;
1287-
1312+ /*
1313+ * Record number
1314+ */
1315+ unsignedint rwidth = 1 + log10 (cont -> nrows );
12881316if (opt_border == 0 )
1289- delta += 6 ; /* "* RECORD " */
1317+ rwidth += 9 ; /* "* RECORD " */
12901318else if (opt_border == 1 )
1291- delta += 10 ;/* "-[ RECORD ]" */
1319+ rwidth += 12 ;/* "-[ RECORD ]" */
12921320else
1293- delta += 15 ;/* "+-[ RECORD ]-+" */
1321+ rwidth += 15 ;/* "+-[ RECORD ]-+" */
12941322
1295- if (delta > 0 )
1296- dwidth += delta ;
1323+ if (rwidth > min_width )
1324+ min_width = rwidth ;
12971325}
1298- else if (dwidth < 3 )
1299- dwidth = 3 ;
1326+
1327+ /* Wrap to minimum width */
1328+ width = hwidth + iwidth + swidth + dwidth ;
1329+ if ((width < min_width )|| (output_columns < min_width ))
1330+ width = min_width - hwidth - iwidth - swidth ;
1331+ else if (output_columns > 0 )
1332+ /*
1333+ * Wrap to maximum width
1334+ */
1335+ width = output_columns - hwidth - iwidth - swidth ;
1336+
1337+ if ((width < dwidth )|| (dheight > 1 ))
1338+ {
1339+ dmultiline = true;
1340+ if ((opt_border == 0 )&&
1341+ (format != & pg_asciiformat_old ))
1342+ width -- ;/* for wrap indicators */
1343+ }
1344+ dwidth = width ;
13001345}
13011346
13021347/* print records */
@@ -1321,11 +1366,17 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
13211366/* Print record header (e.g. "[ RECORD N ]") above each record */
13221367if (i %cont -> ncolumns == 0 )
13231368{
1369+ unsignedint lhwidth = hwidth ;
1370+ if ((opt_border < 2 )&&
1371+ (hmultiline )&&
1372+ (format == & pg_asciiformat_old ))
1373+ lhwidth ++ ;/* for newline indicators */
1374+
13241375if (!opt_tuples_only )
1325- print_aligned_vertical_line (cont ,record ++ ,hwidth , dwidth ,
1326- pos ,fout );
1376+ print_aligned_vertical_line (cont ,record ++ ,lhwidth ,
1377+ dwidth , pos ,fout );
13271378else if (i != 0 || !cont -> opt -> start_table || opt_border == 2 )
1328- print_aligned_vertical_line (cont ,0 ,hwidth ,dwidth ,
1379+ print_aligned_vertical_line (cont ,0 ,lhwidth ,dwidth ,
13291380pos ,fout );
13301381}
13311382
@@ -1354,35 +1405,62 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
13541405/* Header (never wrapped so just need to deal with newlines) */
13551406if (!hcomplete )
13561407{
1357- int swidth ,
1358- twidth = hwidth + 1 ;
1359-
1360- fputs (hline ?format -> header_nl_left :" " ,fout );
1361- strlen_max_width (hlineptr [hline ].ptr ,& twidth ,
1408+ int swidth = hwidth ,
1409+ target_width = hwidth ;
1410+ /*
1411+ * Left spacer or new line indicator
1412+ */
1413+ if ((opt_border == 2 )||
1414+ (hmultiline && (format == & pg_asciiformat_old )))
1415+ fputs (hline ?format -> header_nl_left :" " ,fout );
1416+ /*
1417+ * Header text
1418+ */
1419+ strlen_max_width (hlineptr [hline ].ptr ,& target_width ,
13621420encoding );
13631421fprintf (fout ,"%-s" ,hlineptr [hline ].ptr );
13641422
1365- swidth = hwidth - twidth ;
1366- if (swidth > 0 )/* spacer */
1423+ /*
1424+ * Spacer
1425+ */
1426+ swidth -= target_width ;
1427+ if (swidth > 0 )
13671428fprintf (fout ,"%*s" ,swidth ," " );
13681429
1430+ /*
1431+ * New line indicator or separator's space
1432+ */
13691433if (hlineptr [hline + 1 ].ptr )
13701434{
13711435/* More lines after this one due to a newline */
1372- fputs (format -> header_nl_right ,fout );
1436+ if ((opt_border > 0 )||
1437+ (hmultiline && (format != & pg_asciiformat_old )))
1438+ fputs (format -> header_nl_right ,fout );
13731439hline ++ ;
13741440}
13751441else
13761442{
13771443/* This was the last line of the header */
1378- fputs (" " ,fout );
1444+ if ((opt_border > 0 )||
1445+ (hmultiline && (format != & pg_asciiformat_old )))
1446+ fputs (" " ,fout );
13791447hcomplete = 1 ;
13801448}
13811449}
13821450else
13831451{
1384- /* Header exhausted but more data for column */
1385- fprintf (fout ,"%*s" ,hwidth + 2 ,"" );
1452+ unsignedint swidth = hwidth + opt_border ;
1453+ if ((opt_border < 2 )&&
1454+ (hmultiline )&&
1455+ (format == & pg_asciiformat_old ))
1456+ swidth ++ ;
1457+
1458+ if ((opt_border == 0 )&&
1459+ (format != & pg_asciiformat_old )&&
1460+ (hmultiline ))
1461+ swidth ++ ;
1462+
1463+ fprintf (fout ,"%*s" ,swidth ," " );
13861464}
13871465
13881466/* Separator */
@@ -1401,13 +1479,18 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
14011479/* Data */
14021480if (!dcomplete )
14031481{
1404- int target_width ,
1482+ int target_width = dwidth ,
14051483bytes_to_output ,
1406- swidth ;
1484+ swidth = dwidth ;
14071485
1486+ /*
1487+ * Left spacer on wrap indicator
1488+ */
14081489fputs (!dcomplete && !offset ?" " :format -> wrap_left ,fout );
14091490
1410- target_width = dwidth ;
1491+ /*
1492+ * Data text
1493+ */
14111494bytes_to_output = strlen_max_width (dlineptr [dline ].ptr + offset ,
14121495& target_width ,encoding );
14131496fputnbytes (fout , (char * ) (dlineptr [dline ].ptr + offset ),
@@ -1416,31 +1499,47 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
14161499chars_to_output -= target_width ;
14171500offset += bytes_to_output ;
14181501
1419- /* spacer */
1420- swidth = dwidth - target_width ;
1421- if (swidth > 0 )
1422- fprintf (fout ,"%*s" ,swidth ,"" );
1502+ /* Spacer */
1503+ swidth -= target_width ;
14231504
14241505if (chars_to_output )
14251506{
14261507/* continuing a wrapped column */
1427- fputs (format -> wrap_right ,fout );
1508+ if ((opt_border > 1 )||
1509+ (dmultiline && (format != & pg_asciiformat_old )))
1510+ {
1511+ if (swidth > 0 )
1512+ fprintf (fout ,"%*s" ,swidth ," " );
1513+ fputs (format -> wrap_right ,fout );
1514+ }
14281515}
14291516else if (dlineptr [dline + 1 ].ptr )
14301517{
14311518/* reached a newline in the column */
1432- fputs (format -> nl_right ,fout );
1519+ if ((opt_border > 1 )||
1520+ (dmultiline && (format != & pg_asciiformat_old )))
1521+ {
1522+ if (swidth > 0 )
1523+ fprintf (fout ,"%*s" ,swidth ," " );
1524+ fputs (format -> nl_right ,fout );
1525+ }
14331526dline ++ ;
14341527offset = 0 ;
14351528chars_to_output = dlineptr [dline ].width ;
14361529}
14371530else
14381531{
14391532/* reached the end of the cell */
1440- fputs (" " ,fout );
1533+ if (opt_border > 1 )
1534+ {
1535+ if (swidth > 0 )
1536+ fprintf (fout ,"%*s" ,swidth ," " );
1537+ fputs (" " ,fout );
1538+ }
14411539dcomplete = 1 ;
14421540}
14431541
1542+ /* Right border */
14441543if (opt_border == 2 )
14451544fputs (dformat -> rightvrule ,fout );
14461545