From: Tom Lane Date: Thu, 27 Jul 2000 23:53:29 +0000 (+0000) Subject: Back-patch primary fix for planner recursion bug. X-Git-Tag: REL7_0_3~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=91319022c44b466a286892485baed0a5f69d5d62;p=thirdparty%2Fpostgresql.git Back-patch primary fix for planner recursion bug. --- diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index a92d439ee52..dd5a44ffc99 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.79 2000/04/12 17:15:22 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.79.2.1 2000/07/27 23:53:29 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -53,6 +53,22 @@ Plan * planner(Query *parse) { Plan *result_plan; + Index save_PlannerQueryLevel; + List *save_PlannerInitPlan; + List *save_PlannerParamVar; + int save_PlannerPlanId; + + /* + * The planner can be called recursively (an example is when + * eval_const_expressions tries to simplify an SQL function). + * So, global state variables must be saved and restored. + * + * (Perhaps these should be moved into the Query structure instead?) + */ + save_PlannerQueryLevel = PlannerQueryLevel; + save_PlannerInitPlan = PlannerInitPlan; + save_PlannerParamVar = PlannerParamVar; + save_PlannerPlanId = PlannerPlanId; /* Initialize state for subselects */ PlannerQueryLevel = 1; @@ -81,6 +97,12 @@ planner(Query *parse) /* final cleanup of the plan */ set_plan_references(result_plan); + /* restore state for outer planner, if any */ + PlannerQueryLevel = save_PlannerQueryLevel; + PlannerInitPlan = save_PlannerInitPlan; + PlannerParamVar = save_PlannerParamVar; + PlannerPlanId = save_PlannerPlanId; + return result_plan; }