OSDN Git Service

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 f8b4b89..114f610 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 54dec2d..5eb0af0 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;
 }