diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index e9e30617ad..a843ed3ebd 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -549,17 +549,26 @@ add_rte_to_flat_rtable(PlannerGlobal *glob, List *rtepermlist, glob->relationOids = lappend_oid(glob->relationOids, newrte->relid); /* - * Add the RTEPermissionInfo, if any, corresponding to this RTE to the - * flattened global list. Also update the perminfoindex in newrte to - * reflect the RTEPermissionInfo's position in this other list. + * Add a copy of the RTEPermissionInfo, if any, corresponding to this RTE + * to the flattened global list. */ if (rte->perminfoindex > 0) { RTEPermissionInfo *perminfo; + RTEPermissionInfo *newperminfo; + /* Get the existing one from this query's rtepermlist. */ perminfo = GetRTEPermissionInfo(rtepermlist, newrte); - glob->finalrtepermlist = lappend(glob->finalrtepermlist, perminfo); - newrte->perminfoindex = list_length(glob->finalrtepermlist); + + /* + * Add a new one to finalrtepermlist and copy the contents of the + * existing one into it. Note that AddRTEPermissionInfo() also + * updates newrte->perminfoindex to point to newperminfo in + * finalrtepermlist. + */ + newrte->perminfoindex = 0; /* expected by AddRTEPermissionInfo() */ + newperminfo = AddRTEPermissionInfo(&glob->finalrtepermlist, newrte); + memcpy(newperminfo, perminfo, sizeof(RTEPermissionInfo)); } }