Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 07f2b76

Browse files
committed
setRuleCheckAsUser has to be applied to any subqueries appearing in a
rule's event_qual, not only to the rule's action. Per example from Arturs Zoldners.
1 parent 4c82cb9 commit 07f2b76

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

src/backend/rewrite/rewriteDefine.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.93 2004/02/10 01:55:25 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.94 2004/05/18 22:49:51 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -33,7 +33,8 @@
3333
#include "utils/syscache.h"
3434

3535

36-
static void setRuleCheckAsUser(Query *qry, AclId userid);
36+
static void setRuleCheckAsUser_Query(Query *qry, AclId userid);
37+
static void setRuleCheckAsUser_Expr(Node *node, AclId userid);
3738
static bool setRuleCheckAsUser_walker(Node *node, AclId *context);
3839

3940

@@ -440,13 +441,15 @@ DefineQueryRewrite(RuleStmt *stmt)
440441
* We want the rule's table references to be checked as though by the
441442
* rule owner, not the user referencing the rule. Therefore, scan
442443
* through the rule's rtables and set the checkAsUser field on all
443-
* rtable entries.
444+
* rtable entries. We have to look at event_qual as well, in case
445+
* it contains sublinks.
444446
*/
445447
foreach(l, action)
446448
{
447449
query = (Query *) lfirst(l);
448-
setRuleCheckAsUser(query, GetUserId());
450+
setRuleCheckAsUser_Query(query, GetUserId());
449451
}
452+
setRuleCheckAsUser_Expr(event_qual, GetUserId());
450453

451454
/* discard rule if it's null action and not INSTEAD; it's a no-op */
452455
if (action != NIL || is_instead)
@@ -492,7 +495,7 @@ DefineQueryRewrite(RuleStmt *stmt)
492495
}
493496

494497
/*
495-
* setRuleCheckAsUser
498+
* setRuleCheckAsUser_Query
496499
* Recursively scan a query and set the checkAsUser field to the
497500
* given userid in all rtable entries.
498501
*
@@ -504,7 +507,7 @@ DefineQueryRewrite(RuleStmt *stmt)
504507
* them always.
505508
*/
506509
static void
507-
setRuleCheckAsUser(Query *qry, AclId userid)
510+
setRuleCheckAsUser_Query(Query *qry, AclId userid)
508511
{
509512
List *l;
510513

@@ -516,7 +519,7 @@ setRuleCheckAsUser(Query *qry, AclId userid)
516519
if (rte->rtekind == RTE_SUBQUERY)
517520
{
518521
/* Recurse into subquery in FROM */
519-
setRuleCheckAsUser(rte->subquery, userid);
522+
setRuleCheckAsUser_Query(rte->subquery, userid);
520523
}
521524
else
522525
rte->checkAsUser = userid;
@@ -532,6 +535,12 @@ setRuleCheckAsUser(Query *qry, AclId userid)
532535
/*
533536
* Expression-tree walker to find sublink queries
534537
*/
538+
static void
539+
setRuleCheckAsUser_Expr(Node *node, AclId userid)
540+
{
541+
(void) setRuleCheckAsUser_walker(node, &userid);
542+
}
543+
535544
static bool
536545
setRuleCheckAsUser_walker(Node *node, AclId *context)
537546
{
@@ -541,7 +550,7 @@ setRuleCheckAsUser_walker(Node *node, AclId *context)
541550
{
542551
Query *qry = (Query *) node;
543552

544-
setRuleCheckAsUser(qry, *context);
553+
setRuleCheckAsUser_Query(qry, *context);
545554
return false;
546555
}
547556
return expression_tree_walker(node, setRuleCheckAsUser_walker,

0 commit comments

Comments
 (0)