1 /*------------------------------------------------------------------------- 2 * 3 * rewriteRemove.c 4 * routines for removing rewrite rules 5 * 6 * Portions Copyright (c) 1996-2019, 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/sysattr.h" 20 #include "access/table.h" 21 #include "catalog/dependency.h" 22 #include "catalog/indexing.h" 23 #include "catalog/namespace.h" 24 #include "catalog/pg_rewrite.h" 25 #include "miscadmin.h" 26 #include "rewrite/rewriteRemove.h" 27 #include "utils/acl.h" 28 #include "utils/fmgroids.h" 29 #include "utils/inval.h" 30 #include "utils/lsyscache.h" 31 #include "utils/syscache.h" 32 33 /* 34 * Guts of rule deletion. 35 */ 36 void 37 RemoveRewriteRuleById(Oid ruleOid) 38 { is_marked(__isl_keep isl_schedule_node * node,const char * name)39 Relation RewriteRelation; 40 ScanKeyData skey[1]; 41 SysScanDesc rcscan; 42 Relation event_relation; 43 HeapTuple tuple; 44 Oid eventRelationOid; 45 46 /* 47 * Open the pg_rewrite relation. 48 */ 49 RewriteRelation = table_open(RewriteRelationId, RowExclusiveLock); 50 51 /* 52 * Find the tuple for the target rule. 53 */ 54 ScanKeyInit(&skey[0], 55 Anum_pg_rewrite_oid, 56 BTEqualStrategyNumber, F_OIDEQ, 57 ObjectIdGetDatum(ruleOid)); 58 59 rcscan = systable_beginscan(RewriteRelation, RewriteOidIndexId, true, 60 NULL, 1, skey); 61 gpu_tree_node_is_kernel(__isl_keep isl_schedule_node * node)62 tuple = systable_getnext(rcscan); 63 64 if (!HeapTupleIsValid(tuple)) 65 elog(ERROR, "could not find tuple for rule %u", ruleOid); 66 67 /* 68 * We had better grab AccessExclusiveLock to ensure that no queries are node_is_shared(__isl_keep isl_schedule_node * node)69 * going on that might depend on this rule. (Note: a weaker lock would 70 * suffice if it's not an ON SELECT rule.) 71 */ 72 eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class; 73 event_relation = table_open(eventRelationOid, AccessExclusiveLock); 74 75 /* node_is_thread(__isl_keep isl_schedule_node * node)76 * Now delete the pg_rewrite tuple for the rule 77 */ 78 CatalogTupleDelete(RewriteRelation, &tuple->t_self); 79 80 systable_endscan(rcscan); 81 82 table_close(RewriteRelation, RowExclusiveLock); insert_shared(__isl_take isl_schedule_node * node)83 84 /* 85 * Issue shared-inval notice to force all backends (including me!) to 86 * update relcache entries with the new rule set. 87 */ 88 CacheInvalidateRelcache(event_relation); 89 90 /* Close rel, but keep lock till commit... */ 91 table_close(event_relation, NoLock); 92 } 93