Álvaro Herrera <alvhe...@alvh.no-ip.org> 于2025年5月24日周六 17:11写道:
> On 2025-May-21, Andres Freund wrote: > > > Hi, > > > > In [1] I added some verification to projection building, to check if the > > tupleslot passed to ExecBuildProjectionInfo() is compatible with the > target > > list. One query in merge.sql [2] got flagged. > > > > Trying to debug that issue, I found another problem. This leaves us with: > > > > 1) w/ inheritance INSERTed rows are not returned by RETURNING. This > seems to > > just generally not work with MERGE > > Hmm, curious. One thing to observe is that the original source tuple is > in the child table, but the tuple inserted by MERGE ends up in the > parent table. I'm guessing that the code gets confused as to the > relation that the tuple in the returned slot comes from, and that > somehow makes it somehow not "see" the tuple to process for RETURNING? > I dunno. CC'ing Dean, who is more familiar with this code than I am. > In ExecMergeNotMatched(), we passed the mtstate->rootResultRelInfo to ExecInsert(). In this case, the ri_projectReturning of mtstate->rootResultRelInfo is NULL, in ExecInsert(), the "if (resultRelInfo->ri_projectReturning)" branch will not run, so inheritance INSERTed rows are not returned by RETURNING. The mtstate->rootResultRelInfo assigned in ExecInitModifyTable() is only here: if (node->rootRelation > 0) { Assert(bms_is_member(node->rootRelation, estate->es_unpruned_relids)); mtstate->rootResultRelInfo = makeNode(ResultRelInfo); ExecInitResultRelation(estate, mtstate->rootResultRelInfo, node->rootRelation); } The ri_projectReturning is not assigned. I try to pass resultRelInfo to ExecInsert, the inherited INSERTed rows are returned by RETURNING. But some test cases in regression failed. -- Thanks, Tender Wang