1 /*------------------------------------------------------------------------- 2 * 3 * dependency.h 4 * Routines to support inter-object dependencies. 5 * 6 * 7 * Portions Copyright (c) 1996-2020, 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 17 #include "catalog/objectaddress.h" 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 31 typedef enum DependencyType 32 { 33 DEPENDENCY_NORMAL = 'n', 34 DEPENDENCY_AUTO = 'a', 35 DEPENDENCY_INTERNAL = 'i', 36 DEPENDENCY_PARTITION_PRI = 'P', 37 DEPENDENCY_PARTITION_SEC = 'S', 38 DEPENDENCY_EXTENSION = 'e', 39 DEPENDENCY_AUTO_EXTENSION = 'x', 40 DEPENDENCY_PIN = 'p' 41 } DependencyType; 42 43 /* 44 * There is also a SharedDependencyType enum type that determines the exact 45 * semantics of an entry in pg_shdepend. Just like regular dependency entries, 46 * any pg_shdepend entry means that the referenced object cannot be dropped 47 * unless the dependent object is dropped at the same time. There are some 48 * additional rules however: 49 * 50 * (a) For a SHARED_DEPENDENCY_PIN entry, there is no dependent object -- 51 * rather, the referenced object is an essential part of the system. This 52 * applies to the initdb-created superuser. Entries of this type are only 53 * created by initdb; objects in this category don't need further pg_shdepend 54 * entries if more objects come to depend on them. 55 * 56 * (b) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is 57 * the role owning the dependent object. The referenced object must be 58 * a pg_authid entry. 59 * 60 * (c) a SHARED_DEPENDENCY_ACL entry means that the referenced object is 61 * a role mentioned in the ACL field of the dependent object. The referenced 62 * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not 63 * created for the owner of an object; hence two objects may be linked by 64 * one or the other, but not both, of these dependency types.) 65 * 66 * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is 67 * a role mentioned in a policy object. The referenced object must be a 68 * pg_authid entry. 69 * 70 * (e) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced 71 * object is a tablespace mentioned in a relation without storage. The 72 * referenced object must be a pg_tablespace entry. (Relations that have 73 * storage don't need this: they are protected by the existence of a physical 74 * file in the tablespace.) 75 * 76 * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal 77 * routines, and is not valid in the catalog itself. 78 */ 79 typedef enum SharedDependencyType 80 { 81 SHARED_DEPENDENCY_PIN = 'p', 82 SHARED_DEPENDENCY_OWNER = 'o', 83 SHARED_DEPENDENCY_ACL = 'a', 84 SHARED_DEPENDENCY_POLICY = 'r', 85 SHARED_DEPENDENCY_TABLESPACE = 't', 86 SHARED_DEPENDENCY_INVALID = 0 87 } SharedDependencyType; 88 89 /* expansible list of ObjectAddresses (private in dependency.c) */ 90 typedef struct ObjectAddresses ObjectAddresses; 91 92 /* 93 * This enum covers all system catalogs whose OIDs can appear in 94 * pg_depend.classId or pg_shdepend.classId. Keep object_classes[] in sync. 95 */ 96 typedef enum ObjectClass 97 { 98 OCLASS_CLASS, /* pg_class */ 99 OCLASS_PROC, /* pg_proc */ 100 OCLASS_TYPE, /* pg_type */ 101 OCLASS_CAST, /* pg_cast */ 102 OCLASS_COLLATION, /* pg_collation */ 103 OCLASS_CONSTRAINT, /* pg_constraint */ 104 OCLASS_CONVERSION, /* pg_conversion */ 105 OCLASS_DEFAULT, /* pg_attrdef */ 106 OCLASS_LANGUAGE, /* pg_language */ 107 OCLASS_LARGEOBJECT, /* pg_largeobject */ 108 OCLASS_OPERATOR, /* pg_operator */ 109 OCLASS_OPCLASS, /* pg_opclass */ 110 OCLASS_OPFAMILY, /* pg_opfamily */ 111 OCLASS_AM, /* pg_am */ 112 OCLASS_AMOP, /* pg_amop */ 113 OCLASS_AMPROC, /* pg_amproc */ 114 OCLASS_REWRITE, /* pg_rewrite */ 115 OCLASS_TRIGGER, /* pg_trigger */ 116 OCLASS_SCHEMA, /* pg_namespace */ 117 OCLASS_STATISTIC_EXT, /* pg_statistic_ext */ 118 OCLASS_TSPARSER, /* pg_ts_parser */ 119 OCLASS_TSDICT, /* pg_ts_dict */ 120 OCLASS_TSTEMPLATE, /* pg_ts_template */ 121 OCLASS_TSCONFIG, /* pg_ts_config */ 122 OCLASS_ROLE, /* pg_authid */ 123 OCLASS_DATABASE, /* pg_database */ 124 OCLASS_TBLSPACE, /* pg_tablespace */ 125 OCLASS_FDW, /* pg_foreign_data_wrapper */ 126 OCLASS_FOREIGN_SERVER, /* pg_foreign_server */ 127 OCLASS_USER_MAPPING, /* pg_user_mapping */ 128 OCLASS_DEFACL, /* pg_default_acl */ 129 OCLASS_EXTENSION, /* pg_extension */ 130 OCLASS_EVENT_TRIGGER, /* pg_event_trigger */ 131 OCLASS_POLICY, /* pg_policy */ 132 OCLASS_PUBLICATION, /* pg_publication */ 133 OCLASS_PUBLICATION_REL, /* pg_publication_rel */ 134 OCLASS_SUBSCRIPTION, /* pg_subscription */ 135 OCLASS_TRANSFORM /* pg_transform */ 136 } ObjectClass; 137 138 #define LAST_OCLASS OCLASS_TRANSFORM 139 140 /* flag bits for performDeletion/performMultipleDeletions: */ 141 #define PERFORM_DELETION_INTERNAL 0x0001 /* internal action */ 142 #define PERFORM_DELETION_CONCURRENTLY 0x0002 /* concurrent drop */ 143 #define PERFORM_DELETION_QUIETLY 0x0004 /* suppress notices */ 144 #define PERFORM_DELETION_SKIP_ORIGINAL 0x0008 /* keep original obj */ 145 #define PERFORM_DELETION_SKIP_EXTENSIONS 0x0010 /* keep extensions */ 146 #define PERFORM_DELETION_CONCURRENT_LOCK 0x0020 /* normal drop with 147 * concurrent lock mode */ 148 149 150 /* in dependency.c */ 151 152 extern void AcquireDeletionLock(const ObjectAddress *object, int flags); 153 154 extern void ReleaseDeletionLock(const ObjectAddress *object); 155 156 extern void performDeletion(const ObjectAddress *object, 157 DropBehavior behavior, int flags); 158 159 extern void performMultipleDeletions(const ObjectAddresses *objects, 160 DropBehavior behavior, int flags); 161 162 extern void recordDependencyOnExpr(const ObjectAddress *depender, 163 Node *expr, List *rtable, 164 DependencyType behavior); 165 166 extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, 167 Node *expr, Oid relId, 168 DependencyType behavior, 169 DependencyType self_behavior, 170 bool reverse_self); 171 172 extern ObjectClass getObjectClass(const ObjectAddress *object); 173 174 extern ObjectAddresses *new_object_addresses(void); 175 176 extern void add_exact_object_address(const ObjectAddress *object, 177 ObjectAddresses *addrs); 178 179 extern bool object_address_present(const ObjectAddress *object, 180 const ObjectAddresses *addrs); 181 182 extern void record_object_address_dependencies(const ObjectAddress *depender, 183 ObjectAddresses *referenced, 184 DependencyType behavior); 185 186 extern void sort_object_addresses(ObjectAddresses *addrs); 187 188 extern void free_object_addresses(ObjectAddresses *addrs); 189 190 /* in pg_depend.c */ 191 192 extern void recordDependencyOn(const ObjectAddress *depender, 193 const ObjectAddress *referenced, 194 DependencyType behavior); 195 196 extern void recordMultipleDependencies(const ObjectAddress *depender, 197 const ObjectAddress *referenced, 198 int nreferenced, 199 DependencyType behavior); 200 201 extern void recordDependencyOnCurrentExtension(const ObjectAddress *object, 202 bool isReplace); 203 204 extern long deleteDependencyRecordsFor(Oid classId, Oid objectId, 205 bool skipExtensionDeps); 206 207 extern long deleteDependencyRecordsForClass(Oid classId, Oid objectId, 208 Oid refclassId, char deptype); 209 210 extern long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId, 211 char deptype, 212 Oid refclassId, Oid refobjectId); 213 214 extern long changeDependencyFor(Oid classId, Oid objectId, 215 Oid refClassId, Oid oldRefObjectId, 216 Oid newRefObjectId); 217 218 extern long changeDependenciesOf(Oid classId, Oid oldObjectId, 219 Oid newObjectId); 220 221 extern long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, 222 Oid newRefObjectId); 223 224 extern Oid getExtensionOfObject(Oid classId, Oid objectId); 225 extern List *getAutoExtensionsOfObject(Oid classId, Oid objectId); 226 227 extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId); 228 extern List *getOwnedSequences(Oid relid); 229 extern Oid getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok); 230 231 extern Oid get_constraint_index(Oid constraintId); 232 233 extern Oid get_index_constraint(Oid indexId); 234 235 extern List *get_index_ref_constraints(Oid indexId); 236 237 /* in pg_shdepend.c */ 238 239 extern void recordSharedDependencyOn(ObjectAddress *depender, 240 ObjectAddress *referenced, 241 SharedDependencyType deptype); 242 243 extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, 244 int32 objectSubId); 245 246 extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner); 247 248 extern void changeDependencyOnOwner(Oid classId, Oid objectId, 249 Oid newOwnerId); 250 251 extern void recordDependencyOnTablespace(Oid classId, Oid objectId, 252 Oid tablespace); 253 254 extern void changeDependencyOnTablespace(Oid classId, Oid objectId, 255 Oid newTablespaceId); 256 257 extern void updateAclDependencies(Oid classId, Oid objectId, int32 objectSubId, 258 Oid ownerId, 259 int noldmembers, Oid *oldmembers, 260 int nnewmembers, Oid *newmembers); 261 262 extern bool checkSharedDependencies(Oid classId, Oid objectId, 263 char **detail_msg, char **detail_log_msg); 264 265 extern void shdepLockAndCheckObject(Oid classId, Oid objectId); 266 267 extern void copyTemplateDependencies(Oid templateDbId, Oid newDbId); 268 269 extern void dropDatabaseDependencies(Oid databaseId); 270 271 extern void shdepDropOwned(List *relids, DropBehavior behavior); 272 273 extern void shdepReassignOwned(List *relids, Oid newrole); 274 275 #endif /* DEPENDENCY_H */ 276