On Fri, Apr 29, 2016 at 7:33 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: > > Amit Kapila <amit.kapil...@gmail.com> writes: > >> On Thu, Apr 28, 2016 at 10:06 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: > >>> I'd be inclined to think that it's silly to build GatherPaths in advance > >>> of having finalized the list of partial paths for a rel. > > > What's happening here is that to form joinrel, we need to call > > add_paths_to_joinrel() with both outer and inner relation twice, once with > > rel1 as outer relation and rel1 as inner relation and vice versa. So now > > the second call to add_paths_to_joinrel() can replace a partial path which > > is being referenced by GatherPath generated in first call. I think we > > should generate gather paths for join rel after both the calls > > to add_paths_to_joinrel() aka in make_join_rel(). Attached patch on above > > lines fixes the problem for me. > > make_join_rel is certainly not far enough down the call stack to solve > this problem. It can, and typically will, be invoked multiple times > for the same target join relation. > > One possible answer is to do it in standard_join_search, just before > the set_cheapest call for each join relation. >
Yes, that makes sense to me. > You'd need to account > for the issue in GEQO search as well. > How about doing it in merge_clump() before calling set_cheapest()? Yet, another idea could be to create a copy of partial path before passing it to create_gather_path()? With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com