]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
psql: Fix expanded aligned output
authorMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:51 +0000 (14:37 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:37:51 +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 f2dd52003c184cc8a06f43ce3a9eb11972dba48e..bfbaf094d7ecc64fb82e3ed263dc1a8d5226211f 100644 (file)
@@ -1443,9 +1443,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,
@@ -1517,7 +1518,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 c8f3932edf094fd4e9ebed41a44774278acd6a4d..42635a56a06c30c433cf3208b6d613921cbd1aa7 100644 (file)
@@ -2854,6 +2854,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 dcdbd4fc020917f8e1a3d5f61a40fec073d4f567..e51767b3e2f6847cedf6099e33bee9369aa25ef1 100644 (file)
@@ -499,6 +499,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