diff options
| author | Tom Lane | 1999-03-03 00:02:42 +0000 |
|---|---|---|
| committer | Tom Lane | 1999-03-03 00:02:42 +0000 |
| commit | e0345e09bf420833ce0647c616414a2913148f1e (patch) | |
| tree | 7b94d17e81719dfe431dfc9ce099bfa1d58b0549 /src/backend/optimizer | |
| parent | b204d10c79b5177026565a0db531a86f585f09f4 (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.c | 13 |
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); |
