PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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-2026, 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
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 */
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 performDeletionCheck(const ObjectAddress *object,
111 DropBehavior behavior, int flags);
112extern void performMultipleDeletions(const ObjectAddresses *objects,
113 DropBehavior behavior, int flags);
114
116 Node *expr, List *rtable,
117 DependencyType behavior);
118
120 Node *expr, List *rtable);
121
123 Node *expr, Oid relId,
124 DependencyType behavior,
126 bool reverse_self);
127
128extern bool find_temp_object(const ObjectAddresses *addrs,
129 bool local_temp_okay,
131
133
135
136extern void add_exact_object_address(const ObjectAddress *object,
137 ObjectAddresses *addrs);
138
139extern bool object_address_present(const ObjectAddress *object,
140 const ObjectAddresses *addrs);
141
144 DependencyType behavior);
145
146extern void sort_object_addresses(ObjectAddresses *addrs);
147
148extern void free_object_addresses(ObjectAddresses *addrs);
149
150/* in pg_depend.c */
151
152extern void recordDependencyOn(const ObjectAddress *depender,
154 DependencyType behavior);
155
158 int nreferenced,
159 DependencyType behavior);
160
161extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,
162 bool isReplace);
163
164extern void checkMembershipInCurrentExtension(const ObjectAddress *object);
165
166extern long deleteDependencyRecordsFor(Oid classId, Oid objectId,
167 bool skipExtensionDeps);
168
169extern long deleteDependencyRecordsForClass(Oid classId, Oid objectId,
170 Oid refclassId, char deptype);
171
172extern long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId,
173 char deptype,
175
176extern long changeDependencyFor(Oid classId, Oid objectId,
179
180extern long changeDependenciesOf(Oid classId, Oid oldObjectId,
182
185
186extern Oid getExtensionOfObject(Oid classId, Oid objectId);
187extern List *getAutoExtensionsOfObject(Oid classId, Oid objectId);
188
189extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId);
190extern List *getOwnedSequences(Oid relid);
191extern Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok);
192
194
196
197/* in pg_shdepend.c */
198
201 SharedDependencyType deptype);
202
203extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,
204 int32 objectSubId);
205
206extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);
207
208extern void changeDependencyOnOwner(Oid classId, Oid objectId,
210
211extern void recordDependencyOnTablespace(Oid classId, Oid objectId,
213
214extern void changeDependencyOnTablespace(Oid classId, Oid objectId,
216
217extern void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId,
218 Oid ownerId,
221
222extern void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId,
225
226extern bool checkSharedDependencies(Oid classId, Oid objectId,
227 char **detail_msg, char **detail_log_msg);
228
229extern void shdepLockAndCheckObject(Oid classId, Oid objectId);
230
232
233extern void dropDatabaseDependencies(Oid databaseId);
234
235extern void shdepDropOwned(List *roleids, DropBehavior behavior);
236
237extern void shdepReassignOwned(List *roleids, Oid newrole);
238
239#endif /* DEPENDENCY_H */
int16 AttrNumber
Definition attnum.h:21
int32_t int32
Definition c.h:542
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
Definition dependency.c:383
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)
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)
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)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void performDeletionCheck(const ObjectAddress *object, DropBehavior behavior, int flags)
Definition dependency.c:333
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)
void copyTemplateDependencies(Oid templateDbId, Oid newDbId)
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)
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
List * getOwnedSequences(Oid relid)
Definition pg_depend.c:936
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
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)
void recordDependencyOnTablespace(Oid classId, Oid objectId, Oid tablespace)
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)
void shdepDropOwned(List *roleids, DropBehavior behavior)
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
void recordDependencyOnExpr(const ObjectAddress *depender, Node *expr, List *rtable, DependencyType behavior)
void recordSharedDependencyOn(ObjectAddress *depender, ObjectAddress *referenced, SharedDependencyType deptype)
Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok)
Definition pg_depend.c:945
void shdepLockAndCheckObject(Oid classId, Oid objectId)
void collectDependenciesOfExpr(ObjectAddresses *addrs, Node *expr, List *rtable)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
bool find_temp_object(const ObjectAddresses *addrs, bool local_temp_okay, ObjectAddress *foundobj)
Oid get_index_constraint(Oid indexId)
Definition pg_depend.c:988
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
Definition pg_depend.c:193
ObjectAddresses * new_object_addresses(void)
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
void shdepReassignOwned(List *roleids, Oid newrole)
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
Definition pg_depend.c:828
void free_object_addresses(ObjectAddresses *addrs)
List * getAutoExtensionsOfObject(Oid classId, Oid objectId)
Definition pg_depend.c:778
DropBehavior
int16 attnum
static char * tablespace
Definition pgbench.c:217
unsigned int Oid
static int fb(int x)
Definition pg_list.h:54
Definition nodes.h:135