diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-05-08 19:47:02 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-05-08 19:47:02 +0000 |
commit | 5708a56729dcf4d75feb6cdb8c9ffb45147738e9 (patch) | |
tree | 22c2b62d1e0fc5117780de826d154bb7bd424e31 /src/backend/executor/nodeAppend.c | |
parent | c3fa600d8cb773d032f199990455eaab0ead5c0c (diff) | |
download | postgresql-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.c | 23 |
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; |