aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-10-24 07:59:46 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-10-24 07:59:46 +0000
commitf6f8ca497082dc47758ea6c0757029a0f8abd900 (patch)
tree8a246308cacdd5281d3a00249c560feb388ae760 /src
parent20b4c46e263ca32d97e35aebc1662a9f0fd433fe (diff)
downloadpostgresql-f6f8ca497082dc47758ea6c0757029a0f8abd900.tar.gz
postgresql-f6f8ca497082dc47758ea6c0757029a0f8abd900.zip
Fixes: Growing backend when using nested function calls
Submitted by: wieck@sapserv.debis.de (Jan Wieck)
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/cache/catcache.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 63fa8c18a43..1e46de1686b 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;