Branch data Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * pg_range.c
4 : : * routines to support manipulation of the pg_range relation
5 : : *
6 : : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : : * Portions Copyright (c) 1994, Regents of the University of California
8 : : *
9 : : *
10 : : * IDENTIFICATION
11 : : * src/backend/catalog/pg_range.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/dependency.h"
21 : : #include "catalog/indexing.h"
22 : : #include "catalog/pg_collation.h"
23 : : #include "catalog/pg_opclass.h"
24 : : #include "catalog/pg_proc.h"
25 : : #include "catalog/pg_range.h"
26 : : #include "catalog/pg_type.h"
27 : : #include "utils/fmgroids.h"
28 : : #include "utils/rel.h"
29 : :
30 : :
31 : : /*
32 : : * RangeCreate
33 : : * Create an entry in pg_range.
34 : : */
35 : : void
36 : 23 : RangeCreate(Oid rangeTypeOid, Oid rangeSubType, Oid rangeCollation,
37 : : Oid rangeSubOpclass, RegProcedure rangeCanonical,
38 : : RegProcedure rangeSubDiff, Oid multirangeTypeOid,
39 : : RegProcedure rangeConstruct2, RegProcedure rangeConstruct3,
40 : : RegProcedure mltrngConstruct0, RegProcedure mltrngConstruct1, RegProcedure mltrngConstruct2)
41 : : {
42 : 23 : Relation pg_range;
43 : 23 : Datum values[Natts_pg_range];
44 : 23 : bool nulls[Natts_pg_range];
45 : 23 : HeapTuple tup;
46 : 23 : ObjectAddress myself;
47 : 23 : ObjectAddress referenced;
48 : 23 : ObjectAddress referencing;
49 : 23 : ObjectAddresses *addrs;
50 : :
51 : 23 : pg_range = table_open(RangeRelationId, RowExclusiveLock);
52 : :
53 : 23 : memset(nulls, 0, sizeof(nulls));
54 : :
55 : 23 : values[Anum_pg_range_rngtypid - 1] = ObjectIdGetDatum(rangeTypeOid);
56 : 23 : values[Anum_pg_range_rngsubtype - 1] = ObjectIdGetDatum(rangeSubType);
57 : 23 : values[Anum_pg_range_rngcollation - 1] = ObjectIdGetDatum(rangeCollation);
58 : 23 : values[Anum_pg_range_rngsubopc - 1] = ObjectIdGetDatum(rangeSubOpclass);
59 : 23 : values[Anum_pg_range_rngcanonical - 1] = ObjectIdGetDatum(rangeCanonical);
60 : 23 : values[Anum_pg_range_rngsubdiff - 1] = ObjectIdGetDatum(rangeSubDiff);
61 : 23 : values[Anum_pg_range_rngmultitypid - 1] = ObjectIdGetDatum(multirangeTypeOid);
62 : 23 : values[Anum_pg_range_rngconstruct2 - 1] = ObjectIdGetDatum(rangeConstruct2);
63 : 23 : values[Anum_pg_range_rngconstruct3 - 1] = ObjectIdGetDatum(rangeConstruct3);
64 : 23 : values[Anum_pg_range_rngmltconstruct0 - 1] = ObjectIdGetDatum(mltrngConstruct0);
65 : 23 : values[Anum_pg_range_rngmltconstruct1 - 1] = ObjectIdGetDatum(mltrngConstruct1);
66 : 23 : values[Anum_pg_range_rngmltconstruct2 - 1] = ObjectIdGetDatum(mltrngConstruct2);
67 : :
68 : 23 : tup = heap_form_tuple(RelationGetDescr(pg_range), values, nulls);
69 : :
70 : 23 : CatalogTupleInsert(pg_range, tup);
71 : 23 : heap_freetuple(tup);
72 : :
73 : : /* record type's dependencies on range-related items */
74 : 23 : addrs = new_object_addresses();
75 : :
76 : 23 : ObjectAddressSet(myself, TypeRelationId, rangeTypeOid);
77 : :
78 : 23 : ObjectAddressSet(referenced, TypeRelationId, rangeSubType);
79 : 23 : add_exact_object_address(&referenced, addrs);
80 : :
81 : 23 : ObjectAddressSet(referenced, OperatorClassRelationId, rangeSubOpclass);
82 : 23 : add_exact_object_address(&referenced, addrs);
83 : :
84 [ + + ]: 23 : if (OidIsValid(rangeCollation))
85 : : {
86 : 11 : ObjectAddressSet(referenced, CollationRelationId, rangeCollation);
87 : 11 : add_exact_object_address(&referenced, addrs);
88 : 11 : }
89 : :
90 [ + - ]: 23 : if (OidIsValid(rangeCanonical))
91 : : {
92 : 0 : ObjectAddressSet(referenced, ProcedureRelationId, rangeCanonical);
93 : 0 : add_exact_object_address(&referenced, addrs);
94 : 0 : }
95 : :
96 [ + + ]: 23 : if (OidIsValid(rangeSubDiff))
97 : : {
98 : 1 : ObjectAddressSet(referenced, ProcedureRelationId, rangeSubDiff);
99 : 1 : add_exact_object_address(&referenced, addrs);
100 : 1 : }
101 : :
102 : 23 : record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
103 : 23 : free_object_addresses(addrs);
104 : :
105 : : /* record multirange type's dependency on the range type */
106 : 23 : referencing.classId = TypeRelationId;
107 : 23 : referencing.objectId = multirangeTypeOid;
108 : 23 : referencing.objectSubId = 0;
109 : 23 : recordDependencyOn(&referencing, &myself, DEPENDENCY_INTERNAL);
110 : :
111 : 23 : table_close(pg_range, RowExclusiveLock);
112 : 23 : }
113 : :
114 : :
115 : : /*
116 : : * RangeDelete
117 : : * Remove the pg_range entry for the specified type.
118 : : */
119 : : void
120 : 0 : RangeDelete(Oid rangeTypeOid)
121 : : {
122 : 0 : Relation pg_range;
123 : 0 : ScanKeyData key[1];
124 : 0 : SysScanDesc scan;
125 : 0 : HeapTuple tup;
126 : :
127 : 0 : pg_range = table_open(RangeRelationId, RowExclusiveLock);
128 : :
129 : 0 : ScanKeyInit(&key[0],
130 : : Anum_pg_range_rngtypid,
131 : : BTEqualStrategyNumber, F_OIDEQ,
132 : 0 : ObjectIdGetDatum(rangeTypeOid));
133 : :
134 : 0 : scan = systable_beginscan(pg_range, RangeTypidIndexId, true,
135 : 0 : NULL, 1, key);
136 : :
137 [ # # ]: 0 : while (HeapTupleIsValid(tup = systable_getnext(scan)))
138 : : {
139 : 0 : CatalogTupleDelete(pg_range, &tup->t_self);
140 : : }
141 : :
142 : 0 : systable_endscan(scan);
143 : :
144 : 0 : table_close(pg_range, RowExclusiveLock);
145 : 0 : }
|