Fixes: Growing backend when using nested function calls

Submitted by: wieck@sapserv.debis.de (Jan Wieck)
This commit is contained in:
Marc G. Fournier 1996-10-24 07:59:46 +00:00
parent 20b4c46e26
commit f6f8ca4970
1 changed files with 32 additions and 1 deletions

View File

@ -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;