0001-Fix-cross-partition-merge-fail.patch
text/plain
Filename: 0001-Fix-cross-partition-merge-fail.patch
Type: text/plain
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Fix cross-partition merge fail.
| File | + | − |
|---|---|---|
| src/backend/executor/execPartition.c | 1 | 0 |
| src/test/regress/expected/partition_prune.out | 28 | 0 |
| src/test/regress/sql/partition_prune.sql | 14 | 0 |
From 51ef883125694733302bd0a3e8e137f410d8c185 Mon Sep 17 00:00:00 2001 From: Tender Wang <tndrwang@gmail.com> Date: Sat, 29 Mar 2025 10:28:52 +0800 Subject: [PATCH] Fix cross-partition merge fail. --- src/backend/executor/execPartition.c | 1 + src/test/regress/expected/partition_prune.out | 28 +++++++++++++++++++ src/test/regress/sql/partition_prune.sql | 14 ++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 84ccd7d457d..8d1e3c0624f 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -956,6 +956,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, NULL); break; case CMD_DELETE: + case CMD_NOTHING: break; default: diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index 0bf35260b46..2f3e5db8252 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -4694,6 +4694,34 @@ table part_abc_view; 2 | c | t (2 rows) +rollback; +-- Cross-partition merge +begin; +explain (costs off) +merge into part_abc_view pt +using (select 3 as a) as q on pt.a = q.a +WHEN NOT MATCHED THEN INSERT VALUES (1, 2) +WHEN MATCHED THEN DO NOTHING; + QUERY PLAN +-------------------------------------- + Merge on part_abc + -> Nested Loop Left Join + -> Result + -> Result + One-Time Filter: false +(5 rows) + +merge into part_abc_view pt +using (select 3 as a) as q on pt.a = q.a +WHEN NOT MATCHED THEN INSERT VALUES (1, 2) +WHEN MATCHED THEN DO NOTHING; +table part_abc_view; + a | b | c +---+---+--- + 1 | 2 | + 2 | c | t +(2 rows) + rollback; -- A case with multiple ModifyTable nodes. begin; diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index f6db9479f54..339c8d9a4e8 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -1413,6 +1413,20 @@ when not matched then insert values (1, 'd', false) returning pt.a; table part_abc_view; rollback; +-- Cross-partition merge +begin; +explain (costs off) +merge into part_abc_view pt +using (select 3 as a) as q on pt.a = q.a +WHEN NOT MATCHED THEN INSERT VALUES (1, 2) +WHEN MATCHED THEN DO NOTHING; +merge into part_abc_view pt +using (select 3 as a) as q on pt.a = q.a +WHEN NOT MATCHED THEN INSERT VALUES (1, 2) +WHEN MATCHED THEN DO NOTHING; +table part_abc_view; +rollback; + -- A case with multiple ModifyTable nodes. begin; create table part_abc_log (action text, a int, b text, c bool); -- 2.34.1