Commit 503f042c authored by Tom Lane's avatar Tom Lane

Fix inappropriate attempt to push down qual clauses into a view that

has UNION/INTERSECT/EXCEPT operations.  Per bug report from Ferrier.
parent 67849c84
...@@ -8,7 +8,7 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment