pgsql: Remove inadequate assertion check in CTE inlining.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Remove inadequate assertion check in CTE inlining.
Date: 2022-04-21 21:59:04
Message-ID: E1nhepM-000UTh-Fu@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Remove inadequate assertion check in CTE inlining.

inline_cte() expected to find exactly as many references to the
target CTE as its cterefcount indicates. While that should be
accurate for the tree as emitted by the parser, there are some
optimizations that occur upstream of here that could falsify it,
notably removal of unused subquery output expressions.

Trying to make the accounting 100% accurate seems expensive and
doomed to future breakage. It's not really worth it, because
all this code is protecting is downstream assumptions that every
referenced CTE has a plan. Let's convert those assertions to
regular test-and-elog just in case there's some actual problem,
and then drop the failing assertion.

Per report from Tomas Vondra (thanks also to Richard Guo for
analysis). Back-patch to v12 where the faulty code came in.

Discussion: https://postgr.es/m/29196a1e-ed47-c7ca-9be2-b1c636816183@enterprisedb.com

Branch
------
REL_12_STABLE

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

Modified Files
--------------
src/backend/optimizer/path/allpaths.c | 3 +-
src/backend/optimizer/plan/createplan.c | 3 +-
src/backend/optimizer/plan/subselect.c | 8 -----
src/include/nodes/pathnodes.h | 3 +-
src/test/regress/expected/with.out | 64 +++++++++++++++++++++++++++++++++
src/test/regress/sql/with.sql | 31 ++++++++++++++++
6 files changed, 101 insertions(+), 11 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message David Rowley 2022-04-22 04:02:42 pgsql: Fix performance regression in tuplesort specializations
Previous Message Tom Lane 2022-04-21 21:12:57 pgsql: Fix missed cases in libpq's error handling.