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;
signature.asc
Description: PGP signature
