diff options
Diffstat (limited to 'src/backend/rewrite/rewriteRemove.c')
-rw-r--r-- | src/backend/rewrite/rewriteRemove.c | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c deleted file mode 100644 index 71fd4d5ac40..00000000000 --- a/src/backend/rewrite/rewriteRemove.c +++ /dev/null @@ -1,168 +0,0 @@ -/*------------------------------------------------------------------------- - * - * rewriteRemove.c - * routines for removing rewrite rules - * - * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.50 2002/06/20 20:29:34 momjian Exp $ - * - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include "access/genam.h" -#include "access/heapam.h" -#include "catalog/catname.h" -#include "catalog/indexing.h" -#include "catalog/pg_rewrite.h" -#include "commands/comment.h" -#include "miscadmin.h" -#include "rewrite/rewriteRemove.h" -#include "rewrite/rewriteSupport.h" -#include "utils/acl.h" -#include "utils/fmgroids.h" -#include "utils/syscache.h" - - -/* - * RemoveRewriteRule - * - * Delete a rule given its name. - */ -void -RemoveRewriteRule(Oid owningRel, const char *ruleName) -{ - Relation RewriteRelation; - Relation event_relation; - HeapTuple tuple; - Oid ruleId; - Oid eventRelationOid; - bool hasMoreRules; - AclResult aclresult; - - /* - * Open the pg_rewrite relation. - */ - RewriteRelation = heap_openr(RewriteRelationName, RowExclusiveLock); - - /* - * Find the tuple for the target rule. - */ - tuple = SearchSysCacheCopy(RULERELNAME, - ObjectIdGetDatum(owningRel), - PointerGetDatum(ruleName), - 0, 0); - - /* - * complain if no rule with such name existed - */ - if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Rule \"%s\" not found", ruleName); - - /* - * Save the OID of the rule (i.e. the tuple's OID) and the event - * relation's OID - */ - ruleId = tuple->t_data->t_oid; - eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class; - Assert(eventRelationOid == owningRel); - - /* - * We had better grab AccessExclusiveLock so that we know no other - * rule additions/deletions are going on for this relation. Else we - * cannot set relhasrules correctly. Besides, we don't want to be - * changing the ruleset while queries are executing on the rel. - */ - event_relation = heap_open(eventRelationOid, AccessExclusiveLock); - - /* - * Verify user has appropriate permissions. - */ - aclresult = pg_class_aclcheck(eventRelationOid, GetUserId(), ACL_RULE); - if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, RelationGetRelationName(event_relation)); - - /* do not allow the removal of a view's SELECT rule */ - if (event_relation->rd_rel->relkind == RELKIND_VIEW && - ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_type == '1') - elog(ERROR, "Cannot remove a view's SELECT rule"); - - hasMoreRules = event_relation->rd_rules != NULL && - event_relation->rd_rules->numLocks > 1; - - /* - * Delete any comments associated with this rule - */ - DeleteComments(ruleId, RelationGetRelid(RewriteRelation)); - - /* - * Now delete the pg_rewrite tuple for the rule - */ - simple_heap_delete(RewriteRelation, &tuple->t_self); - - heap_freetuple(tuple); - - heap_close(RewriteRelation, RowExclusiveLock); - - /* - * Set pg_class 'relhasrules' field correctly for event relation. - * - * Important side effect: an SI notice is broadcast to force all backends - * (including me!) to update relcache entries with the new rule set. - * Therefore, must do this even if relhasrules is still true! - */ - SetRelationRuleStatus(eventRelationOid, hasMoreRules, false); - - /* Close rel, but keep lock till commit... */ - heap_close(event_relation, NoLock); -} - -/* - * RelationRemoveRules - - * removes all rules associated with the relation when the relation is - * being removed. - */ -void -RelationRemoveRules(Oid relid) -{ - Relation RewriteRelation; - SysScanDesc scanDesc; - ScanKeyData scanKeyData; - HeapTuple tuple; - - /* - * Open the pg_rewrite relation. - */ - RewriteRelation = heap_openr(RewriteRelationName, RowExclusiveLock); - - /* - * Scan pg_rewrite for all the tuples that have the same ev_class - * as relid (the relation to be removed). - */ - ScanKeyEntryInitialize(&scanKeyData, - 0, - Anum_pg_rewrite_ev_class, - F_OIDEQ, - ObjectIdGetDatum(relid)); - - scanDesc = systable_beginscan(RewriteRelation, - RewriteRelRulenameIndex, - true, SnapshotNow, - 1, &scanKeyData); - - while (HeapTupleIsValid(tuple = systable_getnext(scanDesc))) - { - /* Delete any comments associated with this rule */ - DeleteComments(tuple->t_data->t_oid, RelationGetRelid(RewriteRelation)); - - simple_heap_delete(RewriteRelation, &tuple->t_self); - } - - systable_endscan(scanDesc); - - heap_close(RewriteRelation, RowExclusiveLock); -} |