diff options
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 12 | ||||
-rw-r--r-- | src/backend/rewrite/rewriteRemove.c | 10 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 60b988175bc..17db70e74a3 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -196,11 +196,15 @@ DefineRule(RuleStmt *stmt, const char *queryString) Node *whereClause; Oid relId; - /* Parse analysis ... */ + /* Parse analysis. */ transformRuleStmt(stmt, queryString, &actions, &whereClause); - /* ... find the relation ... */ - relId = RangeVarGetRelid(stmt->relation, false); + /* + * Find and lock the relation. Lock level should match + * DefineQueryRewrite. + */ + relId = RangeVarGetRelid(stmt->relation, AccessExclusiveLock, false, + false); /* ... and execute */ DefineQueryRewrite(stmt->rulename, @@ -242,6 +246,8 @@ DefineQueryRewrite(char *rulename, * grab ShareRowExclusiveLock to lock out insert/update/delete actions and * to ensure that we lock out current CREATE RULE statements; but because * of race conditions in access to catalog entries, we can't do that yet. + * + * Note that this lock level should match the one used in DefineRule. */ event_relation = heap_open(event_relid, AccessExclusiveLock); diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c index b9dc7c5d9fd..cec22ac6a80 100644 --- a/src/backend/rewrite/rewriteRemove.c +++ b/src/backend/rewrite/rewriteRemove.c @@ -19,6 +19,7 @@ #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" +#include "catalog/namespace.h" #include "catalog/pg_rewrite.h" #include "miscadmin.h" #include "rewrite/rewriteRemove.h" @@ -37,13 +38,18 @@ * Delete a rule given its name. */ void -RemoveRewriteRule(Oid owningRel, const char *ruleName, DropBehavior behavior, - bool missing_ok) +RemoveRewriteRule(RangeVar *relation, const char *ruleName, + DropBehavior behavior, bool missing_ok) { HeapTuple tuple; Oid eventRelationOid; + Oid owningRel; ObjectAddress object; + /* should match RemoveRewriteRuleById */ + owningRel = RangeVarGetRelid(relation, ShareUpdateExclusiveLock, + false, false); + /* * Find the tuple for the target rule. */ |