Age Owner Branch data TLA 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-2024, 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
4546 heikki.linnakangas@i 36 :CBC 71 : RangeCreate(Oid rangeTypeOid, Oid rangeSubType, Oid rangeCollation,
37 : : Oid rangeSubOpclass, RegProcedure rangeCanonical,
38 : : RegProcedure rangeSubDiff, Oid multirangeTypeOid)
39 : : {
40 : : Relation pg_range;
41 : : Datum values[Natts_pg_range];
42 : : bool nulls[Natts_pg_range];
43 : : HeapTuple tup;
44 : : ObjectAddress myself;
45 : : ObjectAddress referenced;
46 : : ObjectAddress referencing;
47 : : ObjectAddresses *addrs;
48 : :
1910 andres@anarazel.de 49 : 71 : pg_range = table_open(RangeRelationId, RowExclusiveLock);
50 : :
4535 tgl@sss.pgh.pa.us 51 : 71 : memset(nulls, 0, sizeof(nulls));
52 : :
bruce@momjian.us 53 : 71 : values[Anum_pg_range_rngtypid - 1] = ObjectIdGetDatum(rangeTypeOid);
54 : 71 : values[Anum_pg_range_rngsubtype - 1] = ObjectIdGetDatum(rangeSubType);
4546 heikki.linnakangas@i 55 : 71 : values[Anum_pg_range_rngcollation - 1] = ObjectIdGetDatum(rangeCollation);
4535 bruce@momjian.us 56 : 71 : values[Anum_pg_range_rngsubopc - 1] = ObjectIdGetDatum(rangeSubOpclass);
4546 heikki.linnakangas@i 57 : 71 : values[Anum_pg_range_rngcanonical - 1] = ObjectIdGetDatum(rangeCanonical);
4535 bruce@momjian.us 58 : 71 : values[Anum_pg_range_rngsubdiff - 1] = ObjectIdGetDatum(rangeSubDiff);
1211 akorotkov@postgresql 59 : 71 : values[Anum_pg_range_rngmultitypid - 1] = ObjectIdGetDatum(multirangeTypeOid);
60 : :
4546 heikki.linnakangas@i 61 : 71 : tup = heap_form_tuple(RelationGetDescr(pg_range), values, nulls);
62 : :
2630 alvherre@alvh.no-ip. 63 : 71 : CatalogTupleInsert(pg_range, tup);
4546 heikki.linnakangas@i 64 : 71 : heap_freetuple(tup);
65 : :
66 : : /* record type's dependencies on range-related items */
1317 michael@paquier.xyz 67 : 71 : addrs = new_object_addresses();
68 : :
69 : 71 : ObjectAddressSet(myself, TypeRelationId, rangeTypeOid);
70 : :
71 : 71 : ObjectAddressSet(referenced, TypeRelationId, rangeSubType);
72 : 71 : add_exact_object_address(&referenced, addrs);
73 : :
74 : 71 : ObjectAddressSet(referenced, OperatorClassRelationId, rangeSubOpclass);
75 : 71 : add_exact_object_address(&referenced, addrs);
76 : :
4546 heikki.linnakangas@i 77 [ + + ]: 71 : if (OidIsValid(rangeCollation))
78 : : {
1317 michael@paquier.xyz 79 : 35 : ObjectAddressSet(referenced, CollationRelationId, rangeCollation);
80 : 35 : add_exact_object_address(&referenced, addrs);
81 : : }
82 : :
4546 heikki.linnakangas@i 83 [ - + ]: 71 : if (OidIsValid(rangeCanonical))
84 : : {
1317 michael@paquier.xyz 85 :UBC 0 : ObjectAddressSet(referenced, ProcedureRelationId, rangeCanonical);
86 : 0 : add_exact_object_address(&referenced, addrs);
87 : : }
88 : :
4546 heikki.linnakangas@i 89 [ + + ]:CBC 71 : if (OidIsValid(rangeSubDiff))
90 : : {
1317 michael@paquier.xyz 91 : 4 : ObjectAddressSet(referenced, ProcedureRelationId, rangeSubDiff);
92 : 4 : add_exact_object_address(&referenced, addrs);
93 : : }
94 : :
95 : 71 : record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
96 : 71 : free_object_addresses(addrs);
97 : :
98 : : /* record multirange type's dependency on the range type */
1211 akorotkov@postgresql 99 : 71 : referencing.classId = TypeRelationId;
100 : 71 : referencing.objectId = multirangeTypeOid;
101 : 71 : referencing.objectSubId = 0;
102 : 71 : recordDependencyOn(&referencing, &myself, DEPENDENCY_INTERNAL);
103 : :
1910 andres@anarazel.de 104 : 71 : table_close(pg_range, RowExclusiveLock);
4546 heikki.linnakangas@i 105 : 71 : }
106 : :
107 : :
108 : : /*
109 : : * RangeDelete
110 : : * Remove the pg_range entry for the specified type.
111 : : */
112 : : void
113 : 52 : RangeDelete(Oid rangeTypeOid)
114 : : {
115 : : Relation pg_range;
116 : : ScanKeyData key[1];
117 : : SysScanDesc scan;
118 : : HeapTuple tup;
119 : :
1910 andres@anarazel.de 120 : 52 : pg_range = table_open(RangeRelationId, RowExclusiveLock);
121 : :
4546 heikki.linnakangas@i 122 : 52 : ScanKeyInit(&key[0],
123 : : Anum_pg_range_rngtypid,
124 : : BTEqualStrategyNumber, F_OIDEQ,
125 : : ObjectIdGetDatum(rangeTypeOid));
126 : :
127 : 52 : scan = systable_beginscan(pg_range, RangeTypidIndexId, true,
128 : : NULL, 1, key);
129 : :
130 [ + + ]: 104 : while (HeapTupleIsValid(tup = systable_getnext(scan)))
131 : : {
2629 tgl@sss.pgh.pa.us 132 : 52 : CatalogTupleDelete(pg_range, &tup->t_self);
133 : : }
134 : :
4546 heikki.linnakangas@i 135 : 52 : systable_endscan(scan);
136 : :
1910 andres@anarazel.de 137 : 52 : table_close(pg_range, RowExclusiveLock);
4546 heikki.linnakangas@i 138 : 52 : }
|