On Wed, Dec 25, 2019 at 12:24:10PM +0900, Michael Paquier wrote:
> Arf.  Yes, this had better be isAnyTempNamespace() so as we complain
> about all of them.

Okay, finally coming back to that.  Attached is an updated patch with
polished comments and the fixed logic.
--
Michael
diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c
index be7a40d5d2..f5b1a662a7 100644
--- a/src/backend/commands/dropcmds.c
+++ b/src/backend/commands/dropcmds.c
@@ -101,6 +101,21 @@ RemoveObjects(DropStmt *stmt)
 						 errhint("Use DROP AGGREGATE to drop aggregate functions.")));
 		}
 
+		/*
+		 * Prevent the drop of a temporary schema, be it owned by the current
+		 * session or another backend as this would mess up with the callback
+		 * registered to clean up temporary objects at the end of a session.
+		 * Note also that the creation of any follow-up temporary object would
+		 * result in inconsistencies within the session whose temporary schema
+		 * has been dropped.
+		 */
+		if (stmt->removeType == OBJECT_SCHEMA &&
+			isAnyTempNamespace(address.objectId))
+			ereport(ERROR,
+					(errcode(ERRCODE_WRONG_OBJECT_TYPE),
+					 errmsg("cannot drop temporary namespace \"%s\"",
+							get_namespace_name(address.objectId))));
+
 		/* Check permissions. */
 		namespaceId = get_object_namespace(&address);
 		if (!OidIsValid(namespaceId) ||

Attachment: signature.asc
Description: PGP signature

Reply via email to