diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 4539c1828e..5d57dbd653 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -588,29 +588,43 @@ findDependentObjects(const ObjectAddress *object, case DEPENDENCY_AUTO: /* no problem */ break; - case DEPENDENCY_INTERNAL: + case DEPENDENCY_EXTENSION: + /* + * If the other object is the extension currently being + * created/altered, ignore this dependency and continue with + * the deletion. This allows dropping of an extension's + * objects within the extension's scripts, as well as corner + * cases such as dropping a transient object created within + * such a script. + */ + if (creating_extension && + otherObject.classId == ExtensionRelationId && + otherObject.objectId == CurrentExtensionObject) + break; + + /* Otherwise, treat this like an internal dependency */ + /* FALL THRU */ + + case DEPENDENCY_INTERNAL: + /* * This object is part of the internal implementation of * another object, or is part of the extension that is the * other object. We have three cases: * - * 1. At the outermost recursion level, we normally disallow - * the DROP. (We just ereport here, rather than proceeding, - * since no other dependencies are likely to be interesting.) - * However, there are exceptions. + * 1. At the outermost recursion level, disallow the DROP. (We + * just ereport here, rather than proceeding, since no other + * dependencies are likely to be interesting.) However, if + * the owning object is listed in pendingObjects, just release + * the caller's lock and return; we'll eventually complete the + * DROP when we reach that entry in the pending list. */ if (stack == NULL) { char *otherObjDesc; - /* - * Exception 1a: if the owning object is listed in - * pendingObjects, just release the caller's lock and - * return. We'll eventually complete the DROP when we - * reach that entry in the pending list. - */ if (pendingObjects && object_address_present(&otherObject, pendingObjects)) { @@ -619,21 +633,6 @@ findDependentObjects(const ObjectAddress *object, ReleaseDeletionLock(object); return; } - - /* - * Exception 1b: if the owning object is the extension - * currently being created/altered, it's okay to continue - * with the deletion. This allows dropping of an - * extension's objects within the extension's scripts, as - * well as corner cases such as dropping a transient - * object created within such a script. - */ - if (creating_extension && - otherObject.classId == ExtensionRelationId && - otherObject.objectId == CurrentExtensionObject) - break; - - /* No exception applies, so throw the error */ otherObjDesc = getObjectDescription(&otherObject); ereport(ERROR, (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),