Re: [HACKERS] Partitioned tables and relfilenode
От | Amit Langote |
---|---|
Тема | Re: [HACKERS] Partitioned tables and relfilenode |
Дата | |
Msg-id | 6837c359-45c4-8044-34d1-736756335a15@lab.ntt.co.jp обсуждение исходный текст |
Ответ на | Re: [HACKERS] Partitioned tables and relfilenode (Robert Haas <robertmhaas@gmail.com>) |
Ответы |
Re: [HACKERS] Partitioned tables and relfilenode
|
Список | pgsql-hackers |
On 2017/03/21 1:16, Robert Haas wrote: > On Fri, Mar 17, 2017 at 4:57 AM, Amit Langote > <Langote_Amit_f8@lab.ntt.co.jp> wrote: >>> Yes, but on the flip side, you're having to add code in a lot of >>> places -- I think I counted 7 -- where you turn around and ignore >>> those AppendRelInfos. >> >> Perhaps you were looking at the previous version with "minimal" appinfos >> containing the child_is_partitioned field? > > Yes, I think I was. I think this version looks a lot better. Just to clarify, I assume you reviewed the latest version which does not create AppendRelInfos, but instead creates PartitionedChildRelInfos (as also evident from your comments below). Sorry about the confusion. > /* > + * Close the root partitioned rel if we opened it above, but keep the > + * lock. > + */ > + if (rel != mtstate->resultRelInfo->ri_RelationDesc) > + heap_close(rel, NoLock); > > We didn't take a lock above, though, so drop everything in the comment > from "but" onward. Oh, right. > - add_paths_to_append_rel(root, rel, live_childrels); > + add_paths_to_append_rel(root, rel, live_childrels, partitioned_rels); > > I think it would make more sense to put the new logic into > add_paths_to_append_rel, instead of passing this down as an additional > parameter. OK, done. > + * do not appear anywhere else in the plan. Situation is exactly the > > The situation is... Fixed. > > + if (parent_rte->relkind == RELKIND_PARTITIONED_TABLE) > + { > + foreach(lc, root->pcinfo_list) > + { > + PartitionedChildRelInfo *pc = lfirst(lc); > + > + if (pc->parent_relid == parentRTindex) > + { > + partitioned_rels = pc->child_rels; > + break; > + } > + } > + } > > You seem to have a few copies of this logic. I think it would be > worth factoring it out into a separate function. OK, done. Put the definition in in planner.c > + root->glob->nonleafResultRelations = > + list_concat(root->glob->nonleafResultRelations, > + list_copy(splan->partitioned_rels)); > > Please add a brief comment. One line is fine. Done. > > + newrc->isParent = childrte->relkind == RELKIND_PARTITIONED_TABLE; > > I'm not sure what project style is, but I personally find these kinds > of assignments easier to read with an extra set of parantheses: > > newrc->isParent = (childrte->relkind == RELKIND_PARTITIONED_TABLE); Ah, done. > > + if (partitioned_rels == NIL) > + return; > + > + foreach(lc, partitioned_rels) > > I think the if-test is pointless; the foreach loop is going to start > by comparing the initial value with NIL. Right, fixed. > Why doesn't ExecSerializePlan() need to transfer a proper value for > nonleafResultRelations to workers? Seems like it should. It doesn't transfer resultRelations either, presumably because workers do not handle result relations yet. Also, both resultRelations and nonleafResultRelations are set *only* if there is a ModifyTable node. Attached updated patches. Thanks, Amit -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Вложения
В списке pgsql-hackers по дате отправления: