summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/subselect.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-07-18 21:41:22 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-07-18 21:41:22 +0000
commit429870e33e97d2e7748e5dd146adcbd5058e218e (patch)
treee96e626a0b8a68656fcfb785ed9e768e06fad491 /src/backend/optimizer/plan/subselect.c
parentb1def736b00595c8983cee5d513762f084ce444b (diff)
Fix an old thinko in SS_make_initplan_from_plan, which is used when optimizing
a MIN or MAX aggregate call into an indexscan: the initplan is being made at the current query nesting level and so we shouldn't increment query_level. Though usually harmless, this mistake could lead to bogus "plan should not reference subplan's variable" failures on complex queries. Per bug report from David Sanchez i Gregori.
Diffstat (limited to 'src/backend/optimizer/plan/subselect.c')
-rw-r--r--src/backend/optimizer/plan/subselect.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index a1acda48ff0..194b41449e5 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.100.2.3 2006/05/03 00:25:07 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.100.2.4 2007/07/18 21:41:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1251,10 +1251,14 @@ SS_make_initplan_from_plan(PlannerInfo *root, Plan *plan,
Param *prm;
/*
- * Set up for a new level of subquery. This is just to keep
- * SS_finalize_plan from becoming confused.
+ * We must run SS_finalize_plan(), since that's normally done before a
+ * subplan gets put into the initplan list. However it will try to attach
+ * any pre-existing initplans to this one, which we don't want (they are
+ * siblings not children of this initplan). So, a quick kluge to hide
+ * them. (This is something else that could perhaps be cleaner if we did
+ * extParam/allParam processing in setrefs.c instead of here? See notes
+ * for materialize_finished_plan.)
*/
- PlannerQueryLevel++;
PlannerInitPlan = NIL;
/*
@@ -1262,8 +1266,7 @@ SS_make_initplan_from_plan(PlannerInfo *root, Plan *plan,
*/
SS_finalize_plan(plan, root->parse->rtable);
- /* Return to outer subquery context */
- PlannerQueryLevel--;
+ /* Restore outer initplan list */
PlannerInitPlan = saved_initplan;
/*