Remove unnecessary EvalPlanQual support code --- since this plan node

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.
This commit is contained in:
Tom Lane 2001-05-15 16:11:58 +00:00
parent d0e1091cfd
commit 6f3da9ae17
1 changed files with 10 additions and 31 deletions

View File

@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * 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; estate = node->scan.plan.state;
subquerystate = (SubqueryScanState *) node->scan.scanstate; subquerystate = (SubqueryScanState *) node->scan.scanstate;
direction = estate->es_direction; direction = estate->es_direction;
slot = subquerystate->csstate.css_ScanTupleSlot;
/* /*
* Check if we are evaluating PlanQual for tuple of this relation. * We need not support EvalPlanQual here, since we are not scanning
* Additional checking is not good, but no other way for now. We could * a real relation.
* introduce new nodes for this case and handle SubqueryScan -->
* NewNode switching in Init/ReScan plan...
*/ */
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 * get the next tuple from the sub-query
@ -234,12 +217,16 @@ ExecEndSubqueryScan(SubqueryScan *node)
*/ */
ExecEndNode(node->subplan, node->subplan); 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; 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); ExecClearTuple(subquerystate->csstate.cstate.cs_ResultTupleSlot);
} }
@ -259,14 +246,6 @@ ExecSubqueryReScan(SubqueryScan *node, ExprContext *exprCtxt, Plan *parent)
subquerystate = (SubqueryScanState *) node->scan.scanstate; subquerystate = (SubqueryScanState *) node->scan.scanstate;
estate = node->scan.plan.state; 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 * ExecReScan doesn't know about my subplan, so I have to do
* changed-parameter signaling myself. * changed-parameter signaling myself.