8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
33
33
#include "utils/syscache.h"
34
34
35
35
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 );
37
38
static bool setRuleCheckAsUser_walker (Node * node , AclId * context );
38
39
39
40
@@ -440,13 +441,15 @@ DefineQueryRewrite(RuleStmt *stmt)
440
441
* We want the rule's table references to be checked as though by the
441
442
* rule owner, not the user referencing the rule. Therefore, scan
442
443
* 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.
444
446
*/
445
447
foreach (l , action )
446
448
{
447
449
query = (Query * ) lfirst (l );
448
- setRuleCheckAsUser (query , GetUserId ());
450
+ setRuleCheckAsUser_Query (query , GetUserId ());
449
451
}
452
+ setRuleCheckAsUser_Expr (event_qual , GetUserId ());
450
453
451
454
/* discard rule if it's null action and not INSTEAD; it's a no-op */
452
455
if (action != NIL || is_instead )
@@ -492,7 +495,7 @@ DefineQueryRewrite(RuleStmt *stmt)
492
495
}
493
496
494
497
/*
495
- * setRuleCheckAsUser
498
+ * setRuleCheckAsUser_Query
496
499
* Recursively scan a query and set the checkAsUser field to the
497
500
* given userid in all rtable entries.
498
501
*
@@ -504,7 +507,7 @@ DefineQueryRewrite(RuleStmt *stmt)
504
507
* them always.
505
508
*/
506
509
static void
507
- setRuleCheckAsUser (Query * qry , AclId userid )
510
+ setRuleCheckAsUser_Query (Query * qry , AclId userid )
508
511
{
509
512
List * l ;
510
513
@@ -516,7 +519,7 @@ setRuleCheckAsUser(Query *qry, AclId userid)
516
519
if (rte -> rtekind == RTE_SUBQUERY )
517
520
{
518
521
/* Recurse into subquery in FROM */
519
- setRuleCheckAsUser (rte -> subquery , userid );
522
+ setRuleCheckAsUser_Query (rte -> subquery , userid );
520
523
}
521
524
else
522
525
rte -> checkAsUser = userid ;
@@ -532,6 +535,12 @@ setRuleCheckAsUser(Query *qry, AclId userid)
532
535
/*
533
536
* Expression-tree walker to find sublink queries
534
537
*/
538
+ static void
539
+ setRuleCheckAsUser_Expr (Node * node , AclId userid )
540
+ {
541
+ (void ) setRuleCheckAsUser_walker (node , & userid );
542
+ }
543
+
535
544
static bool
536
545
setRuleCheckAsUser_walker (Node * node , AclId * context )
537
546
{
@@ -541,7 +550,7 @@ setRuleCheckAsUser_walker(Node *node, AclId *context)
541
550
{
542
551
Query * qry = (Query * ) node ;
543
552
544
- setRuleCheckAsUser (qry , * context );
553
+ setRuleCheckAsUser_Query (qry , * context );
545
554
return false;
546
555
}
547
556
return expression_tree_walker (node , setRuleCheckAsUser_walker ,
0 commit comments