]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
psql: Fix expanded aligned output
authorMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:59 +0000 (14:37 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:59 +0000 (14:37 +0900)
When a table's columns are narrower than the record header line, the
expanded aligned format produced misaligned output because the data
column width was not adjusted to match the record header width, leading
to output like:
+-[ RECORD 1 ]-+
| a | 10 |
| b | 20 |
+---+----+

This commit adjusts the output so as the column width match with the
header line, giving:
+-[ RECORD 1 ]-+
| a | 10       |
| b | 20       |
+---+----------+

Author: Pavel Stehule <pavel.stehule@gmail.com>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://postgr.es/m/CAFj8pRCzGpsr9zTHbtTd4mGh2YPJqOEgLgt8JLiopuYA9_1xGw@mail.gmail.com
Backpatch-through: 14

src/fe_utils/print.c
src/test/regress/expected/psql.out
src/test/regress/sql/psql.sql

index 7af1ccb6b562bd6e75839d22b3e159c9a59168e8..61c1702233a25efc2978d155ce233a1092c5ff4b 100644 (file)
@@ -1458,9 +1458,10 @@ print_aligned_vertical(const printTableContent *cont,
        }
 
        /*
-        * Calculate available width for data in wrapped mode
+        * Determine data column width: fit output width in wrapped mode, or
+        * ensure alignment with the record header line in aligned mode.
         */
-       if (cont->opt->format == PRINT_WRAPPED)
+       if (cont->opt->format == PRINT_WRAPPED || cont->opt->format == PRINT_ALIGNED)
        {
                unsigned int swidth,
                                        rwidth = 0,
@@ -1532,7 +1533,7 @@ print_aligned_vertical(const printTableContent *cont,
                        if (width < rwidth)
                                width = rwidth;
 
-                       if (output_columns > 0)
+                       if (cont->opt->format == PRINT_WRAPPED && output_columns > 0)
                        {
                                unsigned int min_width;
 
index c28548da4da1a53389322848fdd065832b0d5774..1c6284babf01cd13adb064b7c7371eae7cfda5c7 100644 (file)
@@ -2718,6 +2718,32 @@ execute q;
 +------------------+-------------------+
 
 deallocate q;
+-- expanded output with short-width columns
+\pset border 2
+\pset expanded on
+create table psql_short_tab(a int, b int);
+insert into psql_short_tab values(10,20),(30,40);
+\pset format aligned
+select * from psql_short_tab;
++-[ RECORD 1 ]-+
+| a | 10       |
+| b | 20       |
++-[ RECORD 2 ]-+
+| a | 30       |
+| b | 40       |
++---+----------+
+
+\pset format wrapped
+select * from psql_short_tab;
++-[ RECORD 1 ]-+
+| a | 10       |
+| b | 20       |
++-[ RECORD 2 ]-+
+| a | 30       |
+| b | 40       |
++---+----------+
+
+drop table psql_short_tab;
 \pset linestyle ascii
 \pset border 1
 -- support table for output-format tests (useful to create a footer)
index 25ae4507f13a77f1e7055cbda2f5740d72d47cdb..20194f8a28d92445e90e82e4f42e08feb1d37fb1 100644 (file)
@@ -442,6 +442,17 @@ execute q;
 
 deallocate q;
 
+-- expanded output with short-width columns
+\pset border 2
+\pset expanded on
+create table psql_short_tab(a int, b int);
+insert into psql_short_tab values(10,20),(30,40);
+\pset format aligned
+select * from psql_short_tab;
+\pset format wrapped
+select * from psql_short_tab;
+drop table psql_short_tab;
+
 \pset linestyle ascii
 \pset border 1