mirror of https://github.com/postgres/postgres
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:
parent
c3fa600d8c
commit
5708a56729
|
@ -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;
|
||||
|
|
|
@ -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,6 +267,17 @@ ExecSubqueryReScan(SubqueryScan *node, ExprContext *exprCtxt, Plan *parent)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
|
Loading…
Reference in New Issue