diff options
-rw-r--r-- | src/backend/optimizer/util/relnode.c | 1 | ||||
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 42 |
2 files changed, 16 insertions, 27 deletions
diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 75bc20c7c98..0a5632699d6 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -500,7 +500,6 @@ find_join_rel(PlannerInfo *root, Relids relids) * * Otherwise these fields are left invalid, so GetForeignJoinPaths will not be * called for the join relation. - * */ static void set_foreign_rel_properties(RelOptInfo *joinrel, RelOptInfo *outer_rel, diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 57de51f0db2..4e4888dde4d 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -5080,6 +5080,18 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, */ ListCell *ilist; ListCell *slist; + Oid userid; + + /* + * Determine the user ID to use for privilege checks: either + * onerel->userid if it's set (e.g., in case we're accessing the table + * via a view), or the current user otherwise. + * + * If we drill down to child relations, we keep using the same userid: + * it's going to be the same anyway, due to how we set up the relation + * tree (q.v. build_simple_rel). + */ + userid = OidIsValid(onerel->userid) ? onerel->userid : GetUserId(); foreach(ilist, onerel->indexlist) { @@ -5150,19 +5162,11 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, { /* Get index's table for permission check */ RangeTblEntry *rte; - Oid userid; rte = planner_rt_fetch(index->rel->relid, root); Assert(rte->rtekind == RTE_RELATION); /* - * Use onerel->userid if it's set, in case - * we're accessing the table via a view. - */ - userid = OidIsValid(onerel->userid) ? - onerel->userid : GetUserId(); - - /* * For simplicity, we insist on the whole * table being selectable, rather than trying * to identify which column(s) the index @@ -5212,9 +5216,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, rte = planner_rt_fetch(varno, root); Assert(rte->rtekind == RTE_RELATION); - userid = OidIsValid(onerel->userid) ? - onerel->userid : GetUserId(); - vardata->acl_ok = rte->securityQuals == NIL && (pg_class_aclcheck(rte->relid, @@ -5281,8 +5282,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, /* found a match, see if we can extract pg_statistic row */ if (equal(node, expr)) { - Oid userid; - /* * XXX Not sure if we should cache the tuple somewhere. * Now we just create a new copy every time. @@ -5293,13 +5292,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, vardata->freefunc = ReleaseDummy; /* - * Use onerel->userid if it's set, in case we're accessing - * the table via a view. - */ - userid = OidIsValid(onerel->userid) ? - onerel->userid : GetUserId(); - - /* * For simplicity, we insist on the whole table being * selectable, rather than trying to identify which * column(s) the statistics object depends on. Also @@ -5345,9 +5337,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, rte = planner_rt_fetch(varno, root); Assert(rte->rtekind == RTE_RELATION); - userid = OidIsValid(onerel->userid) ? - onerel->userid : GetUserId(); - vardata->acl_ok = rte->securityQuals == NIL && (pg_class_aclcheck(rte->relid, @@ -5486,9 +5475,10 @@ examine_simple_variable(PlannerInfo *root, Var *var, rte = planner_rt_fetch(varno, root); Assert(rte->rtekind == RTE_RELATION); - userid = OidIsValid(onerel->userid) ? - onerel->userid : GetUserId(); - + /* + * Fine to use the same userid as it's the same in all + * relations of a given inheritance tree. + */ vardata->acl_ok = rte->securityQuals == NIL && ((pg_class_aclcheck(rte->relid, userid, |