Subject: Re: Remove no-op PlaceHolderVars

From: Tom Lane <[email-masked]>
Date: Thu, 15 Jan 2026 22:37:28 -0500

Richard Guo <[email-masked]> writes:
> While fixing some performance issues caused by PHVs recently, it
> struck me again that we should be removing "no-op" PHVs whenever
> possible, because PHVs can be optimization barriers in several cases.

My immediate reaction is "how sure are you that they're no-ops"?
I recall that there are places where we intentionally insert PHVs
to preserve the separate identity of the contained expression
(so that, for example, it can be matched to a subquery output
later).

> I still do not have a good idea for ensuring that removing the PHV
> wrapper does not break the expression tree invariants.  But maybe we
> can use a conservative approach: we only strip the PHV if the
> contained expression is known to be safe (for example, a simple Var).

Do we generate a PHV at all in that case?  Seems like we could
deal with that by adding to the Var's varnullingrels instead of
making a wrapper node.

			regards, tom lane

---

From: Richard Guo <[email-masked]>
Date: Fri, 16 Jan 2026 15:21:06 +0900

> (so that, for example, it can be matched to a subquery output

The new phpreserved flag is used for that purpose, as explained in the
commit message and the code comments.

> deal with that by adding to the Var's varnullingrels instead of

The Var can be a reference to something outside the subquery being
pulled up.  If it is a reference to the non-nullable side, we'll have
to wrap it in a PHV to ensure that it is forced to null when the outer
join should do so.

- Richard