From 42ad25fcd139253912dcee8628f866fbf023ae27 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Tue, 6 Jun 2000 17:44:25 +0000 Subject: [PATCH] init_fcache was being careless about using SearchSysCacheTuple result 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 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/cache/fcache.c b/src/backend/utils/cache/fcache.c index 33528d7bb20..867de40baa9 100644 --- a/src/backend/utils/cache/fcache.c +++ b/src/backend/utils/cache/fcache.c @@ -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; } -- GitLab