On 22 June 2017 at 01:57, Robert Haas <robertmh...@gmail.com> wrote: > On Wed, Jun 21, 2017 at 1:38 PM, Amit Khandekar <amitdkhan...@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. -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers