mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +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
|
* 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user