Skip to content

Commit 49bf146

Browse files
committed
Avoid planner crash/Assert failure with joins to unflattened subqueries.
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 1cb108e, although I think that subsequent changes may have exposed it more than it was originally. Per bug #7580 from Maxim Boguk.
1 parent da24920 commit 49bf146

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/backend/utils/adt/selfuncs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4517,8 +4517,10 @@ examine_simple_variable(PlannerInfo *root, Var *var,
45174517
*/
45184518
rel = find_base_rel(root, var->varno);
45194519

4520-
/* Subquery should have been planned already */
4521-
Assert(rel->subroot && IsA(rel->subroot, PlannerInfo));
4520+
/* If the subquery hasn't been planned yet, we have to punt */
4521+
if (rel->subroot == NULL)
4522+
return;
4523+
Assert(IsA(rel->subroot, PlannerInfo));
45224524

45234525
/*
45244526
* Switch our attention to the subquery as mangled by the planner. It

0 commit comments

Comments
 (0)