Fix add_rte_to_flat_rtable() for recent feature additions.

The TABLESAMPLE and row security patches each overlooked this function,
though their errors of omission were opposite: RLS failed to zero out the
securityQuals field, leading to wasteful copying of useless expression
trees in finished plans, while TABLESAMPLE neglected to add a comment
saying that it intentionally *isn't* deleting the tablesample subtree.
There probably should be a similar comment about ctename, too.

Back-patch as appropriate.
This commit is contained in:
Tom Lane 2015-07-21 20:03:58 -04:00
parent c6fbe6d6fb
commit 46d0a9bfac
1 changed files with 7 additions and 5 deletions

View File

@ -372,10 +372,11 @@ flatten_rtes_walker(Node *node, PlannerGlobal *glob)
*
* In the flat rangetable, we zero out substructure pointers that are not
* needed by the executor; this reduces the storage space and copying cost
* for cached plans. We keep only the alias and eref Alias fields, which are
* needed by EXPLAIN, and the selectedCols, insertedCols and updatedCols
* bitmaps, which are needed for executor-startup permissions checking and for
* trigger event checking.
* for cached plans. We keep only the tablesample field (which we'd otherwise
* have to put in the plan tree, anyway); the ctename, alias and eref Alias
* fields, which are needed by EXPLAIN; and the selectedCols, insertedCols and
* updatedCols bitmaps, which are needed for executor-startup permissions
* checking and for trigger event checking.
*/
static void
add_rte_to_flat_rtable(PlannerGlobal *glob, RangeTblEntry *rte)
@ -395,6 +396,7 @@ add_rte_to_flat_rtable(PlannerGlobal *glob, RangeTblEntry *rte)
newrte->ctecoltypes = NIL;
newrte->ctecoltypmods = NIL;
newrte->ctecolcollations = NIL;
newrte->securityQuals = NIL;
glob->finalrtable = lappend(glob->finalrtable, newrte);
@ -1199,7 +1201,7 @@ set_customscan_references(PlannerInfo *root,
}
/* Adjust child plan-nodes recursively, if needed */
foreach (lc, cscan->custom_plans)
foreach(lc, cscan->custom_plans)
{
lfirst(lc) = set_plan_refs(root, (Plan *) lfirst(lc), rtoffset);
}