/src/postgres/src/backend/rewrite/rewriteRemove.c
Line | Count | Source (jump to first uncovered line) |
1 | | /*------------------------------------------------------------------------- |
2 | | * |
3 | | * rewriteRemove.c |
4 | | * routines for removing rewrite rules |
5 | | * |
6 | | * Portions Copyright (c) 1996-2025, 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 | | RemoveRewriteRuleById(Oid ruleOid) |
34 | 0 | { |
35 | 0 | Relation RewriteRelation; |
36 | 0 | ScanKeyData skey[1]; |
37 | 0 | SysScanDesc rcscan; |
38 | 0 | Relation event_relation; |
39 | 0 | HeapTuple tuple; |
40 | 0 | Oid eventRelationOid; |
41 | | |
42 | | /* |
43 | | * Open the pg_rewrite relation. |
44 | | */ |
45 | 0 | RewriteRelation = table_open(RewriteRelationId, RowExclusiveLock); |
46 | | |
47 | | /* |
48 | | * Find the tuple for the target rule. |
49 | | */ |
50 | 0 | ScanKeyInit(&skey[0], |
51 | 0 | Anum_pg_rewrite_oid, |
52 | 0 | BTEqualStrategyNumber, F_OIDEQ, |
53 | 0 | ObjectIdGetDatum(ruleOid)); |
54 | |
|
55 | 0 | rcscan = systable_beginscan(RewriteRelation, RewriteOidIndexId, true, |
56 | 0 | NULL, 1, skey); |
57 | |
|
58 | 0 | tuple = systable_getnext(rcscan); |
59 | |
|
60 | 0 | 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 | 0 | eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class; |
69 | 0 | event_relation = table_open(eventRelationOid, AccessExclusiveLock); |
70 | |
|
71 | 0 | if (!allowSystemTableMods && IsSystemRelation(event_relation)) |
72 | 0 | ereport(ERROR, |
73 | 0 | (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), |
74 | 0 | errmsg("permission denied: \"%s\" is a system catalog", |
75 | 0 | RelationGetRelationName(event_relation)))); |
76 | | |
77 | | /* |
78 | | * Now delete the pg_rewrite tuple for the rule |
79 | | */ |
80 | 0 | CatalogTupleDelete(RewriteRelation, &tuple->t_self); |
81 | |
|
82 | 0 | systable_endscan(rcscan); |
83 | |
|
84 | 0 | 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 | 0 | CacheInvalidateRelcache(event_relation); |
91 | | |
92 | | /* Close rel, but keep lock till commit... */ |
93 | 0 | table_close(event_relation, NoLock); |
94 | 0 | } |