diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 8092381ae5c..193c3dadbf2 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -3902,12 +3902,31 @@ RemoveTempRelationsCallback(int code, Datum arg) /* * Remove all temp tables from the temporary namespace. + * + * If we haven't set up one yet, but one exists from a previous crashed + * backend, clean that one; but only do this once in a session's life. */ void ResetTempTableNamespace(void) { + static bool TempNamespaceCleaned = false; + if (OidIsValid(myTempNamespace)) RemoveTempRelations(myTempNamespace); + else if (MyBackendId != InvalidBackendId && !RecoveryInProgress() && + !TempNamespaceCleaned) + { + char namespaceName[NAMEDATALEN]; + Oid namespaceId; + + snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", + MyBackendId); + namespaceId = get_namespace_oid(namespaceName, true); + if (OidIsValid(namespaceId)) + RemoveTempRelations(namespaceId); + } + + TempNamespaceCleaned = true; }