pgsql: Fix join removal when Vars reference the removed join via its al - Mailing list pgsql-committers

From Richard Guo
Subject pgsql: Fix join removal when Vars reference the removed join via its al
Date
Msg-id E1x7vT0-00000000PQN-2STH@gemulon.postgresql.org
Whole thread
List pgsql-committers
Fix join removal when Vars reference the removed join via its alias

When a join has an alias, the parser marks every Var referenced
through that alias with the join's RT index as its syntactic referent
(varnosyn), even though varno points at the underlying base relation.
Since commit 2ebf25e7d, join removal strips the removed relids from
the query tree using ChangeVarNodes() with INVALID_VAR, which asserts
that the relid doesn't appear in any field identifying a single
relation.  A varnosyn that names the removed join violates that, so a
query like

    SELECT j.x FROM (t1 s(x) LEFT JOIN t2 ON s.x = t2.a) j;

with t2.a unique fails an assertion.  In non-assert builds, varnosyn
is silently set to INVALID_VAR.

Such syntactic references are still valid after the removal: the join
is only taken out of the jointree, and its RTE remains in the
rangetable through to the finished plan.  So, when deleting a relid,
leave varnosyn unchanged, as join removal did before 2ebf25e7d.

Back-patch to v16, as with commit 2ebf25e7d.

Author: Richard Guo <guofenglinux@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAMbWs484SQSdzWTgZYKvwtuC6J4m7acw0LfBjp3aWPvav7gC_w@mail.gmail.com
Backpatch-through: 16

Branch
------
master

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

Modified Files
--------------
src/backend/rewrite/rewriteManip.c | 11 ++++++-----
src/test/regress/expected/join.out | 12 ++++++++++++
src/test/regress/sql/join.sql      |  4 ++++
3 files changed, 22 insertions(+), 5 deletions(-)


pgsql-committers by date:

Previous
From: Richard Guo
Date:
Subject: pgsql: Fix preprocessing of PHV copies pushed down into subqueries
Next
From: Alexander Korotkov
Date:
Subject: pgsql: JSON_TABLE: propagate table-level ON ERROR to columns per SQL st