diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-07-27 23:16:04 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-07-27 23:16:04 +0000 |
commit | ff7da2f49801e1e47ed116491f7bd6711946dc6a (patch) | |
tree | a64ddf4b2b7091a1a40d7ead648fd2f10eebf920 /src/backend/optimizer/plan/planner.c | |
parent | faa41717280a51ca869ac8f44e1a3249cab9b1b5 (diff) | |
download | postgresql-ff7da2f49801e1e47ed116491f7bd6711946dc6a.tar.gz postgresql-ff7da2f49801e1e47ed116491f7bd6711946dc6a.zip |
Make planner safe for recursive calls --- needed for cases where
eval_const_expressions tries to simplify an SQL function.
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 84f9c322c42..42545750d39 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.85 2000/06/20 04:22:21 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.86 2000/07/27 23:15:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -50,6 +50,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; @@ -78,6 +94,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; } |