]> granicus.if.org Git - postgresql/commitdiff
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);