Re: BUG #18830: ExecInitMerge Segfault on MERGE
Tender Wang <tndrwang@gmail.com>
From: Tender Wang <tndrwang@gmail.com>
To: Amit Langote <amitlangote09@gmail.com>
Cc: Dean Rasheed <dean.a.rasheed@gmail.com>,
David Rowley <dgrowleyml@gmail.com>, pgsql-bugs@lists.postgresql.org, tharakan@gmail.com
Date: 2025-03-12T13:24:20Z
Lists: pgsql-bugs
Amit Langote <amitlangote09@gmail.com> 于2025年3月12日周三 20:24写道: > Thanks -- I’ve studied the code and I agree with the conclusion: when > all result relations are pruned, we still need to lock and process the > first one to preserve executor invariants. > > Your examples with ExecMerge() and ExecInitPartitionInfo() make the > consequences of missing resultRelInfo[0] pretty clear. Locking and > including the first result relation, even if pruned, seems like the > most straightforward way to maintain correctness without deeper > structural changes. > > I've come up with the attached. I'll still need to add a test case. > It looks good to me, on a quick read-through. We now don't have merge into ... not match ... test case in partition_prune.sql In [1], I figured out a query that could trigger a crash. It may be used as the test case. create table part_abc (a int, b text, c bool) partition by list (a); create table part_abc_1 (b text, a int, c bool); create table part_abc_2 (a int, c bool, b text); alter table part_abc attach partition part_abc_1 for values in (1); alter table part_abc attach partition part_abc_2 for values in (2); insert into part_abc values (1, 'b', true); insert into part_abc values (2, 'c', true); create view part_abc_view as select * from part_abc where b <> 'a' with check option; create function stable_one() returns int as $$ begin return 1; end; $$ language plpgsql stable; Above SQLs are already in parition_prune.sql, only need the below SQLs. explain (costs off) merge into part_abc_view pt using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (true) on pt.a = stable_one() +2 when not matched then insert values(1, 'd', false); merge into part_abc_view pt using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (true) on pt.a = stable_one() +2 when not matched then insert values(1, 'd', false); [1] https://www.postgresql.org/message-id/CAHewXN%3DS5nqVMqoYpFXe8OykqDC-r22vG7RvDN-VFamY7XcVTw%40mail.gmail.com -- Thanks, Tender Wang
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Ensure first ModifyTable rel initialized if all are pruned
- 28317de723b6 18.0 landed
-
Don't lock partitions pruned by initial pruning
- 525392d5727f 18.0 cited
-
Fix an oversight in cbc127917 to handle MERGE correctly
- 75dfde13639a 18.0 cited
-
Remove some unnecessary fields from Plan trees.
- 52ed730d511b 12.0 cited