aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/pg_type.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index ea52f67dabb..21d1ef303d7 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -480,7 +480,11 @@ TypeCreate(Oid newTypeOid,
*
* If rebuild is true, we remove existing dependencies and rebuild them
* from scratch. This is needed for ALTER TYPE, and also when replacing
- * a shell type.
+ * a shell type. We don't remove an existing extension dependency, though.
+ * (That means an extension can't absorb a shell type created in another
+ * extension, nor ALTER a type created by another extension. Also, if it
+ * replaces a free-standing shell type or ALTERs a free-standing type,
+ * that type will become a member of the extension.)
*/
void
GenerateTypeDependencies(Oid typeNamespace,
@@ -505,6 +509,7 @@ GenerateTypeDependencies(Oid typeNamespace,
ObjectAddress myself,
referenced;
+ /* If rebuild, first flush old dependencies, except extension deps */
if (rebuild)
{
deleteDependencyRecordsFor(TypeRelationId, typeObjectId, true);
@@ -516,7 +521,7 @@ GenerateTypeDependencies(Oid typeNamespace,
myself.objectSubId = 0;
/*
- * Make dependency on namespace and shared dependency on owner.
+ * Make dependencies on namespace, owner, extension.
*
* For a relation rowtype (that's not a composite type), we should skip
* these because we'll depend on them indirectly through the pg_class
@@ -532,10 +537,9 @@ GenerateTypeDependencies(Oid typeNamespace,
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
recordDependencyOnOwner(TypeRelationId, typeObjectId, owner);
- }
- /* dependency on extension */
- recordDependencyOnCurrentExtension(&myself, rebuild);
+ recordDependencyOnCurrentExtension(&myself, rebuild);
+ }
/* Normal dependencies on the I/O functions */
if (OidIsValid(inputProcedure))