From f6f8ca497082dc47758ea6c0757029a0f8abd900 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Thu, 24 Oct 1996 07:59:46 +0000 Subject: [PATCH] Fixes: Growing backend when using nested function calls Submitted by: wieck@sapserv.debis.de (Jan Wieck) --- src/backend/utils/cache/catcache.c | 33 +++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 63fa8c18a4..1e46de1686 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.2 1996/10/13 18:38:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.3 1996/10/24 07:59:46 scrappy Exp $ * * Notes: * XXX This needs to use exception.h to handle recovery when @@ -860,6 +860,13 @@ SearchSysCache(struct catcache *cache, if ((RelationGetRelationTupleForm(relation))->relhasindex && !IsBootstrapProcessingMode()) { + /* ---------- + * Switch back to old memory context so memory not freed + * in the scan function will go away at transaction end. + * wieck - 10/18/1996 + * ---------- + */ + MemoryContextSwitchTo(oldcxt); Assert(cache->cc_iscanfunc); switch(cache->cc_nkeys) { @@ -868,22 +875,46 @@ SearchSysCache(struct catcache *cache, case 2: ntp = cache->cc_iscanfunc(relation,v1,v2); break; case 1: ntp = cache->cc_iscanfunc(relation,v1); break; } + /* ---------- + * Back to Cache context. If we got a tuple copy it + * into our context. + * wieck - 10/18/1996 + * ---------- + */ + MemoryContextSwitchTo((MemoryContext)CacheCxt); + if(HeapTupleIsValid(ntp)) { + ntp = heap_copytuple(ntp); + } } else { HeapScanDesc sd; + /* ---------- + * As above do the lookup in the callers memory + * context. + * wieck - 10/18/1996 + * ---------- + */ + MemoryContextSwitchTo(oldcxt); + sd = heap_beginscan(relation, 0, NowTimeQual, cache->cc_nkeys, cache->cc_skey); ntp = heap_getnext(sd, 0, &buffer); + MemoryContextSwitchTo((MemoryContext)CacheCxt); + if (HeapTupleIsValid(ntp)) { CACHE1_elog(DEBUG, "SearchSysCache: found tuple"); ntp = heap_copytuple(ntp); } + MemoryContextSwitchTo(oldcxt); + heap_endscan(sd); + + MemoryContextSwitchTo((MemoryContext)CacheCxt); } DisableCache = 0;