Re: MERGE issues around inheritance
От | Tender Wang |
---|---|
Тема | Re: MERGE issues around inheritance |
Дата | |
Msg-id | CAHewXNnJB+GRjPczwLFvGzC3hZB3xqy9be0+73sfpx57jENVsw@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: MERGE issues around inheritance (Álvaro Herrera <alvherre@alvh.no-ip.org>) |
Список | pgsql-hackers |
Álvaro Herrera <alvherre@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);
}
{
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
В списке pgsql-hackers по дате отправления: