2
0

dependency.h 9.5 KB

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