mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Fix inappropriate attempt to push down qual clauses into a view that
has UNION/INTERSECT/EXCEPT operations. Per bug report from Ferrier.
This commit is contained in:
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.70 2001/01/24 19:42:57 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.71 2001/02/03 21:17:52 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -101,8 +101,6 @@ set_base_rel_pathlists(Query *root)
|
|||||||
if (rel->issubquery)
|
if (rel->issubquery)
|
||||||
{
|
{
|
||||||
/* Subquery --- generate a separate plan for it */
|
/* Subquery --- generate a separate plan for it */
|
||||||
List *upperrestrictlist;
|
|
||||||
List *lst;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there are any restriction clauses that have been attached
|
* If there are any restriction clauses that have been attached
|
||||||
@ -118,6 +116,11 @@ set_base_rel_pathlists(Query *root)
|
|||||||
* Currently, we do not push down clauses that contain subselects,
|
* Currently, we do not push down clauses that contain subselects,
|
||||||
* mainly because I'm not sure it will work correctly (the
|
* mainly because I'm not sure it will work correctly (the
|
||||||
* subplan hasn't yet transformed sublinks to subselects).
|
* subplan hasn't yet transformed sublinks to subselects).
|
||||||
|
* Also, if the subquery contains set ops (UNION/INTERSECT/EXCEPT)
|
||||||
|
* we do not push down any qual clauses, since the planner doesn't
|
||||||
|
* support quals at the top level of a setop. (With suitable
|
||||||
|
* analysis we could try to push the quals down into the component
|
||||||
|
* queries of the setop, but getting it right is not trivial.)
|
||||||
* Non-pushed-down clauses will get evaluated as qpquals of
|
* Non-pushed-down clauses will get evaluated as qpquals of
|
||||||
* the SubqueryScan node.
|
* the SubqueryScan node.
|
||||||
*
|
*
|
||||||
@ -125,41 +128,48 @@ set_base_rel_pathlists(Query *root)
|
|||||||
* decision not to push down, because it'd result in a worse
|
* decision not to push down, because it'd result in a worse
|
||||||
* plan?
|
* plan?
|
||||||
*/
|
*/
|
||||||
upperrestrictlist = NIL;
|
if (rte->subquery->setOperations == NULL)
|
||||||
foreach(lst, rel->baserestrictinfo)
|
|
||||||
{
|
{
|
||||||
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lst);
|
/* OK to consider pushing down individual quals */
|
||||||
Node *clause = (Node *) rinfo->clause;
|
List *upperrestrictlist = NIL;
|
||||||
|
List *lst;
|
||||||
|
|
||||||
if (contain_subplans(clause))
|
foreach(lst, rel->baserestrictinfo)
|
||||||
{
|
{
|
||||||
/* Keep it in the upper query */
|
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lst);
|
||||||
upperrestrictlist = lappend(upperrestrictlist, rinfo);
|
Node *clause = (Node *) rinfo->clause;
|
||||||
}
|
|
||||||
else
|
if (contain_subplans(clause))
|
||||||
{
|
{
|
||||||
/*
|
/* Keep it in the upper query */
|
||||||
* We need to replace Vars in the clause (which must
|
upperrestrictlist = lappend(upperrestrictlist, rinfo);
|
||||||
* refer to outputs of the subquery) with copies of the
|
}
|
||||||
* subquery's targetlist expressions. Note that at this
|
else
|
||||||
* point, any uplevel Vars in the clause should have been
|
{
|
||||||
* replaced with Params, so they need no work.
|
/*
|
||||||
*/
|
* We need to replace Vars in the clause (which must
|
||||||
clause = ResolveNew(clause, rti, 0,
|
* refer to outputs of the subquery) with copies of
|
||||||
rte->subquery->targetList,
|
* the subquery's targetlist expressions. Note that
|
||||||
CMD_SELECT, 0);
|
* at this point, any uplevel Vars in the clause
|
||||||
rte->subquery->havingQual =
|
* should have been replaced with Params, so they
|
||||||
make_and_qual(rte->subquery->havingQual,
|
* need no work.
|
||||||
clause);
|
*/
|
||||||
/*
|
clause = ResolveNew(clause, rti, 0,
|
||||||
* We need not change the subquery's hasAggs or
|
rte->subquery->targetList,
|
||||||
* hasSublinks flags, since we can't be pushing down
|
CMD_SELECT, 0);
|
||||||
* any aggregates that weren't there before, and we
|
rte->subquery->havingQual =
|
||||||
* don't push down subselects at all.
|
make_and_qual(rte->subquery->havingQual,
|
||||||
*/
|
clause);
|
||||||
|
/*
|
||||||
|
* We need not change the subquery's hasAggs or
|
||||||
|
* hasSublinks flags, since we can't be pushing down
|
||||||
|
* any aggregates that weren't there before, and we
|
||||||
|
* don't push down subselects at all.
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
rel->baserestrictinfo = upperrestrictlist;
|
||||||
}
|
}
|
||||||
rel->baserestrictinfo = upperrestrictlist;
|
|
||||||
|
|
||||||
/* Generate the plan for the subquery */
|
/* Generate the plan for the subquery */
|
||||||
rel->subplan = subquery_planner(rte->subquery,
|
rel->subplan = subquery_planner(rte->subquery,
|
||||||
|
Reference in New Issue
Block a user