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 Oid getExtensionType(Oid extensionOid, const char *typname);
190
191extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId);
192extern List *getOwnedSequences(Oid relid);
193extern Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok);
194
196
198
199/* in pg_shdepend.c */
200
203 SharedDependencyType deptype);
204
205extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,
206 int32 objectSubId);
207
208extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);
209
210extern void changeDependencyOnOwner(Oid classId, Oid objectId,
212
213extern void recordDependencyOnTablespace(Oid classId, Oid objectId,
215
216extern void changeDependencyOnTablespace(Oid classId, Oid objectId,
218
219extern void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId,
220 Oid ownerId,
223
224extern void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId,
227
228extern bool checkSharedDependencies(Oid classId, Oid objectId,
229 char **detail_msg, char **detail_log_msg);
230
231extern void shdepLockAndCheckObject(Oid classId, Oid objectId);
232
234
235extern void dropDatabaseDependencies(Oid databaseId);
236
237extern void shdepDropOwned(List *roleids, DropBehavior behavior);
238
239extern void shdepReassignOwned(List *roleids, Oid newrole);
240
241#endif /* DEPENDENCY_H */
int16 AttrNumber
Definition attnum.h:21
int32_t int32
Definition c.h:554
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
Definition dependency.c:383
void checkMembershipInCurrentExtension(const ObjectAddress *object)
Definition pg_depend.c:260
Oid getExtensionType(Oid extensionOid, const char *typname)
Definition pg_depend.c:832
void recordMultipleDependencies(const ObjectAddress *depender, const ObjectAddress *referenced, int nreferenced, DependencyType behavior)
Definition pg_depend.c:59
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:47
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
Definition pg_depend.c:459
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:353
Oid getExtensionOfObject(Oid classId, Oid objectId)
Definition pg_depend.c:734
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:567
List * get_index_ref_constraints(Oid indexId)
Definition pg_depend.c:1117
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:1009
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
Definition pg_depend.c:303
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:400
long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
Definition pg_depend.c:623
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:1018
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:1061
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
Definition pg_depend.c:195
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:901
void free_object_addresses(ObjectAddresses *addrs)
List * getAutoExtensionsOfObject(Oid classId, Oid objectId)
Definition pg_depend.c:780
DropBehavior
int16 attnum
NameData typname
Definition pg_type.h:43
static char * tablespace
Definition pgbench.c:217
unsigned int Oid
static int fb(int x)
Definition pg_list.h:54
Definition nodes.h:135