From 6287eb7adc7518bfeff06c94b9ef380bb99c2bea Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Fri, 23 Mar 2007 21:23:13 +0000
Subject: [PATCH] Separate fetch of pg_autovacuum tuple into its own function.

---
 src/backend/postmaster/autovacuum.c | 49 ++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 14 deletions(-)

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 466f03a5f54..e0b63305768 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.35 2007/03/23 20:56:39 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.36 2007/03/23 21:23:13 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -127,6 +127,7 @@ static void test_rel_for_autovac(Oid relid, PgStat_StatTabEntry *tabentry,
 					 List **toast_table_ids);
 static void autovacuum_do_vac_analyze(Oid relid, bool dovacuum,
 						  bool doanalyze, int freeze_min_age);
+static HeapTuple get_pg_autovacuum_tuple_relid(Relation avRel, Oid relid);
 static void autovac_report_activity(VacuumStmt *vacstmt, Oid relid);
 static void avl_sighup_handler(SIGNAL_ARGS);
 static void avlauncher_shutdown(SIGNAL_ARGS);
@@ -933,9 +934,7 @@ do_autovacuum(PgStat_StatDBEntry *dbentry)
 		Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple);
 		Form_pg_autovacuum avForm = NULL;
 		PgStat_StatTabEntry *tabentry;
-		SysScanDesc avScan;
 		HeapTuple	avTup;
-		ScanKeyData entry[1];
 		Oid			relid;
 
 		/* Consider only regular and toast tables. */
@@ -952,16 +951,8 @@ do_autovacuum(PgStat_StatDBEntry *dbentry)
 
 		relid = HeapTupleGetOid(tuple);
 
-		/* See if we have a pg_autovacuum entry for this relation. */
-		ScanKeyInit(&entry[0],
-					Anum_pg_autovacuum_vacrelid,
-					BTEqualStrategyNumber, F_OIDEQ,
-					ObjectIdGetDatum(relid));
-
-		avScan = systable_beginscan(avRel, AutovacuumRelidIndexId, true,
-									SnapshotNow, 1, entry);
-
-		avTup = systable_getnext(avScan);
+		/* Fetch the pg_autovacuum tuple for the relation, if any */
+		avTup = get_pg_autovacuum_tuple_relid(avRel, relid);
 
 		if (HeapTupleIsValid(avTup))
 			avForm = (Form_pg_autovacuum) GETSTRUCT(avTup);
@@ -978,7 +969,8 @@ do_autovacuum(PgStat_StatDBEntry *dbentry)
 		test_rel_for_autovac(relid, tabentry, classForm, avForm,
 							 &vacuum_tables, &toast_table_ids);
 
-		systable_endscan(avScan);
+		if (HeapTupleIsValid(avTup))
+			heap_freetuple(avTup);
 	}
 
 	heap_endscan(relScan);
@@ -1030,6 +1022,35 @@ do_autovacuum(PgStat_StatDBEntry *dbentry)
 	CommitTransactionCommand();
 }
 
+/*
+ * Returns a copy of the pg_autovacuum tuple for the given relid, or NULL if
+ * there isn't any.  avRel is pg_autovacuum, already open and suitably locked.
+ */
+static HeapTuple
+get_pg_autovacuum_tuple_relid(Relation avRel, Oid relid)
+{
+	ScanKeyData entry[1];
+	SysScanDesc avScan;
+	HeapTuple	avTup;
+
+	ScanKeyInit(&entry[0],
+				Anum_pg_autovacuum_vacrelid,
+				BTEqualStrategyNumber, F_OIDEQ,
+				ObjectIdGetDatum(relid));
+
+	avScan = systable_beginscan(avRel, AutovacuumRelidIndexId, true,
+								SnapshotNow, 1, entry);
+
+	avTup = systable_getnext(avScan);
+
+	if (HeapTupleIsValid(avTup))
+		avTup = heap_copytuple(avTup);
+
+	systable_endscan(avScan);
+
+	return avTup;
+}
+
 /*
  * test_rel_for_autovac
  *