aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/rewrite/rewriteDefine.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 995afe5509e..1cd340f978a 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.93 2004/02/10 01:55:25 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.94 2004/05/18 22:49:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -33,7 +33,8 @@
#include "utils/syscache.h"
-static void setRuleCheckAsUser(Query *qry, AclId userid);
+static void setRuleCheckAsUser_Query(Query *qry, AclId userid);
+static void setRuleCheckAsUser_Expr(Node *node, AclId userid);
static bool setRuleCheckAsUser_walker(Node *node, AclId *context);
@@ -440,13 +441,15 @@ DefineQueryRewrite(RuleStmt *stmt)
* We want the rule's table references to be checked as though by the
* rule owner, not the user referencing the rule. Therefore, scan
* through the rule's rtables and set the checkAsUser field on all
- * rtable entries.
+ * rtable entries. We have to look at event_qual as well, in case
+ * it contains sublinks.
*/
foreach(l, action)
{
query = (Query *) lfirst(l);
- setRuleCheckAsUser(query, GetUserId());
+ setRuleCheckAsUser_Query(query, GetUserId());
}
+ setRuleCheckAsUser_Expr(event_qual, GetUserId());
/* discard rule if it's null action and not INSTEAD; it's a no-op */
if (action != NIL || is_instead)
@@ -492,7 +495,7 @@ DefineQueryRewrite(RuleStmt *stmt)
}
/*
- * setRuleCheckAsUser
+ * setRuleCheckAsUser_Query
* Recursively scan a query and set the checkAsUser field to the
* given userid in all rtable entries.
*
@@ -504,7 +507,7 @@ DefineQueryRewrite(RuleStmt *stmt)
* them always.
*/
static void
-setRuleCheckAsUser(Query *qry, AclId userid)
+setRuleCheckAsUser_Query(Query *qry, AclId userid)
{
List *l;
@@ -516,7 +519,7 @@ setRuleCheckAsUser(Query *qry, AclId userid)
if (rte->rtekind == RTE_SUBQUERY)
{
/* Recurse into subquery in FROM */
- setRuleCheckAsUser(rte->subquery, userid);
+ setRuleCheckAsUser_Query(rte->subquery, userid);
}
else
rte->checkAsUser = userid;
@@ -532,6 +535,12 @@ setRuleCheckAsUser(Query *qry, AclId userid)
/*
* Expression-tree walker to find sublink queries
*/
+static void
+setRuleCheckAsUser_Expr(Node *node, AclId userid)
+{
+ (void) setRuleCheckAsUser_walker(node, &userid);
+}
+
static bool
setRuleCheckAsUser_walker(Node *node, AclId *context)
{
@@ -541,7 +550,7 @@ setRuleCheckAsUser_walker(Node *node, AclId *context)
{
Query *qry = (Query *) node;
- setRuleCheckAsUser(qry, *context);
+ setRuleCheckAsUser_Query(qry, *context);
return false;
}
return expression_tree_walker(node, setRuleCheckAsUser_walker,