aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/optimizer/util/relnode.c1
-rw-r--r--src/backend/utils/adt/selfuncs.c42
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,