Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit fbf8042

Browse files
committed
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 2489d76, 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
1 parent d98ed08 commit fbf8042

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/backend/rewrite/rewriteManip.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -719,11 +719,16 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
719719

720720
/*
721721
* Substitute newrelid for oldrelid in a Relid set
722+
*
723+
* Note: some extensions may pass a special varno such as INDEX_VAR for
724+
* oldrelid. bms_is_member won't like that, but we should tolerate it.
725+
* (Perhaps newrelid could also be a special varno, but there had better
726+
* not be a reason to inject that into a nullingrels or phrels set.)
722727
*/
723728
static Relids
724729
adjust_relid_set(Relids relids, int oldrelid, int newrelid)
725730
{
726-
if (bms_is_member(oldrelid, relids))
731+
if (!IS_SPECIAL_VARNO(oldrelid) && bms_is_member(oldrelid, relids))
727732
{
728733
/* Ensure we have a modifiable copy */
729734
relids = bms_copy(relids);

0 commit comments

Comments
 (0)