From: Tom Lane Date: Wed, 22 Jul 2015 00:03:58 +0000 (-0400) Subject: Fix add_rte_to_flat_rtable() for recent feature additions. X-Git-Tag: REL9_5_ALPHA2~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=41ae3b74d987d5d42f2c432812285c7d12d6f4c1;p=postgresql 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. --- diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 46d84d39a0..258e541754 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -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); }