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);
 
    /*