diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-04-07 00:30:41 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-04-07 00:30:41 +0000 |
commit | 891039c15f0d0a0a7adba71a7ceb77fa74bb3b9c (patch) | |
tree | cf966484d507481eef82678fc1696515b3f97087 /src/backend/executor/nodeTidscan.c | |
parent | a25a4907186689c27ad26db122b4438265eeae8c (diff) | |
download | postgresql-891039c15f0d0a0a7adba71a7ceb77fa74bb3b9c.tar.gz postgresql-891039c15f0d0a0a7adba71a7ceb77fa74bb3b9c.zip |
Partial fix for EvalPlanQual bugs reported by Magnus Hagander, 3-Apr.
Ensure that outer tuple link needed for inner indexscan qual evaluation
gets set in the EvalPlanQual case. This stops coredump, but we still
have resource leaks due to failure to clean up EvalPlanQual properly...
Diffstat (limited to 'src/backend/executor/nodeTidscan.c')
-rw-r--r-- | src/backend/executor/nodeTidscan.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 36159ad4abe..7d9c6748637 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.4 2000/01/26 05:56:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.5 2000/04/07 00:30:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -109,8 +109,10 @@ TidNext(TidScan *node) if (estate->es_evTupleNull[node->scan.scanrelid - 1]) return slot; /* return empty slot */ + /* probably ought to use ExecStoreTuple here... */ slot->val = estate->es_evTuple[node->scan.scanrelid - 1]; slot->ttc_shouldFree = false; + /* Flag for the next call that no more tuples */ estate->es_evTupleNull[node->scan.scanrelid - 1] = true; return (slot); @@ -255,7 +257,6 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent) { EState *estate; TidScanState *tidstate; - Plan *outerPlan; ItemPointer *tidList; tidstate = node->tidstate; @@ -263,30 +264,22 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent) tidstate->tss_TidPtr = -1; tidList = tidstate->tss_TidList; - if ((outerPlan = outerPlan((Plan *) node)) != NULL) + /* If we are being passed an outer tuple, save it for runtime key calc */ + if (exprCtxt != NULL) + node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple = + exprCtxt->ecxt_outertuple; + + /* If this is re-scanning of PlanQual ... */ + if (estate->es_evTuple != NULL && + estate->es_evTuple[node->scan.scanrelid - 1] != NULL) { - /* we are scanning a subplan */ - outerPlan = outerPlan((Plan *) node); - ExecReScan(outerPlan, exprCtxt, parent); + estate->es_evTupleNull[node->scan.scanrelid - 1] = false; + return; } - else - /* otherwise, we are scanning a relation */ - { - /* 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; - } - /* it's possible in subselects */ - if (exprCtxt == NULL) - exprCtxt = node->scan.scanstate->cstate.cs_ExprContext; - - node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple = exprCtxt->ecxt_outertuple; - tidstate->tss_NumTids = TidListCreate(node->tideval, exprCtxt, tidList); - } + tidstate->tss_NumTids = TidListCreate(node->tideval, + node->scan.scanstate->cstate.cs_ExprContext, + tidList); /* ---------------- * perhaps return something meaningful |