]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
psql: Fix expanded aligned output
authorMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:57 +0000 (14:37 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:57 +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 d6c4d78f98161cf54af8a1e72e45ec7f7cc0e578..92b5df745230c3f7a55fc8c46dec2d84d8659e5a 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 7e39eef6ec0e539b6dc7a23c5e764a646f02d1d9..499394cbe249e65417b1055a2ddb08c05176078e 100644 (file)
@@ -2723,6 +2723,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 f8ad7af5a3a84ad1c4195645ed4f8a99191f369c..e4b09ac76e3b289ed1136e2c731fd7133e1efabf 100644 (file)
@@ -446,6 +446,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