pgsql: Fix unsafe RTE_GROUP removal in simplify_EXISTS_query - Mailing list pgsql-committers

From Richard Guo
Subject pgsql: Fix unsafe RTE_GROUP removal in simplify_EXISTS_query
Date
Msg-id E1vv4Rw-0012Ro-0c@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix unsafe RTE_GROUP removal in simplify_EXISTS_query

When simplify_EXISTS_query removes the GROUP BY clauses from an EXISTS
subquery, it previously deleted the RTE_GROUP RTE directly from the
subquery's range table.

This approach is dangerous because deleting an RTE from the middle of
the rtable list shifts the index of any subsequent RTE, which can
silently corrupt any Var nodes in the query tree that reference those
later relations.  (Currently, this direct removal has not caused
problems because the RTE_GROUP RTE happens to always be the last entry
in the rtable list.  However, relying on that is extremely fragile and
seems like trouble waiting to happen.)

Instead of deleting the RTE_GROUP RTE, this patch converts it in-place
to be RTE_RESULT type and clears its groupexprs list.  This preserves
the length and indexing of the rtable list, ensuring all Var
references remain intact.

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

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/77c7a17a6e5fefcd55edb6b47fc462a059b983dc

Modified Files
--------------
src/backend/optimizer/plan/subselect.c | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)


pgsql-committers by date:

Previous
From: John Naylor
Date:
Subject: pgsql: Fix USE_SLICING_BY_8_CRC32C builds on x86
Next
From: Tom Lane
Date:
Subject: pgsql: Stabilize output of new isolation test insert-conflict-do-update