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 */
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 );
3738static 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 */
506509static 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+
535544static bool
536545setRuleCheckAsUser_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