mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Fixes: Growing backend when using nested function calls
Submitted by: wieck@sapserv.debis.de (Jan Wieck)
This commit is contained in:
parent
20b4c46e26
commit
f6f8ca4970
33
src/backend/utils/cache/catcache.c
vendored
33
src/backend/utils/cache/catcache.c
vendored
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user