2018年12月30日(日) 4:12 Tom Lane <t...@sss.pgh.pa.us>: > > Kohei KaiGai <kai...@heterodb.com> writes: > > 2018年12月29日(土) 1:44 Tom Lane <t...@sss.pgh.pa.us>: > >> However, first I'd like to know why this situation is arising in the first > >> place. To have the situation you're describing, we'd have to have > >> attempted to make some Gather paths before we have all the partial paths > >> for the relation they're for. Why is that a good thing to do? It seems > >> like such Gathers are necessarily being made with incomplete information, > >> and we'd be better off to fix things so that none are made till later. > > > Because of the hook location, Gather-node shall be constructed with built-in > > and foreign partial scan node first, then extension gets a chance to add its > > custom paths (partial and full). > > At the set_rel_pathlist(), set_rel_pathlist_hook() is invoked next to the > > generate_gather_paths(). > > Hmm. I'm inclined to think that we should have a separate hook > in which extensions are allowed to add partial paths, and that > set_rel_pathlist_hook should only be allowed to add regular paths. > I have almost same opinion, but the first hook does not need to be dedicated for partial paths. As like set_foreign_pathlist() doing, we can add both of partial and regular paths here, then generate_gather_paths() may generate a Gather-path on top of the best partial-path.
On the other hands, the later hook must be dedicated to add regular paths, and also provides a chance for extensions to manipulate pre-built path-list including Gather-path. As long as I know, pg_hint_plan uses the set_rel_pathlist_hook to enforce a particular path-node, including Gather-node, by manipulation of the cost value. Horiguchi-san, is it right? Likely, this kind of extension needs to use the later hook. I expect these hooks are located as follows: set_rel_pathlist(...) { : <snip> : /* for partial / regular paths */ if (set_rel_pathlist_hook) (*set_rel_pathlist_hook) (root, rel, rti, rte); /* generate Gather-node */ if (rel->reloptkind == RELOPT_BASEREL) generate_gather_paths(root, rel); /* for regular paths and manipulation */ if (post_rel_pathlist_hook) (*post_rel_pathlist_hook) (root, rel, rti, rte); set_cheapest(); } Thanks, -- HeteroDB, Inc / The PG-Strom Project KaiGai Kohei <kai...@heterodb.com>