Re: [HACKERS] UPDATE of partition key
От | Amit Khandekar |
---|---|
Тема | Re: [HACKERS] UPDATE of partition key |
Дата | |
Msg-id | CAJ3gD9ctP5aWEAAV74HTp5uuprpNbS_NB51yjW5u4dLT43hPRg@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [HACKERS] UPDATE of partition key (Robert Haas <robertmhaas@gmail.com>) |
Список | pgsql-hackers |
On 22 June 2017 at 01:57, Robert Haas <robertmhaas@gmail.com> wrote: > On Wed, Jun 21, 2017 at 1:38 PM, Amit Khandekar <amitdkhan.pg@gmail.com> wrote: >>>> Yep, it's more appropriate to use >>>> ModifyTableState->rootResultRelationInfo->ri_RelationDesc somehow. That >>>> is, if answer to the question I raised above is positive. >> >> From what I had checked earlier when coding that part, >> rootResultRelInfo is NULL in case of inserts, unless something has >> changed in later commits. That's the reason I decided to use the first >> resultRelInfo. > > We're just going around in circles here. Saying that you decided to > use the first child's resultRelInfo because you didn't have a > resultRelInfo for the parent is an explanation of why you wrote the > code the way you did, but that doesn't make it correct. I want to > know why you think it's correct. Yeah, that was just an FYI on how I decided to use the first resultRelInfo; it was not for explaining why using first resultRelInfo is correct. So upthread, I have tried to explain. > > I think it's probably wrong, because it seems to me that if the INSERT > code needs to use the parent's ResultRelInfo rather than the first > child's ResultRelInfo, the UPDATE code probably needs to do the same. > Commit d3cc37f1d801a6b5cad9bf179274a8d767f1ee50 got rid of > resultRelInfos for non-leaf partitions, and commit > e180c8aa8caf5c55a273d4a8e6092e77ff3cff10 added the resultRelInfo back > for the topmost parent, because otherwise it didn't work correctly. Regarding rootResultRelInfo , it would have been good if rootResultRelInfo was set for both insert and update, but it isn't set for inserts..... For inserts : In ExecInitModifyTable(), ModifyTableState->rootResultRelInfo remains NULL because ModifyTable->rootResultRelIndex is = -1 : /* If modifying a partitioned table, initialize the root table info */ if (node->rootResultRelIndex >= 0) mtstate->rootResultRelInfo = estate->es_root_result_relations + node->rootResultRelIndex; ModifyTable->rootResultRelIndex = -1 because it does not get set since ModifyTable->partitioned_rels is NULL : /* * If the main target relation is a partitioned table, the * following list contains the RT indexes of partitioned child * relations including the root, which are not included in the * above list. We also keep RT indexes of the roots * separately to be identitied as such during the executor * initialization. */ if (splan->partitioned_rels != NIL) { root->glob->nonleafResultRelations = list_concat(root->glob->nonleafResultRelations, list_copy(splan->partitioned_rels)); /* Remember where this root will be in the global list. */ splan->rootResultRelIndex = list_length(root->glob->rootResultRelations); root->glob->rootResultRelations = lappend_int(root->glob->rootResultRelations, linitial_int(splan->partitioned_rels)); } ModifyTable->partitioned_rels is NULL because inheritance_planner() does not get called for INSERTs; instead, grouping_planner() gets called : subquery_planner() { /* * Do the main planning. If we have an inherited target relation, that * needs special processing, else go straight to grouping_planner. */ if (parse->resultRelation && rt_fetch(parse->resultRelation, parse->rtable)->inh) inheritance_planner(root); else grouping_planner(root, false, tuple_fraction); } Above, inh is false in case of inserts.
В списке pgsql-hackers по дате отправления:
Следующее
От: Tom LaneДата:
Сообщение: Re: protocol version negotiation (Re: [HACKERS] Libpq PGRES_COPY_BOTH - version compatibility)