diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index 0c132d5fc09deaa0ae5bbf58f9e56abb6322a2f2..76441be73d6a7f97f5b7afecd36c746ab3ec7aaa 100644
--- a/src/backend/access/index/indexam.c
+++ b/src/backend/access/index/indexam.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.110 2008/09/11 14:01:09 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.111 2008/10/10 14:17:08 tgl Exp $
  *
  * INTERFACE ROUTINES
  *		index_open		- open an index relation by relation OID
@@ -655,6 +655,7 @@ index_getbitmap(IndexScanDesc scan, TIDBitmap *bitmap)
 {
 	FmgrInfo   *procedure;
 	int64		ntids;
+	Datum		d;
 
 	SCAN_CHECKS;
 	GET_SCAN_PROCEDURE(amgetbitmap);
@@ -665,9 +666,16 @@ index_getbitmap(IndexScanDesc scan, TIDBitmap *bitmap)
 	/*
 	 * have the am's getbitmap proc do all the work.
 	 */
-	ntids = DatumGetInt64(FunctionCall2(procedure,
-										PointerGetDatum(scan),
-										PointerGetDatum(bitmap)));
+	d = FunctionCall2(procedure,
+					  PointerGetDatum(scan),
+					  PointerGetDatum(bitmap));
+
+	ntids = DatumGetInt64(d);
+
+	/* If int8 is pass-by-ref, must free the result to avoid memory leak */
+#ifndef USE_FLOAT8_BYVAL
+	pfree(DatumGetPointer(d));
+#endif
 
 	pgstat_count_index_tuples(scan->indexRelation, ntids);