]> granicus.if.org Git - postgresql/commit
Suppress Append and MergeAppend plan nodes that have a single child.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Mar 2019 19:42:35 +0000 (15:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Mar 2019 19:42:35 +0000 (15:42 -0400)
commit8edd0e79460b414b1d971895312e549e95e12e4f
tree6c61de6cd6a33b08e68cd225a58d3ae7530f5268
parentf21668f328c864c6b9290f39d41774cb2422f98e
Suppress Append and MergeAppend plan nodes that have a single child.

If there's only one child relation, the Append or MergeAppend isn't
doing anything useful, and can be elided.  It does have a purpose
during planning though, which is to serve as a buffer between parent
and child Var numbering.  Therefore we keep it all the way through
to setrefs.c, and get rid of it only after fixing references in the
plan level(s) above it.  This works largely the same as setrefs.c's
ancient hack to get rid of no-op SubqueryScan nodes, and can even
share some code with that.

Note the change to make setrefs.c use apply_tlist_labeling rather than
ad-hoc code.  This has the effect of propagating the child's resjunk
and ressortgroupref labels, which formerly weren't propagated when
removing a SubqueryScan.  Doing that is demonstrably necessary for
the [Merge]Append cases, and seems harmless for SubqueryScan, if only
because trivial_subqueryscan is afraid to collapse cases where the
resjunk marking differs.  (I suspect that restriction could now be
removed, though it's unclear that it'd make any new matches possible,
since the outer query can't have references to a child resjunk column.)

David Rowley, reviewed by Alvaro Herrera and Tomas Vondra

Discussion: https://postgr.es/m/CAKJS1f_7u8ATyJ1JGTMHFoKDvZdeF-iEBhs+sM_SXowOr9cArg@mail.gmail.com
12 files changed:
contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/sql/postgres_fdw.sql
src/backend/executor/execAmi.c
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/setrefs.c
src/backend/optimizer/util/pathnode.c
src/test/regress/expected/inherit.out
src/test/regress/expected/partition_join.out
src/test/regress/expected/partition_prune.out
src/test/regress/expected/rowsecurity.out
src/test/regress/expected/union.out