PostgreSQL Source Code git master
dependency.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * dependency.h
4 * Routines to support inter-object dependencies.
5 *
6 *
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/catalog/dependency.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef DEPENDENCY_H
15#define DEPENDENCY_H
16
18
19
20/*
21 * Precise semantics of a dependency relationship are specified by the
22 * DependencyType code (which is stored in a "char" field in pg_depend,
23 * so we assign ASCII-code values to the enumeration members).
24 *
25 * In all cases, a dependency relationship indicates that the referenced
26 * object may not be dropped without also dropping the dependent object.
27 * However, there are several subflavors; see the description of pg_depend
28 * in catalogs.sgml for details.
29 */
30
31typedef enum DependencyType
32{
41
42/*
43 * There is also a SharedDependencyType enum type that determines the exact
44 * semantics of an entry in pg_shdepend. Just like regular dependency entries,
45 * any pg_shdepend entry means that the referenced object cannot be dropped
46 * unless the dependent object is dropped at the same time. There are some
47 * additional rules however:
48 *
49 * (a) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is
50 * the role owning the dependent object. The referenced object must be
51 * a pg_authid entry.
52 *
53 * (b) a SHARED_DEPENDENCY_ACL entry means that the referenced object is
54 * a role mentioned in the ACL field of the dependent object. The referenced
55 * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not
56 * created for the owner of an object; hence two objects may be linked by
57 * one or the other, but not both, of these dependency types.)
58 *
59 * (c) a SHARED_DEPENDENCY_INITACL entry means that the referenced object is
60 * a role mentioned in a pg_init_privs entry for the dependent object.
61 * The referenced object must be a pg_authid entry. (Unlike the case for
62 * SHARED_DEPENDENCY_ACL, we make an entry for such a role whether or not
63 * it is the object's owner.)
64 *
65 * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is
66 * a role mentioned in a policy object. The referenced object must be a
67 * pg_authid entry.
68 *
69 * (e) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced
70 * object is a tablespace mentioned in a relation without storage. The
71 * referenced object must be a pg_tablespace entry. (Relations that have
72 * storage don't need this: they are protected by the existence of a physical
73 * file in the tablespace.)
74 *
75 * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal
76 * routines, and is not valid in the catalog itself.
77 */
79{
87
88/* expansible list of ObjectAddresses (private in dependency.c) */
90
91/* flag bits for performDeletion/performMultipleDeletions: */
92#define PERFORM_DELETION_INTERNAL 0x0001 /* internal action */
93#define PERFORM_DELETION_CONCURRENTLY 0x0002 /* concurrent drop */
94#define PERFORM_DELETION_QUIETLY 0x0004 /* suppress notices */
95#define PERFORM_DELETION_SKIP_ORIGINAL 0x0008 /* keep original obj */
96#define PERFORM_DELETION_SKIP_EXTENSIONS 0x0010 /* keep extensions */
97#define PERFORM_DELETION_CONCURRENT_LOCK 0x0020 /* normal drop with
98 * concurrent lock mode */
99
100
101/* in dependency.c */
102
103extern void AcquireDeletionLock(const ObjectAddress *object, int flags);
104
105extern void ReleaseDeletionLock(const ObjectAddress *object);
106
107extern void performDeletion(const ObjectAddress *object,
108 DropBehavior behavior, int flags);
109
110extern void performMultipleDeletions(const ObjectAddresses *objects,
111 DropBehavior behavior, int flags);
112
113extern void recordDependencyOnExpr(const ObjectAddress *depender,
114 Node *expr, List *rtable,
115 DependencyType behavior);
116
118 Node *expr, List *rtable);
119
120extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
121 Node *expr, Oid relId,
122 DependencyType behavior,
123 DependencyType self_behavior,
124 bool reverse_self);
125
126extern bool find_temp_object(const ObjectAddresses *addrs,
127 bool local_temp_okay,
128 ObjectAddress *foundobj);
129
131
132extern void add_exact_object_address(const ObjectAddress *object,
133 ObjectAddresses *addrs);
134
135extern bool object_address_present(const ObjectAddress *object,
136 const ObjectAddresses *addrs);
137
138extern void record_object_address_dependencies(const ObjectAddress *depender,
139 ObjectAddresses *referenced,
140 DependencyType behavior);
141
142extern void sort_object_addresses(ObjectAddresses *addrs);
143
144extern void free_object_addresses(ObjectAddresses *addrs);
145
146/* in pg_depend.c */
147
148extern void recordDependencyOn(const ObjectAddress *depender,
149 const ObjectAddress *referenced,
150 DependencyType behavior);
151
152extern void recordMultipleDependencies(const ObjectAddress *depender,
153 const ObjectAddress *referenced,
154 int nreferenced,
155 DependencyType behavior);
156
157extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,
158 bool isReplace);
159
160extern void checkMembershipInCurrentExtension(const ObjectAddress *object);
161
162extern long deleteDependencyRecordsFor(Oid classId, Oid objectId,
163 bool skipExtensionDeps);
164
165extern long deleteDependencyRecordsForClass(Oid classId, Oid objectId,
166 Oid refclassId, char deptype);
167
168extern long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId,
169 char deptype,
170 Oid refclassId, Oid refobjectId);
171
172extern long changeDependencyFor(Oid classId, Oid objectId,
173 Oid refClassId, Oid oldRefObjectId,
174 Oid newRefObjectId);
175
176extern long changeDependenciesOf(Oid classId, Oid oldObjectId,
177 Oid newObjectId);
178
179extern long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId,
180 Oid newRefObjectId);
181
182extern Oid getExtensionOfObject(Oid classId, Oid objectId);
183extern List *getAutoExtensionsOfObject(Oid classId, Oid objectId);
184
185extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId);
186extern List *getOwnedSequences(Oid relid);
187extern Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok);
188
189extern Oid get_index_constraint(Oid indexId);
190
191extern List *get_index_ref_constraints(Oid indexId);
192
193/* in pg_shdepend.c */
194
195extern void recordSharedDependencyOn(ObjectAddress *depender,
196 ObjectAddress *referenced,
197 SharedDependencyType deptype);
198
199extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,
200 int32 objectSubId);
201
202extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);
203
204extern void changeDependencyOnOwner(Oid classId, Oid objectId,
205 Oid newOwnerId);
206
207extern void recordDependencyOnTablespace(Oid classId, Oid objectId,
209
210extern void changeDependencyOnTablespace(Oid classId, Oid objectId,
211 Oid newTablespaceId);
212
213extern void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId,
214 Oid ownerId,
215 int noldmembers, Oid *oldmembers,
216 int nnewmembers, Oid *newmembers);
217
218extern void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId,
219 int noldmembers, Oid *oldmembers,
220 int nnewmembers, Oid *newmembers);
221
222extern bool checkSharedDependencies(Oid classId, Oid objectId,
223 char **detail_msg, char **detail_log_msg);
224
225extern void shdepLockAndCheckObject(Oid classId, Oid objectId);
226
227extern void copyTemplateDependencies(Oid templateDbId, Oid newDbId);
228
229extern void dropDatabaseDependencies(Oid databaseId);
230
231extern void shdepDropOwned(List *roleids, DropBehavior behavior);
232
233extern void shdepReassignOwned(List *roleids, Oid newrole);
234
235#endif /* DEPENDENCY_H */
int16 AttrNumber
Definition: attnum.h:21
int32_t int32
Definition: c.h:539
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
Definition: dependency.c:333
void checkMembershipInCurrentExtension(const ObjectAddress *object)
Definition: pg_depend.c:258
void recordMultipleDependencies(const ObjectAddress *depender, const ObjectAddress *referenced, int nreferenced, DependencyType behavior)
Definition: pg_depend.c:57
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
Definition: dependency.c:2845
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
Definition: pg_depend.c:45
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
Definition: pg_depend.c:457
DependencyType
Definition: dependency.h:32
@ DEPENDENCY_AUTO
Definition: dependency.h:34
@ DEPENDENCY_AUTO_EXTENSION
Definition: dependency.h:39
@ DEPENDENCY_INTERNAL
Definition: dependency.h:35
@ DEPENDENCY_PARTITION_PRI
Definition: dependency.h:36
@ DEPENDENCY_PARTITION_SEC
Definition: dependency.h:37
@ DEPENDENCY_EXTENSION
Definition: dependency.h:38
@ DEPENDENCY_NORMAL
Definition: dependency.h:33
void sort_object_addresses(ObjectAddresses *addrs)
Definition: dependency.c:2864
SharedDependencyType
Definition: dependency.h:79
@ SHARED_DEPENDENCY_INITACL
Definition: dependency.h:82
@ SHARED_DEPENDENCY_TABLESPACE
Definition: dependency.h:84
@ SHARED_DEPENDENCY_INVALID
Definition: dependency.h:85
@ SHARED_DEPENDENCY_POLICY
Definition: dependency.h:83
@ SHARED_DEPENDENCY_ACL
Definition: dependency.h:81
@ SHARED_DEPENDENCY_OWNER
Definition: dependency.h:80
void dropDatabaseDependencies(Oid databaseId)
Definition: pg_shdepend.c:999
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
Definition: pg_shdepend.c:316
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
Definition: pg_depend.c:351
Oid getExtensionOfObject(Oid classId, Oid objectId)
Definition: pg_depend.c:732
void AcquireDeletionLock(const ObjectAddress *object, int flags)
Definition: dependency.c:1497
void copyTemplateDependencies(Oid templateDbId, Oid newDbId)
Definition: pg_shdepend.c:895
long changeDependenciesOf(Oid classId, Oid oldObjectId, Oid newObjectId)
Definition: pg_depend.c:565
List * get_index_ref_constraints(Oid indexId)
Definition: pg_depend.c:1044
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
Definition: dependency.c:274
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
Definition: pg_shdepend.c:1047
void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
Definition: pg_shdepend.c:491
void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
Definition: pg_shdepend.c:512
List * getOwnedSequences(Oid relid)
Definition: pg_depend.c:936
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
Definition: pg_shdepend.c:168
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
Definition: pg_depend.c:301
bool checkSharedDependencies(Oid classId, Oid objectId, char **detail_msg, char **detail_log_msg)
Definition: pg_shdepend.c:676
void recordDependencyOnTablespace(Oid classId, Oid objectId, Oid tablespace)
Definition: pg_shdepend.c:370
long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId, char deptype, Oid refclassId, Oid refobjectId)
Definition: pg_depend.c:398
long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
Definition: pg_depend.c:621
void ReleaseDeletionLock(const ObjectAddress *object)
Definition: dependency.c:1529
void shdepDropOwned(List *roleids, DropBehavior behavior)
Definition: pg_shdepend.c:1342
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
Definition: dependency.c:1629
void recordDependencyOnExpr(const ObjectAddress *depender, Node *expr, List *rtable, DependencyType behavior)
Definition: dependency.c:1554
void recordSharedDependencyOn(ObjectAddress *depender, ObjectAddress *referenced, SharedDependencyType deptype)
Definition: pg_shdepend.c:125
Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok)
Definition: pg_depend.c:945
void shdepLockAndCheckObject(Oid classId, Oid objectId)
Definition: pg_shdepend.c:1211
void collectDependenciesOfExpr(ObjectAddresses *addrs, Node *expr, List *rtable)
Definition: dependency.c:1597
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
Definition: dependency.c:2696
bool find_temp_object(const ObjectAddresses *addrs, bool local_temp_okay, ObjectAddress *foundobj)
Definition: dependency.c:2454
Oid get_index_constraint(Oid indexId)
Definition: pg_depend.c:988
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
Definition: dependency.c:2636
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
Definition: pg_depend.c:193
ObjectAddresses * new_object_addresses(void)
Definition: dependency.c:2590
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
Definition: pg_shdepend.c:391
void shdepReassignOwned(List *roleids, Oid newrole)
Definition: pg_shdepend.c:1530
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
Definition: pg_depend.c:828
void free_object_addresses(ObjectAddresses *addrs)
Definition: dependency.c:2876
List * getAutoExtensionsOfObject(Oid classId, Oid objectId)
Definition: pg_depend.c:778
DropBehavior
Definition: parsenodes.h:2397
int16 attnum
Definition: pg_attribute.h:74
static char * tablespace
Definition: pgbench.c:217
unsigned int Oid
Definition: postgres_ext.h:32
Definition: pg_list.h:54
Definition: nodes.h:135