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
130extern bool query_uses_temp_object(Query *query, ObjectAddress *temp_object);
131
133
134extern void add_exact_object_address(const ObjectAddress *object,
135 ObjectAddresses *addrs);
136
137extern bool object_address_present(const ObjectAddress *object,
138 const ObjectAddresses *addrs);
139
140extern void record_object_address_dependencies(const ObjectAddress *depender,
141 ObjectAddresses *referenced,
142 DependencyType behavior);
143
144extern void sort_object_addresses(ObjectAddresses *addrs);
145
146extern void free_object_addresses(ObjectAddresses *addrs);
147
148/* in pg_depend.c */
149
150extern void recordDependencyOn(const ObjectAddress *depender,
151 const ObjectAddress *referenced,
152 DependencyType behavior);
153
154extern void recordMultipleDependencies(const ObjectAddress *depender,
155 const ObjectAddress *referenced,
156 int nreferenced,
157 DependencyType behavior);
158
159extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,
160 bool isReplace);
161
162extern void checkMembershipInCurrentExtension(const ObjectAddress *object);
163
164extern long deleteDependencyRecordsFor(Oid classId, Oid objectId,
165 bool skipExtensionDeps);
166
167extern long deleteDependencyRecordsForClass(Oid classId, Oid objectId,
168 Oid refclassId, char deptype);
169
170extern long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId,
171 char deptype,
172 Oid refclassId, Oid refobjectId);
173
174extern long changeDependencyFor(Oid classId, Oid objectId,
175 Oid refClassId, Oid oldRefObjectId,
176 Oid newRefObjectId);
177
178extern long changeDependenciesOf(Oid classId, Oid oldObjectId,
179 Oid newObjectId);
180
181extern long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId,
182 Oid newRefObjectId);
183
184extern Oid getExtensionOfObject(Oid classId, Oid objectId);
185extern List *getAutoExtensionsOfObject(Oid classId, Oid objectId);
186
187extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId);
188extern List *getOwnedSequences(Oid relid);
189extern Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok);
190
191extern Oid get_index_constraint(Oid indexId);
192
193extern List *get_index_ref_constraints(Oid indexId);
194
195/* in pg_shdepend.c */
196
197extern void recordSharedDependencyOn(ObjectAddress *depender,
198 ObjectAddress *referenced,
199 SharedDependencyType deptype);
200
201extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,
202 int32 objectSubId);
203
204extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);
205
206extern void changeDependencyOnOwner(Oid classId, Oid objectId,
207 Oid newOwnerId);
208
209extern void recordDependencyOnTablespace(Oid classId, Oid objectId,
211
212extern void changeDependencyOnTablespace(Oid classId, Oid objectId,
213 Oid newTablespaceId);
214
215extern void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId,
216 Oid ownerId,
217 int noldmembers, Oid *oldmembers,
218 int nnewmembers, Oid *newmembers);
219
220extern void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId,
221 int noldmembers, Oid *oldmembers,
222 int nnewmembers, Oid *newmembers);
223
224extern bool checkSharedDependencies(Oid classId, Oid objectId,
225 char **detail_msg, char **detail_log_msg);
226
227extern void shdepLockAndCheckObject(Oid classId, Oid objectId);
228
229extern void copyTemplateDependencies(Oid templateDbId, Oid newDbId);
230
231extern void dropDatabaseDependencies(Oid databaseId);
232
233extern void shdepDropOwned(List *roleids, DropBehavior behavior);
234
235extern void shdepReassignOwned(List *roleids, Oid newrole);
236
237#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:2870
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:2889
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
bool query_uses_temp_object(Query *query, ObjectAddress *temp_object)
Definition: dependency.c:2489
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:2721
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:2661
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
Definition: pg_depend.c:193
ObjectAddresses * new_object_addresses(void)
Definition: dependency.c:2615
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:2901
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