diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index ea586f899a..d77a4d9613 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -55,7 +55,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.63 2007/10/24 20:55:36 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.64 2007/10/25 14:45:55 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1994,6 +1994,9 @@ do_autovacuum(void)
 		autovac_table *tab;
 		WorkerInfo	worker;
 		bool        skipit;
+		char	   *datname,
+				   *nspname,
+				   *relname;
 
 		CHECK_FOR_INTERRUPTS();
 
@@ -2094,6 +2097,17 @@ next_worker:
 			LWLockRelease(ProcArrayLock);
 		}
 
+		/*
+		 * Save the relation name for a possible error message, to avoid a
+		 * catalog lookup in case of an error.  We do it in
+		 * TopTransactionContext so that they go away automatically in the next
+		 * iteration.
+		 */
+		MemoryContextSwitchTo(TopTransactionContext);
+		datname = get_database_name(MyDatabaseId);
+		nspname = get_namespace_name(get_rel_namespace(tab->at_relid));
+		relname = get_rel_name(tab->at_relid);
+
 		/*
 		 * We will abort vacuuming the current table if something errors out,
 		 * and continue with the next one in schedule; in particular, this
@@ -2102,7 +2116,6 @@ next_worker:
 		PG_TRY();
 		{
 			/* have at it */
-			MemoryContextSwitchTo(TopTransactionContext);
 			autovacuum_do_vac_analyze(tab->at_relid,
 									  tab->at_dovacuum,
 									  tab->at_doanalyze,
@@ -2118,14 +2131,10 @@ next_worker:
 			HOLD_INTERRUPTS();
 			if (tab->at_dovacuum)
 				errcontext("automatic vacuum of table \"%s.%s.%s\"",
-						   get_database_name(MyDatabaseId),
-						   get_namespace_name(get_rel_namespace(tab->at_relid)),
-						   get_rel_name(tab->at_relid));
+						   datname, nspname, relname);
 			else
 				errcontext("automatic analyze of table \"%s.%s.%s\"",
-						   get_database_name(MyDatabaseId),
-						   get_namespace_name(get_rel_namespace(tab->at_relid)),
-						   get_rel_name(tab->at_relid));
+						   datname, nspname, relname);
 			EmitErrorReport();
 
 			/* this resets the PGPROC flags too */
@@ -2139,13 +2148,7 @@ next_worker:
 		}
 		PG_END_TRY();
 
-		/* reset my PGPROC flag */
-		if (tab->at_wraparound)
-		{
-			LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
-			MyProc->vacuumFlags &= ~PROC_VACUUM_FOR_WRAPAROUND;
-			LWLockRelease(ProcArrayLock);
-		}
+		/* the PGPROC flags are reset at the next end of transaction */
 
 		/* be tidy */
 		pfree(tab);