postgres.git / summary / log / commit / refs

commit    7b96519fe24b6a675b2cd39ed3b89302b8f1fedb
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Wed Oct 12 22:40:09 2011 +0000

    Don't mark auto-generated types as extension members.
    
    Relation rowtypes and automatically-generated array types do not need to
    have their own extension membership dependency entries.  If we create such
    then it becomes more difficult to remove items from an extension, and it's
    also harder for an extension upgrade script to make sure it duplicates the
    dependencies created by the extension's regular installation script.
    
    I changed the code in such a way that this happened in commit
    988cccc620dd8c16d77f88ede167b22056176324, I think because of worries about
    the shell-type-replacement case; but that cure was worse than the disease.
    It would only matter if one extension created a shell type that was
    replaced with an auto-generated type in another extension, which seems
    pretty far-fetched.  Better to make this work unsurprisingly in normal
    cases.
    
    Report and patch by Robert Haas, comment adjustments by me.


src/backend/catalog/pg_type.c | 14 +++++++++----- 1 file 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)) [parent: e0b268fb82fa]