Coverage Report

Created: 2025-08-12 06:43

/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
}