]> granicus.if.org Git - postgresql/commitdiff
Avoid planner crash/Assert failure with joins to unflattened subqueries.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2012 17:37:53 +0000 (13:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Oct 2012 17:38:20 +0000 (13:38 -0400)
examine_simple_variable supposed that any RTE_SUBQUERY rel it gets pointed
at must have been planned already.  However, this isn't a safe assumption
because we must do selectivity estimation while generating indexscan paths,
and that code might look at join clauses involving a rel that the loop in
set_base_rel_sizes() hasn't reached yet.  The simplest fix is to play dumb
in such a situation, that is give up trying to extract any stats for the
Var.  This could possibly be improved by making a separate pass over the
RTE list to plan each unflattened subquery before we start the main
planning work --- but that would be pretty invasive and it doesn't seem
worth it, for now at least.  (We couldn't just break set_base_rel_sizes()
into two loops: the prescan would need to handle all subquery rels in the
query, not only those in the current join subproblem.)

This bug was introduced in commit 1cb108efb0e60d87e4adec38e7636b6e8efbeb57,
although I think that subsequent changes may have exposed it more than it
was originally.  Per bug #7580 from Maxim Boguk.

src/backend/utils/adt/selfuncs.c

index 40e1bebac1602a19f31606f529a9dbb0ffd7a043..fb91d140261df0958d9b36a0ef00d3c9cd88d332 100644 (file)
@@ -4517,8 +4517,10 @@ examine_simple_variable(PlannerInfo *root, Var *var,
                 */
                rel = find_base_rel(root, var->varno);
 
-               /* Subquery should have been planned already */
-               Assert(rel->subroot && IsA(rel->subroot, PlannerInfo));
+               /* If the subquery hasn't been planned yet, we have to punt */
+               if (rel->subroot == NULL)
+                       return;
+               Assert(IsA(rel->subroot, PlannerInfo));
 
                /*
                 * Switch our attention to the subquery as mangled by the planner. It