Append and SubqueryScan nodes were not passing changed-parameter signals down

to their children, leading to misbehavior if they had any children that paid
attention to chgParam (most plan node types don't).  Append's bug has been
there a long time, but nobody had noticed because it used to be difficult
to create a query where an Append would be used below the top level of a
plan; so there were never any parameters getting passed down.  SubqueryScan
is new in 7.1 ... and I'd modeled its behavior on Append :-(
This commit is contained in:
Tom Lane 2001-05-08 19:47:02 +00:00
parent c3fa600d8c
commit 5708a56729
2 changed files with 30 additions and 8 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.40 2001/03/22 06:16:12 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.41 2001/05/08 19:47:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -362,14 +362,25 @@ ExecReScanAppend(Append *node, ExprContext *exprCtxt, Plan *parent)
for (i = 0; i < nplans; i++)
{
Plan *rescanNode;
Plan *subnode;
appendstate->as_whichplan = i;
rescanNode = (Plan *) nth(i, node->appendplans);
if (rescanNode->chgParam == NULL)
subnode = (Plan *) nth(i, node->appendplans);
/*
* ExecReScan doesn't know about my subplans, so I have to do
* changed-parameter signaling myself.
*/
if (node->plan.chgParam != NULL)
SetChangedParamList(subnode, node->plan.chgParam);
/*
* if chgParam of subnode is not null then plan will be re-scanned by
* first ExecProcNode.
*/
if (subnode->chgParam == NULL)
{
/* make sure estate is correct for this subnode (needed??) */
appendstate->as_whichplan = i;
exec_append_initialize_next(node);
ExecReScan((Plan *) rescanNode, exprCtxt, (Plan *) node);
ExecReScan(subnode, exprCtxt, (Plan *) node);
}
}
appendstate->as_whichplan = 0;

View File

@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.6 2001/03/22 06:16:13 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.7 2001/05/08 19:47:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -267,7 +267,18 @@ ExecSubqueryReScan(SubqueryScan *node, ExprContext *exprCtxt, Plan *parent)
return;
}
ExecReScan(node->subplan, NULL, node->subplan);
/*
* ExecReScan doesn't know about my subplan, so I have to do
* changed-parameter signaling myself.
*/
if (node->scan.plan.chgParam != NULL)
SetChangedParamList(node->subplan, node->scan.plan.chgParam);
/*
* if chgParam of subnode is not null then plan will be re-scanned by
* first ExecProcNode.
*/
if (node->subplan->chgParam == NULL)
ExecReScan(node->subplan, NULL, node->subplan);
subquerystate->csstate.css_ScanTupleSlot = NULL;
}