From: David Rowley <drowley@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Teach UNION planner to remove dummy inputs
Date: Sat, 04 Oct 2025 01:30:48 +0000
Message-ID: <E1v4r6m-001Lgx-1h@gemulon.postgresql.org> (raw)
Teach UNION planner to remove dummy inputs
This adjusts UNION planning so that the planner produces more optimal
plans when one or more of the UNION's subqueries have been proven to be
empty (a dummy rel).
If any of the inputs are empty, then that input can be removed from the
Append / MergeAppend. Previously, a const-false "Result" node would
appear to represent this. Removing empty inputs has a few extra
benefits when only 1 union child remains as it means the Append or
MergeAppend can be removed in setrefs.c, making the plan slightly faster
to execute. Also, we can provide better n_distinct estimates by looking
at the sole remaining input rel's statistics.
Author: David Rowley <dgrowleyml@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAApHDvri53PPF76c3M94_QNWbJfXjyCnjXuj_2=LYM-0m8WZtw@mail.gmail.com
Branch
------
master
Details
-------
https://git.postgresql.org/pg/commitdiff/03d40e4b523b2075c198aa89d9445ea8297f8eca
Modified Files
--------------
src/backend/optimizer/prep/prepunion.c | 56 ++++++++++++++++++++++++++++------
src/test/regress/expected/union.out | 51 +++++++++++++++++++++++++++++++
src/test/regress/sql/union.sql | 27 ++++++++++++++++
3 files changed, 125 insertions(+), 9 deletions(-)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: drowley@postgresql.org, pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: Teach UNION planner to remove dummy inputs
In-Reply-To: <E1v4r6m-001Lgx-1h@gemulon.postgresql.org>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox