Append and SubqueryScan nodes were not passing changed-parameter signals down
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 May 2001 19:47:02 +0000 (19:47 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 May 2001 19:47:02 +0000 (19:47 +0000)
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 :-(

src/backend/executor/nodeAppend.c
src/backend/executor/nodeSubqueryscan.c

index f8b4b89bc9381db6905e62114e6d31db5d2e89e2..114f610c486d0d124944a7b750cb163fdaca2d0b 100644 (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;
index 54dec2d1eec1aa5539834dbaa7b4d774db72f0cd..5eb0af0352c1ddeb773d59855a8acdf6fe042ef2 100644 (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;
 }