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 ,