]> granicus.if.org Git - postgresql/commitdiff
Fixes: Growing backend when using nested function calls
authorMarc G. Fournier <scrappy@hub.org>
Thu, 24 Oct 1996 07:59:46 +0000 (07:59 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Thu, 24 Oct 1996 07:59:46 +0000 (07:59 +0000)
Submitted by: wieck@sapserv.debis.de (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;