1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

Re-allow INDEX_VAR as rt_index in ChangeVarNodes().

Apparently some extensions are in the habit of calling
ChangeVarNodes() with INDEX_VAR as the rt_index to replace.
That worked before 2489d76c4, at least as long as there were
not PlaceHolderVars in the expression; but now it fails
because bms_is_member spits up.  Add a test to avoid that.

Per report from Anton Melnikov, though this is not his
proposed patch.

Discussion: https://postgr.es/m/5b370a46-f6d2-373d-9dbc-0d55250e82c1@inbox.ru
This commit is contained in:
Tom Lane
2023-06-08 13:11:49 -04:00
parent d98ed080bb
commit fbf80421ea

View File

@ -719,11 +719,16 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
/*
* Substitute newrelid for oldrelid in a Relid set
*
* Note: some extensions may pass a special varno such as INDEX_VAR for
* oldrelid. bms_is_member won't like that, but we should tolerate it.
* (Perhaps newrelid could also be a special varno, but there had better
* not be a reason to inject that into a nullingrels or phrels set.)
*/
static Relids
adjust_relid_set(Relids relids, int oldrelid, int newrelid)
{
if (bms_is_member(oldrelid, relids))
if (!IS_SPECIAL_VARNO(oldrelid) && bms_is_member(oldrelid, relids))
{
/* Ensure we have a modifiable copy */
relids = bms_copy(relids);