pull_up_subqueries question

Started by Dennis Haneyover 22 years ago2 messagesgeneral
Jump to latest
#1Dennis Haney
davh@diku.dk

Hi

I was looking at pull_up_subqueries
(backend/optimizer/prep/prepjointree.c 135) and I was wondering why the
recursive optimization is only done on subqueries that can be optimized.
As in, why isn't the code like:

if (rte->rtekind == RTE_SUBQUERY) {
subquery = copyObject(subquery);
if (subquery->hasSubLinks)
subquery->jointree->quals = pull_up_IN_clauses(subquery,
subquery->jointree->quals);
subquery->jointree = (FromExpr *)
pull_up_subqueries(subquery, (Node *) subquery->jointree,
false);
if (is_simple_subquery(subquery) &&
(!below_outer_join || has_nullable_targetlist(subquery)) &&
!contain_whole_tuple_var((Node *) parse, varno, 0))
{
//optimize the subquery up
}
}

--
Dennis

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dennis Haney (#1)
Re: pull_up_subqueries question

Dennis Haney <davh@diku.dk> writes:

I was looking at pull_up_subqueries
(backend/optimizer/prep/prepjointree.c 135) and I was wondering why the
recursive optimization is only done on subqueries that can be optimized.

Because it will be done when the subquery is planned (via recursion to
subquery_planner), if the subquery is left as a separate subquery.
The only reason pull_up_subqueries has to do this at all is that it has
already been done to the rest of the upper query, and so we would miss
doing it to the pulled-up part of the tree if we didn't do it here.
Compare the order of operations in subquery_planner.

regards, tom lane