diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c
index 103f02ecc0c9e32b7ef99084059354ed61621a8a..1bd02f839ad42236df3bdd5e1966495c7cc470f8 100644
--- a/src/backend/access/index/genam.c
+++ b/src/backend/access/index/genam.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/access/index/genam.c,v 1.23 2000/01/26 05:55:57 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/access/index/genam.c,v 1.24 2000/03/14 23:52:01 tgl Exp $
  *
  * NOTES
  *	  many of the old access method routines have been turned into
@@ -114,6 +114,9 @@ RelationGetIndexScan(Relation relation,
 	ItemPointerSetInvalid(&scan->currentMarkData);
 	ItemPointerSetInvalid(&scan->nextMarkData);
 
+	/* mark cached function lookup data invalid; it will be set on first use */
+	scan->fn_getnext.fn_oid = InvalidOid;
+
 	if (numberOfKeys > 0)
 		scan->keyData = (ScanKey) palloc(sizeof(ScanKeyData) * numberOfKeys);
 	else
diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index f4f0d25768b3633ab88077a4eec943c7fcc7f820..2335693119829d6fc289c165b1b57b41361f6f72 100644
--- a/src/backend/access/index/indexam.c
+++ b/src/backend/access/index/indexam.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.40 2000/01/26 05:55:57 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.41 2000/03/14 23:52:01 tgl Exp $
  *
  * INTERFACE ROUTINES
  *		index_open		- open an index relation by relationId
@@ -329,17 +329,28 @@ RetrieveIndexResult
 index_getnext(IndexScanDesc scan,
 			  ScanDirection direction)
 {
-	RegProcedure procedure;
 	RetrieveIndexResult result;
 
 	SCAN_CHECKS;
-	GET_SCAN_PROCEDURE(getnext, amgettuple);
+
+	/* ----------------
+	 *	Look up the access procedure only once per scan.
+	 * ----------------
+	 */
+	if (scan->fn_getnext.fn_oid == InvalidOid)
+	{
+		RegProcedure procedure;
+
+		GET_SCAN_PROCEDURE(getnext, amgettuple);
+		fmgr_info(procedure, &scan->fn_getnext);
+	}
 
 	/* ----------------
 	 *	have the am's gettuple proc do all the work.
 	 * ----------------
 	 */
-	result = (RetrieveIndexResult) fmgr(procedure, scan, direction);
+	result = (RetrieveIndexResult)
+		(*fmgr_faddr(&scan->fn_getnext)) (scan, direction);
 
 	return result;
 }
diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h
index c3101bd92f66dc678bb5901e83cafbd0f198684b..19e4e28631d60328427407bf81429ca95d258f9f 100644
--- a/src/include/access/relscan.h
+++ b/src/include/access/relscan.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: relscan.h,v 1.18 2000/01/26 05:57:51 momjian Exp $
+ * $Id: relscan.h,v 1.19 2000/03/14 23:52:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,6 +54,7 @@ typedef struct IndexScanDescData
 	bool		scanFromEnd;	/* restart scan at end? */
 	uint16		numberOfKeys;	/* number of key attributes */
 	ScanKey		keyData;		/* key descriptor */
+	FmgrInfo	fn_getnext;		/* cached lookup info for am's getnext fn */
 } IndexScanDescData;
 
 typedef IndexScanDescData *IndexScanDesc;