]> granicus.if.org Git - postgresql/commitdiff
Reset per-tuple memory context between every row in a scan node, even when
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 21 May 2011 18:30:11 +0000 (14:30 -0400)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 21 May 2011 18:30:11 +0000 (14:30 -0400)
there's no quals or projections. Currently this only matters for foreign
scans, as none of the other scan nodes litter the per-tuple memory context
when there's no quals or projections.

src/backend/executor/execScan.c

index 5089616f5953c7664afff372cb3962936224bc36..e90058847d9de9bb8554dd5548607429b1694b1d 100644 (file)
@@ -120,13 +120,17 @@ ExecScan(ScanState *node,
         */
        qual = node->ps.qual;
        projInfo = node->ps.ps_ProjInfo;
+       econtext = node->ps.ps_ExprContext;
 
        /*
         * If we have neither a qual to check nor a projection to do, just skip
         * all the overhead and return the raw scan tuple.
         */
        if (!qual && !projInfo)
+       {
+               ResetExprContext(econtext);
                return ExecScanFetch(node, accessMtd, recheckMtd);
+       }
 
        /*
         * Check to see if we're still projecting out tuples from a previous scan
@@ -148,7 +152,6 @@ ExecScan(ScanState *node,
         * storage allocated in the previous tuple cycle.  Note this can't happen
         * until we're done projecting out tuples from a scan tuple.
         */
-       econtext = node->ps.ps_ExprContext;
        ResetExprContext(econtext);
 
        /*