From e0345e09bf420833ce0647c616414a2913148f1e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 3 Mar 1999 00:02:42 +0000 Subject: [PATCH] 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. --- src/backend/nodes/copyfuncs.c | 12 ++++++++---- src/backend/optimizer/plan/subselect.c | 13 +++++++------ src/include/optimizer/subselect.h | 1 + 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 8f8e65c374..426a953891 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 3e190c307c..5e1606bd2e 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 2394694907..6180b409ea 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 */