Fix small query-lifespan memory leak introduced by 8.4 change in index AM API
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 10 Oct 2008 14:17:08 +0000 (14:17 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 10 Oct 2008 14:17:08 +0000 (14:17 +0000)
for bitmap index scans.  Per report and test case from Kevin Grittner.

src/backend/access/index/indexam.c

index 0c132d5fc09deaa0ae5bbf58f9e56abb6322a2f2..76441be73d6a7f97f5b7afecd36c746ab3ec7aaa 100644 (file)
@@ -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);