Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * rewriteRemove.c 4 : * routines for removing rewrite rules 5 : * 6 : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group 7 : * Portions Copyright (c) 1994, Regents of the University of California 8 : * 9 : * 10 : * IDENTIFICATION 11 : * src/backend/rewrite/rewriteRemove.c 12 : * 13 : *------------------------------------------------------------------------- 14 : */ 15 : #include "postgres.h" 16 : 17 : #include "access/genam.h" 18 : #include "access/htup_details.h" 19 : #include "access/table.h" 20 : #include "catalog/catalog.h" 21 : #include "catalog/indexing.h" 22 : #include "catalog/pg_rewrite.h" 23 : #include "miscadmin.h" 24 : #include "rewrite/rewriteRemove.h" 25 : #include "utils/fmgroids.h" 26 : #include "utils/inval.h" 27 : #include "utils/rel.h" 28 : 29 : /* 30 : * Guts of rule deletion. 31 : */ 32 : void 33 2834 : RemoveRewriteRuleById(Oid ruleOid) 34 : { 35 : Relation RewriteRelation; 36 : ScanKeyData skey[1]; 37 : SysScanDesc rcscan; 38 : Relation event_relation; 39 : HeapTuple tuple; 40 : Oid eventRelationOid; 41 : 42 : /* 43 : * Open the pg_rewrite relation. 44 : */ 45 2834 : RewriteRelation = table_open(RewriteRelationId, RowExclusiveLock); 46 : 47 : /* 48 : * Find the tuple for the target rule. 49 : */ 50 2834 : ScanKeyInit(&skey[0], 51 : Anum_pg_rewrite_oid, 52 : BTEqualStrategyNumber, F_OIDEQ, 53 : ObjectIdGetDatum(ruleOid)); 54 : 55 2834 : rcscan = systable_beginscan(RewriteRelation, RewriteOidIndexId, true, 56 : NULL, 1, skey); 57 : 58 2834 : tuple = systable_getnext(rcscan); 59 : 60 2834 : if (!HeapTupleIsValid(tuple)) 61 0 : elog(ERROR, "could not find tuple for rule %u", ruleOid); 62 : 63 : /* 64 : * We had better grab AccessExclusiveLock to ensure that no queries are 65 : * going on that might depend on this rule. (Note: a weaker lock would 66 : * suffice if it's not an ON SELECT rule.) 67 : */ 68 2834 : eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class; 69 2834 : event_relation = table_open(eventRelationOid, AccessExclusiveLock); 70 : 71 2834 : if (!allowSystemTableMods && IsSystemRelation(event_relation)) 72 2 : ereport(ERROR, 73 : (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 74 : errmsg("permission denied: \"%s\" is a system catalog", 75 : RelationGetRelationName(event_relation)))); 76 : 77 : /* 78 : * Now delete the pg_rewrite tuple for the rule 79 : */ 80 2832 : CatalogTupleDelete(RewriteRelation, &tuple->t_self); 81 : 82 2832 : systable_endscan(rcscan); 83 : 84 2832 : table_close(RewriteRelation, RowExclusiveLock); 85 : 86 : /* 87 : * Issue shared-inval notice to force all backends (including me!) to 88 : * update relcache entries with the new rule set. 89 : */ 90 2832 : CacheInvalidateRelcache(event_relation); 91 : 92 : /* Close rel, but keep lock till commit... */ 93 2832 : table_close(event_relation, NoLock); 94 2832 : }