]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
psql: Fix expanded aligned output
authorMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:38:00 +0000 (14:38 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 8 Jun 2026 05:38:00 +0000 (14:38 +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 fe676a971b93a1d9c22fbb2b813861197a87dfdc..94ac668625336a2b862784c03f772b5c85f62105 100644 (file)
@@ -1415,9 +1415,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,
@@ -1489,7 +1490,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 75488480542e0949bf951271b7fbac9d5b9682e7..f36f6d41571465c6a4148e1edb157f7b07d66e00 100644 (file)
@@ -2686,6 +2686,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 1eef2a62de9e439ff8eac8f8a89d1040ff34d7fc..f2e5995bd170ad84af718659942af36387479b75 100644 (file)
@@ -428,6 +428,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