> > + if (rel->partial_pathlist != NIL && > + (Path *) linitial(rel->partial_pathlist) == subpath) > + partial_subplans_set = bms_add_member(partial_subplans_set, i); > > This seems like a scary way to figure this out. What if we wanted to > build a parallel append subpath with some path other than the > cheapest, for some reason? I think you ought to record the decision > that set_append_rel_pathlist makes about whether to use a partial path > or a parallel-safe path, and then just copy it over here. >
I agree that assuming that a subpath is non-partial path if it's not cheapest of the partial paths is risky. In fact, we can not assume that even when it's not one of the partial_paths since it could have been kicked out or was never added to the partial path list like reparameterized path. But if we have to save the information about which of the subpaths are partial paths and which are not in AppendPath, it would take some memory, noticeable for thousands of partitions, which will leak if the path doesn't make into the rel->pathlist. The purpose of that information is to make sure that we allocate only one worker to that plan. I suggested that we use path->parallel_workers for the same, but it seems that's not guaranteed to be reliable. The reasons were discussed upthread. Is there any way to infer whether we can allocate more than one workers to a plan by looking at the corresponding path? -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers