pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Richard Guo <rguo@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Strip PlaceHolderVars from index operands
Date: Mon, 29 Dec 2025 02:45:34 +0000
Message-ID: <E1va3GH-003FBc-31@gemulon.postgresql.org> (raw)

Strip PlaceHolderVars from index operands

When pulling up a subquery, we may need to wrap its targetlist items
in PlaceHolderVars to enforce separate identity or as a result of
outer joins.  However, this causes any upper-level WHERE clauses
referencing these outputs to contain PlaceHolderVars, which prevents
indxpath.c from recognizing that they could be matched to index
columns or index expressions, potentially affecting the planner's
ability to use indexes.

To fix, explicitly strip PlaceHolderVars from index operands.  A
PlaceHolderVar appearing in a relation-scan-level expression is
effectively a no-op.  Nevertheless, to play it safe, we strip only
PlaceHolderVars that are not marked nullable.

The stripping is performed recursively to handle cases where
PlaceHolderVars are nested or interleaved with other node types.  To
minimize performance impact, we first use a lightweight walker to
check for the presence of strippable PlaceHolderVars.  The expensive
mutator is invoked only if a candidate is found, avoiding unnecessary
memory allocation and tree copying in the common case where no
PlaceHolderVars are present.

Back-patch to v18.  Although this issue exists before that, changes in
this version made it common enough to notice.  Given the lack of field
reports for older versions, I am not back-patching further.

Reported-by: Haowu Ge <gehaowu@bitmoe.com>
Author: Richard Guo <guofenglinux@gmail.com>
Discussion: https://postgr.es/m/62af586c-c270-44f3-9c5e-02c81d537e3d.gehaowu@bitmoe.com
Backpatch-through: 18

Branch
------
REL_18_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/b4cf7442058f0b0f525b5df36f4bbfc73a97ed0c

Modified Files
--------------
src/backend/optimizer/path/indxpath.c      | 109 +++++++++++++++++++++++++++--
src/backend/optimizer/plan/createplan.c    |  14 ++--
src/include/optimizer/paths.h              |   1 +
src/test/regress/expected/groupingsets.out |  95 +++++++++++++++++++++++++
src/test/regress/sql/groupingsets.sql      |  46 ++++++++++++
5 files changed, 256 insertions(+), 9 deletions(-)



view thread (2+ messages)

Message-ID: <E1va3GH-003FBc-31@gemulon.postgresql.org>
Permalink:  ../E1va3GH-003FBc-31@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1va3GH-003FBc-31@gemulon.postgresql.org

 · 

reply

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: rguo@postgresql.org, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Strip PlaceHolderVars from index operands
  In-Reply-To: <E1va3GH-003FBc-31@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