Thread: pull_up_subqueries question

pull_up_subqueries question

From
Dennis Haney
Date:
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



Re: pull_up_subqueries question

From
Tom Lane
Date:
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