Fixes: Growing backend when using nested function calls
authorMarc G. Fournier
Thu, 24 Oct 1996 07:59:46 +0000 (07:59 +0000)
committerMarc G. Fournier
Thu, 24 Oct 1996 07:59:46 +0000 (07:59 +0000)
Submitted by: [email protected] (Jan Wieck)

src/backend/utils/cache/catcache.c

index 63fa8c18a43f868173dd46a6577bcc17c9c6b435..1e46de1686be3c2bc47dfb22909d604ca3744fc9 100644 (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;