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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy