summaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
authorTom Lane1999-03-03 00:02:42 +0000
committerTom Lane1999-03-03 00:02:42 +0000
commite0345e09bf420833ce0647c616414a2913148f1e (patch)
tree7b94d17e81719dfe431dfc9ce099bfa1d58b0549 /src/backend/optimizer
parentb204d10c79b5177026565a0db531a86f585f09f4 (diff)
Partial fix for copied-plan bugs reported by Hiroshi Inoue:
_copyResult didn't copy subPlan structure completely. _copyAgg is still busted, apparently because of changes from EXCEPT/INTERSECT patch (get_agg_tlist_references is no longer sufficient to find all aggregates). No time to look at that tonight, however.
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/plan/subselect.c13
1 files changed, 7 insertions, 6 deletions
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);