]> granicus.if.org Git - postgresql/commitdiff
init_fcache was being careless about using SearchSysCacheTuple result
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jun 2000 17:44:25 +0000 (17:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jun 2000 17:44:25 +0000 (17:44 +0000)
over multiple lookups --- it should use SearchSysCacheTupleCopy instead.
This accounts for rare failures like 'init_fcache: null probin for procedure 481'
when running concurrently with a VACUUM.

src/backend/utils/cache/fcache.c

index 33528d7bb20b8ff98438bc996b9fb11a89f1ffa0..867de40baa92e0332d3c60e70c7974ad98eda7cd 100644 (file)
@@ -8,12 +8,13 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.31 2000/05/28 17:56:06 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.32 2000/06/06 17:44:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 
+#include "access/heapam.h"
 #include "catalog/pg_language.h"
 #include "catalog/pg_proc.h"
 #include "catalog/pg_type.h"
@@ -77,11 +78,13 @@ init_fcache(Oid foid,
 
        /* ----------------
         *       get the procedure tuple corresponding to the given functionOid
+        *
+        *       NB: use SearchSysCacheTupleCopy to ensure tuple lives long enough
         * ----------------
         */
-       procedureTuple = SearchSysCacheTuple(PROCOID,
-                                                                                ObjectIdGetDatum(foid),
-                                                                                0, 0, 0);
+       procedureTuple = SearchSysCacheTupleCopy(PROCOID,
+                                                                                        ObjectIdGetDatum(foid),
+                                                                                        0, 0, 0);
 
        if (!HeapTupleIsValid(procedureTuple))
                elog(ERROR, "init_fcache: Cache lookup failed for procedure %u",
@@ -245,6 +248,8 @@ init_fcache(Oid foid,
        else
                retval->func.fn_addr = (PGFunction) NULL;
 
+       heap_freetuple(procedureTuple);
+
        return retval;
 }