]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Back-patch primary fix for planner recursion bug.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jul 2000 23:53:29 +0000 (23:53 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jul 2000 23:53:29 +0000 (23:53 +0000)
src/backend/optimizer/plan/planner.c

index a92d439ee52a6ac93c5878a956d425611c431708..dd5a44ffc996b6edb5c486152dc3d1127cd0aad4 100644 (file)
@@ -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;
 }