Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit07f2b76

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 fromArturs Zoldners.
1 parent4c82cb9 commit07f2b76

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-
staticvoidsetRuleCheckAsUser(Query*qry,AclIduserid);
36+
staticvoidsetRuleCheckAsUser_Query(Query*qry,AclIduserid);
37+
staticvoidsetRuleCheckAsUser_Expr(Node*node,AclIduserid);
3738
staticboolsetRuleCheckAsUser_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
staticvoid
507-
setRuleCheckAsUser(Query*qry,AclIduserid)
510+
setRuleCheckAsUser_Query(Query*qry,AclIduserid)
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+
staticvoid
539+
setRuleCheckAsUser_Expr(Node*node,AclIduserid)
540+
{
541+
(void)setRuleCheckAsUser_walker(node,&userid);
542+
}
543+
535544
staticbool
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
returnexpression_tree_walker(node,setRuleCheckAsUser_walker,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp