mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Avoid pulling up sublinks from a subselect's targetlist. Works around
problems that occur if sublink is referenced via a join alias variable. Perhaps this can be improved later, but a simple and safe fix is needed for 7.3.1.
This commit is contained in:
parent
fae2f14cdd
commit
993b145d7f
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -357,10 +357,14 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
|
|||||||
* nothing will happen after the first time. We do have to be
|
* nothing will happen after the first time. We do have to be
|
||||||
* careful to copy everything we pull up, however, or risk
|
* careful to copy everything we pull up, however, or risk
|
||||||
* having chunks of structure multiply linked.
|
* 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 *)
|
subquery->jointree = (FromExpr *)
|
||||||
pull_up_subqueries(subquery, (Node *) subquery->jointree,
|
pull_up_subqueries(subquery, (Node *) subquery->jointree,
|
||||||
below_outer_join);
|
false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now make a modifiable copy of the subquery that we can run
|
* Now make a modifiable copy of the subquery that we can run
|
||||||
@ -542,6 +546,20 @@ is_simple_subquery(Query *subquery)
|
|||||||
if (expression_returns_set((Node *) subquery->targetList))
|
if (expression_returns_set((Node *) subquery->targetList))
|
||||||
return false;
|
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.
|
* Hack: don't try to pull up a subquery with an empty jointree.
|
||||||
* query_planner() will correctly generate a Result plan for a
|
* query_planner() will correctly generate a Result plan for a
|
||||||
|
Loading…
Reference in New Issue
Block a user