Remove unnecessary EvalPlanQual support code --- since this plan node
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 May 2001 16:11:58 +0000 (16:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 May 2001 16:11:58 +0000 (16:11 +0000)
type never scans a relation directly, it can't be an EPQ target.
Explicitly drop subplan's tuple table to ensure we have no buffer pin
leaks.

src/backend/executor/nodeSubqueryscan.c

index 5eb0af0352c1ddeb773d59855a8acdf6fe042ef2..43ca323e786afee2f44c07aff4af8c2d7e80facf 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.7 2001/05/08 19:47:02 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.8 2001/05/15 16:11:58 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -61,28 +61,11 @@ SubqueryNext(SubqueryScan *node)
    estate = node->scan.plan.state;
    subquerystate = (SubqueryScanState *) node->scan.scanstate;
    direction = estate->es_direction;
-   slot = subquerystate->csstate.css_ScanTupleSlot;
 
    /*
-    * Check if we are evaluating PlanQual for tuple of this relation.
-    * Additional checking is not good, but no other way for now. We could
-    * introduce new nodes for this case and handle SubqueryScan -->
-    * NewNode switching in Init/ReScan plan...
+    * We need not support EvalPlanQual here, since we are not scanning
+    * a real relation.
     */
-   if (estate->es_evTuple != NULL &&
-       estate->es_evTuple[node->scan.scanrelid - 1] != NULL)
-   {
-       ExecClearTuple(slot);
-       if (estate->es_evTupleNull[node->scan.scanrelid - 1])
-           return slot;        /* return empty slot */
-
-       ExecStoreTuple(estate->es_evTuple[node->scan.scanrelid - 1],
-                      slot, InvalidBuffer, false);
-
-       /* Flag for the next call that no more tuples */
-       estate->es_evTupleNull[node->scan.scanrelid - 1] = true;
-       return (slot);
-   }
 
    /*
     * get the next tuple from the sub-query
@@ -234,12 +217,16 @@ ExecEndSubqueryScan(SubqueryScan *node)
     */
    ExecEndNode(node->subplan, node->subplan);
 
-   /* XXX we seem to be leaking the sub-EState and tuple table... */
-
+   /*
+    * clean up subquery's tuple table
+    */
    subquerystate->csstate.css_ScanTupleSlot = NULL;
+   ExecDropTupleTable(subquerystate->sss_SubEState->es_tupleTable, true);
+
+   /* XXX we seem to be leaking the sub-EState... */
 
    /*
-    * clean out the tuple table
+    * clean out the upper tuple table
     */
    ExecClearTuple(subquerystate->csstate.cstate.cs_ResultTupleSlot);
 }
@@ -259,14 +246,6 @@ ExecSubqueryReScan(SubqueryScan *node, ExprContext *exprCtxt, Plan *parent)
    subquerystate = (SubqueryScanState *) node->scan.scanstate;
    estate = node->scan.plan.state;
 
-   /* If this is re-scanning of PlanQual ... */
-   if (estate->es_evTuple != NULL &&
-       estate->es_evTuple[node->scan.scanrelid - 1] != NULL)
-   {
-       estate->es_evTupleNull[node->scan.scanrelid - 1] = false;
-       return;
-   }
-
    /*
     * ExecReScan doesn't know about my subplan, so I have to do
     * changed-parameter signaling myself.