*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.132 2002/11/29 21:39:11 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.133 2002/12/05 21:46:37 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* nothing will happen after the first time. We do have to be
* careful to copy everything we pull up, however, or risk
* having chunks of structure multiply linked.
+ *
+ * Note: 'false' is correct here even if we are within an outer
+ * join in the upper query; the lower query starts with a clean
+ * slate for outer-join semantics.
*/
subquery->jointree = (FromExpr *)
pull_up_subqueries(subquery, (Node *) subquery->jointree,
- below_outer_join);
+ false);
/*
* Now make a modifiable copy of the subquery that we can run
return false;
/*
+ * Don't pull up a subquery that has any sublinks in its targetlist,
+ * either. As of PG 7.3 this creates problems because the pulled-up
+ * expressions may go into join alias lists, and the sublinks would
+ * not get fixed because we do flatten_join_alias_vars() too late.
+ * Eventually we should do a complete flatten_join_alias_vars as the
+ * first step of preprocess_expression, and then we could probably
+ * support this. (BUT: it might be a bad idea anyway, due to possibly
+ * causing multiple evaluations of an expensive sublink.)
+ */
+ if (subquery->hasSubLinks &&
+ contain_subplans((Node *) subquery->targetList))
+ return false;
+
+ /*
* Hack: don't try to pull up a subquery with an empty jointree.
* query_planner() will correctly generate a Result plan for a
* jointree that's totally empty, but I don't think the right things