summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2000-07-27 23:53:29 +0000
committerTom Lane2000-07-27 23:53:29 +0000
commit91319022c44b466a286892485baed0a5f69d5d62 (patch)
tree3f304d7cc6e98dcc7663ec3b3577cc267660b8e7
parentdaee6ca5853da789204424716ef44706d64f62f5 (diff)
Back-patch primary fix for planner recursion bug.
-rw-r--r--src/backend/optimizer/plan/planner.c24
1 files changed, 23 insertions, 1 deletions
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;
}