Richard Guo <guofengli...@gmail.com> writes: > In deconstruct_distribute_oj_quals, when we've identified a commutable > left join which provides join clause with flexible semantics, we try to > generate multiple versions of the join clause. Here we have the logic > that puts back any ojrelids that were removed from its min_righthand.
> /* > * Put any OJ relids that were removed from min_righthand back into > * ojscope, else distribute_qual_to_rels will complain. > */ > ojscope = bms_join(ojscope, bms_intersect(sjinfo->commute_below, > sjinfo->syn_righthand)); > I doubt this is necessary. It seems to me that all relids mentioned > within the join clause have already been contained in ojscope, which is > the union of min_lefthand and min_righthand. Hmm ... that was needed at some point in the development of that function, but maybe it isn't as the code stands now. It does look like the "this_ojscope" manipulations within the loop cover this. > I noticed this code because I came across a problem with a query as > below. > create table t (a int); > select t1.a from (t t1 left join t t2 on true) left join (t t3 left join t > t4 on t3.a = t4.a) on t2.a = t3.a; > When we deal with qual 't2.a = t3.a', deconstruct_distribute_oj_quals > would always add the OJ relid of t3/t4 into its required_relids, due to > the code above, which I think is wrong. The direct consequence is that > we would miss the plan that joins t2 and t3 directly. I don't see any change in this query plan when I remove that code, so I'm not sure you're explaining your point very well. regards, tom lane