From 74f933a648bf7939799898030bb774059e6e591b Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Tue, 20 Jan 2009 12:17:29 +0000
Subject: [PATCH] Fix erroneous memory context switch in autovacuum, which was
 returning to a context long after it had been destroyed.

Per problem report from Justin Pasher.  Patch by Tom Lane and me.

8.3 and later do not have this bug, because this code has been restructured for
unrelated reasons.  In 8.2 it does not manifest as a crash, but it still seems
safer fixing it nonetheless.
---
 src/backend/postmaster/autovacuum.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0e59974b0af..31baa5978fb 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.5.2.8 2008/01/17 23:47:07 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.5.2.9 2009/01/20 12:17:29 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -925,13 +925,12 @@ autovacuum_do_vac_analyze(List *relids, bool dovacuum, bool doanalyze,
 						  bool freeze)
 {
 	VacuumStmt *vacstmt;
-	MemoryContext old_cxt;
 
 	/*
 	 * The node must survive transaction boundaries, so make sure we create it
 	 * in a long-lived context
 	 */
-	old_cxt = MemoryContextSwitchTo(AutovacMemCxt);
+	MemoryContextSwitchTo(AutovacMemCxt);
 
 	vacstmt = makeNode(VacuumStmt);
 
@@ -957,7 +956,9 @@ autovacuum_do_vac_analyze(List *relids, bool dovacuum, bool doanalyze,
 	vacuum(vacstmt, relids);
 
 	pfree(vacstmt);
-	MemoryContextSwitchTo(old_cxt);
+
+	/* Make sure we end up pointing to the long-lived context at exit */
+	MemoryContextSwitchTo(AutovacMemCxt);
 }
 
 /*