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