pgsql: Ignore PlaceHolderVars when looking up statistics

From: Richard Guo <rguo(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Ignore PlaceHolderVars when looking up statistics
Date: 2025-12-29 02:45:35
Message-ID: E1va3GH-003FBe-35@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-hackers

Ignore PlaceHolderVars when looking up statistics

When looking up statistical data about an expression, we failed to
look through PlaceHolderVar nodes, treating them as opaque. This
could prevent us from matching an expression to base columns, index
expressions, or extended statistics, as examine_variable() relies on
strict structural matching.

As a result, queries involving PlaceHolderVar nodes often fell back to
default selectivity estimates, potentially leading to poor plan
choices.

This patch updates examine_variable() to strip PlaceHolderVars before
analysis. This is safe during estimation because PlaceHolderVars are
transparent for the purpose of statistics lookup: they do not alter
the value distribution of the underlying expression.

To minimize performance overhead on this hot path, a lightweight
walker first checks for the presence of PlaceHolderVars. The more
expensive mutator is invoked only when necessary.

There is one ensuing plan change in the regression tests, which is
expected and demonstrates the fix: the rowcount estimate becomes much
more accurate with this patch.

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(at)bitmoe(dot)com>
Author: Richard Guo <guofenglinux(at)gmail(dot)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/7e9f852a79fe19d4d0f18aabc32a620797fb676e

Modified Files
--------------
src/backend/utils/adt/selfuncs.c | 93 +++++++++++++++++++++++++++++++++-----
src/test/regress/expected/join.out | 27 ++++++++++-
src/test/regress/sql/join.sql | 10 ++++
3 files changed, 116 insertions(+), 14 deletions(-)

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message Thomas Munro 2025-12-29 02:50:33 pgsql: Fix Mkvcbuild.pm builds of test_cloexec.c.
Previous Message Richard Guo 2025-12-29 02:45:34 pgsql: Strip PlaceHolderVars from index operands

Browse pgsql-hackers by date

  From Date Subject
Next Message Chao Li 2025-12-29 02:57:14 Re: Introduce ENDLIST to terminate multiline makefile lists
Previous Message Henson Choi 2025-12-29 02:35:12 Re: RFC: PostgreSQL Storage I/O Transformation Hooks