aboutsummaryrefslogtreecommitdiff
path: root/src/backend/catalog/dependency.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/catalog/dependency.c')
-rw-r--r--src/backend/catalog/dependency.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index 0c91536c6c3..3187c9ca5e7 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -549,17 +549,21 @@ findDependentObjects(const ObjectAddress *object,
* another object, or is part of the extension that is the
* other object. We have three cases:
*
- * 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.
+ * 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.
*/
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))
{
@@ -568,6 +572,21 @@ 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),