diff options
-rw-r--r-- | src/backend/catalog/pg_type.c | 14 |
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)) |