From 9c71a1ff4921dd688082125ba0ce83db82e822b1 Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Date: Mon, 31 Aug 2026 11:00:50 +0530
Subject: [PATCH v20260901 2/4] Duplicate code in performDeletion() and
 performMultipleDeletions()

The calls to reportDependentObjects() and deleteObjectsInList() are
duplicated in both the above functions. Move them into a common function
performDeletionInternal() which is called from these two.

If we want to add more code to the performDeletion protocol, as we would
do for property graph related deletes, a common function helps.

Author: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Discussion: https://postgr.es/m/dqa5mstx5mna3i7s23pdwl4m6bek7gqsgfccef44wjpswizufi@3aa6vzri3cat
---
 src/backend/catalog/dependency.c | 54 +++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index 55ee42f8dfc..eaa524dcbc9 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -156,6 +156,10 @@ static void findDependentObjects(const ObjectAddress *object,
 								 ObjectAddresses *targetObjects,
 								 const ObjectAddresses *pendingObjects,
 								 Relation *depRel);
+static void performDeletionInternal(ObjectAddresses *targetObjects,
+									DropBehavior behavior, int flags,
+									const ObjectAddress *origObject,
+									Relation depRel);
 static void reportDependentObjects(const ObjectAddresses *targetObjects,
 								   DropBehavior behavior,
 								   int flags,
@@ -308,16 +312,7 @@ performDeletion(const ObjectAddress *object,
 						 NULL,	/* no pendingObjects */
 						 &depRel);
 
-	/*
-	 * Check if deletion is allowed, and report about cascaded deletes.
-	 */
-	reportDependentObjects(targetObjects,
-						   behavior,
-						   flags,
-						   object);
-
-	/* do the deed */
-	deleteObjectsInList(targetObjects, &depRel, flags);
+	performDeletionInternal(targetObjects, behavior, flags, object, depRel);
 
 	/* And clean up */
 	free_object_addresses(targetObjects);
@@ -381,24 +376,39 @@ performMultipleDeletions(const ObjectAddresses *objects,
 							 &depRel);
 	}
 
+	performDeletionInternal(targetObjects, behavior, flags,
+							(objects->numrefs == 1 ? objects->refs : NULL),
+							depRel);
+
+	/* And clean up */
+	free_object_addresses(targetObjects);
+
+	table_close(depRel, RowExclusiveLock);
+}
+
+/*
+ * Complete deletion after the dependency closure has been built.
+ *
+ *	targetObjects: list of objects that are scheduled to be deleted
+ *	behavior: same as performDeletion()
+ *	flags: same as performDeletion()
+ *	origObject: original deletion target, or NULL if there is more than one
+ *	depRel: already opened pg_depend relation, which may be reopened by
+ *		deleteObjectsInList() if needed.
+ */
+static void
+performDeletionInternal(ObjectAddresses *targetObjects,
+						DropBehavior behavior, int flags,
+						const ObjectAddress *origObject, Relation depRel)
+{
+
 	/*
 	 * Check if deletion is allowed, and report about cascaded deletes.
-	 *
-	 * If there's exactly one object being deleted, report it the same way as
-	 * in performDeletion(), else we have to be vaguer.
 	 */
-	reportDependentObjects(targetObjects,
-						   behavior,
-						   flags,
-						   (objects->numrefs == 1 ? objects->refs : NULL));
+	reportDependentObjects(targetObjects, behavior, flags, origObject);
 
 	/* do the deed */
 	deleteObjectsInList(targetObjects, &depRel, flags);
-
-	/* And clean up */
-	free_object_addresses(targetObjects);
-
-	table_close(depRel, RowExclusiveLock);
 }
 
 /*
-- 
2.34.1

