aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/nodes/copyfuncs.c12
-rw-r--r--src/backend/optimizer/plan/subselect.c13
-rw-r--r--src/include/optimizer/subselect.h1
3 files changed, 16 insertions, 10 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 8f8e65c374a..426a953891f 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.75 1999/03/01 00:10:30 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.76 1999/03/03 00:02:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -30,6 +30,7 @@
#include "catalog/pg_type.h"
#include "storage/lmgr.h"
#include "optimizer/planmain.h"
+#include "optimizer/subselect.h"
/*
* listCopy
@@ -78,8 +79,6 @@ listCopy(List *list)
static void
CopyPlanFields(Plan *from, Plan *newnode)
{
- extern List *SS_pull_subplan(void *expr);
-
newnode->cost = from->cost;
newnode->plan_size = from->plan_size;
newnode->plan_width = from->plan_width;
@@ -93,7 +92,7 @@ CopyPlanFields(Plan *from, Plan *newnode)
newnode->chgParam = listCopy(from->chgParam);
Node_Copy(from, newnode, initPlan);
if (from->subPlan != NULL)
- newnode->subPlan = SS_pull_subplan(newnode->qual);
+ newnode->subPlan = SS_pull_subplan((Node*) newnode->qual);
else
newnode->subPlan = NULL;
newnode->nParamExec = from->nParamExec;
@@ -139,6 +138,11 @@ _copyResult(Result *from)
*/
Node_Copy(from, newnode, resconstantqual);
+ /* We must add subplans in resconstantqual to the new plan's subPlan list
+ */
+ newnode->plan.subPlan = nconc(newnode->plan.subPlan,
+ SS_pull_subplan(newnode->resconstantqual));
+
return newnode;
}
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 3e190c307c8..5e1606bd2e5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -426,6 +426,7 @@ SS_finalize_plan(Plan *plan)
case T_Result:
param_list = set_unioni(param_list,
_finalize_primnode(((Result *) plan)->resconstantqual, &subPlan));
+ /* subPlan is NOT necessarily NULL here ... */
break;
case T_Append:
@@ -503,10 +504,10 @@ SS_finalize_plan(Plan *plan)
}
-List *SS_pull_subplan(void *expr);
+/* Construct a list of all subplans found within the given node tree */
List *
-SS_pull_subplan(void *expr)
+SS_pull_subplan(Node *expr)
{
List *result = NULL;
@@ -524,18 +525,18 @@ SS_pull_subplan(void *expr)
return SS_pull_subplan(((Iter *) expr)->iterexpr);
else if (or_clause(expr) || and_clause(expr) || is_opclause(expr) ||
not_clause(expr) || is_funcclause(expr))
- return SS_pull_subplan(((Expr *) expr)->args);
+ return SS_pull_subplan((Node *) ((Expr *) expr)->args);
else if (IsA(expr, Aggref))
return SS_pull_subplan(((Aggref *) expr)->target);
else if (IsA(expr, ArrayRef))
{
- result = SS_pull_subplan(((ArrayRef *) expr)->refupperindexpr);
+ result = SS_pull_subplan((Node *)((ArrayRef *) expr)->refupperindexpr);
result = nconc(result,
- SS_pull_subplan(((ArrayRef *) expr)->reflowerindexpr));
+ SS_pull_subplan((Node*) ((ArrayRef *) expr)->reflowerindexpr));
result = nconc(result,
SS_pull_subplan(((ArrayRef *) expr)->refexpr));
result = nconc(result,
- SS_pull_subplan(((ArrayRef *) expr)->refassgnexpr));
+ SS_pull_subplan(((ArrayRef *) expr)->refassgnexpr));
}
else if (IsA(expr, TargetEntry))
return SS_pull_subplan(((TargetEntry *) expr)->expr);
diff --git a/src/include/optimizer/subselect.h b/src/include/optimizer/subselect.h
index 2394694907f..6180b409ea8 100644
--- a/src/include/optimizer/subselect.h
+++ b/src/include/optimizer/subselect.h
@@ -16,5 +16,6 @@ extern int PlannerPlanId; /* to assigne unique ID to subquery plans */
extern List *SS_finalize_plan(Plan *plan);
extern Node *SS_replace_correlation_vars(Node *expr);
extern Node *SS_process_sublinks(Node *expr);
+extern List *SS_pull_subplan(Node *expr);
#endif /* SUBSELECT_H */