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

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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: * Notes:
* XXX This needs to use exception.h to handle recovery when * XXX This needs to use exception.h to handle recovery when
@ -860,6 +860,13 @@ SearchSysCache(struct catcache *cache,
if ((RelationGetRelationTupleForm(relation))->relhasindex if ((RelationGetRelationTupleForm(relation))->relhasindex
&& !IsBootstrapProcessingMode()) && !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); Assert(cache->cc_iscanfunc);
switch(cache->cc_nkeys) switch(cache->cc_nkeys)
{ {
@ -868,22 +875,46 @@ SearchSysCache(struct catcache *cache,
case 2: ntp = cache->cc_iscanfunc(relation,v1,v2); break; case 2: ntp = cache->cc_iscanfunc(relation,v1,v2); break;
case 1: ntp = cache->cc_iscanfunc(relation,v1); 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 else
{ {
HeapScanDesc sd; HeapScanDesc sd;
/* ----------
* As above do the lookup in the callers memory
* context.
* wieck - 10/18/1996
* ----------
*/
MemoryContextSwitchTo(oldcxt);
sd = heap_beginscan(relation, 0, NowTimeQual, sd = heap_beginscan(relation, 0, NowTimeQual,
cache->cc_nkeys, cache->cc_skey); cache->cc_nkeys, cache->cc_skey);
ntp = heap_getnext(sd, 0, &buffer); ntp = heap_getnext(sd, 0, &buffer);
MemoryContextSwitchTo((MemoryContext)CacheCxt);
if (HeapTupleIsValid(ntp)) { if (HeapTupleIsValid(ntp)) {
CACHE1_elog(DEBUG, "SearchSysCache: found tuple"); CACHE1_elog(DEBUG, "SearchSysCache: found tuple");
ntp = heap_copytuple(ntp); ntp = heap_copytuple(ntp);
} }
MemoryContextSwitchTo(oldcxt);
heap_endscan(sd); heap_endscan(sd);
MemoryContextSwitchTo((MemoryContext)CacheCxt);
} }
DisableCache = 0; DisableCache = 0;