On Tue, Jan 07, 2020 at 01:06:08PM -0500, Tom Lane wrote:
> I still agree with Robert that a052f6c is a bad idea.  It's not the case
> that that's blocking "any connected user" from causing an issue.  The
> temp schemas are always owned by the bootstrap superuser, so only a
> superuser could delete them.  All that that patch is doing is preventing
> superusers from doing something that they could reasonably wish to do,
> and that is perfectly safe when there's not concurrent usage of the
> schema.  We are not normally that nanny-ish, and the case for being so
> here seems pretty thin.

Okay, I am running out of arguments then, so attached is a patch to
address things.  I would also prefer if we keep the relation name in
the log even if the namespace is missing.
--
Michael
diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c
index e7891a4418..b3131ab208 100644
--- a/src/backend/commands/dropcmds.c
+++ b/src/backend/commands/dropcmds.c
@@ -101,21 +101,6 @@ 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 schema \"%s\"",
-							get_namespace_name(address.objectId))));
-
 		/* Check permissions. */
 		namespaceId = get_object_namespace(&address);
 		if (!OidIsValid(namespaceId) ||
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index f0e40e36af..f6afe4dbb8 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2250,11 +2250,22 @@ do_autovacuum(void)
 		}
 
 		/* OK, let's delete it */
-		ereport(LOG,
-				(errmsg("autovacuum: dropping orphan temp table \"%s.%s.%s\"",
-						get_database_name(MyDatabaseId),
-						get_namespace_name(classForm->relnamespace),
-						NameStr(classForm->relname))));
+		if (log_min_messages <= LOG)
+		{
+			char       *nspname = get_namespace_name(classForm->relnamespace);
+
+			if (nspname != NULL)
+				ereport(LOG,
+						(errmsg("autovacuum: dropping orphan temp table \"%s.%s.%s\"",
+								get_database_name(MyDatabaseId),
+								get_namespace_name(classForm->relnamespace),
+								NameStr(classForm->relname))));
+			else
+				ereport(LOG,
+						(errmsg("autovacuum: dropping orphan temp table \"%s.(null).%s\" with OID %u",
+								get_database_name(MyDatabaseId),
+								NameStr(classForm->relname), relid)));
+		}
 
 		object.classId = RelationRelationId;
 		object.objectId = relid;

Attachment: signature.asc
Description: PGP signature

Reply via email to