diff options
Diffstat (limited to 'src/bin/psql/print.c')
-rw-r--r-- | src/bin/psql/print.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index e103d5b0841..97f9c2f1690 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -1265,7 +1265,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout) /* * Deal with the pager here instead of in printTable(), because we could * get here via print_aligned_text() in expanded auto mode, and so we have - * to recalcuate the pager requirement based on vertical output. + * to recalculate the pager requirement based on vertical output. */ IsPagerNeeded(cont, 0, true, &fout, &is_pager); @@ -1400,7 +1400,8 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout) /* Determine width required for record header lines */ if (!opt_tuples_only) { - rwidth = 1 + log10(cont->nrows); + if (cont->nrows > 0) + rwidth = 1 + (int) log10(cont->nrows); if (opt_border == 0) rwidth += 9; /* "* RECORD " */ else if (opt_border == 1) @@ -1412,33 +1413,46 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout) /* We might need to do the rest of the calculation twice */ for (;;) { - unsigned int width, - min_width; + unsigned int width; /* Total width required to not wrap data */ width = hwidth + swidth + dwidth; + /* ... and not the header lines, either */ + if (width < rwidth) + width = rwidth; - /* Minimum acceptable width: room for just 3 columns of data */ - min_width = hwidth + swidth + 3; - /* ... but not less than what the record header lines need */ - if (rwidth > min_width) - min_width = rwidth; - - if (width < min_width || - (output_columns > 0 && output_columns < min_width)) - { - /* Set data width to match min_width */ - newdwidth = min_width - hwidth - swidth; - } - else if (output_columns > 0) + if (output_columns > 0) { - /* Set data width to match output_columns */ - newdwidth = output_columns - hwidth - swidth; + unsigned int min_width; + + /* Minimum acceptable width: room for just 3 columns of data */ + min_width = hwidth + swidth + 3; + /* ... but not less than what the record header lines need */ + if (min_width < rwidth) + min_width = rwidth; + + if (output_columns >= width) + { + /* Plenty of room, use native data width */ + /* (but at least enough for the record header lines) */ + newdwidth = width - hwidth - swidth; + } + else if (output_columns < min_width) + { + /* Set data width to match min_width */ + newdwidth = min_width - hwidth - swidth; + } + else + { + /* Set data width to match output_columns */ + newdwidth = output_columns - hwidth - swidth; + } } else { - /* Use native data width */ - newdwidth = dwidth; + /* Don't know the wrap limit, so use native data width */ + /* (but at least enough for the record header lines) */ + newdwidth = width - hwidth - swidth; } /* |