From: Tom Lane Date: Tue, 8 May 2001 19:48:02 +0000 (+0000) Subject: Append and SubqueryScan nodes were not passing changed-parameter signals down X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=20c6dc907df0bcf645ca62d062d1d7622f28def7;p=users%2Fbernd%2Fpostgres.git 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 :-( --- diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 0d09ea778e..0a67cf2266 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -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; diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c index 465b7b30c1..aebb5826b3 100644 --- a/src/backend/executor/nodeSubqueryscan.c +++ b/src/backend/executor/nodeSubqueryscan.c @@ -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; }