aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeAppend.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-05-08 19:47:02 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-05-08 19:47:02 +0000
commit5708a56729dcf4d75feb6cdb8c9ffb45147738e9 (patch)
tree22c2b62d1e0fc5117780de826d154bb7bd424e31 /src/backend/executor/nodeAppend.c
parentc3fa600d8cb773d032f199990455eaab0ead5c0c (diff)
downloadpostgresql-5708a56729dcf4d75feb6cdb8c9ffb45147738e9.tar.gz
postgresql-5708a56729dcf4d75feb6cdb8c9ffb45147738e9.zip
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 :-(
Diffstat (limited to 'src/backend/executor/nodeAppend.c')
-rw-r--r--src/backend/executor/nodeAppend.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index f8b4b89bc93..114f610c486 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -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;