This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new 7147f16019 [core] Trim field names in
changelog-producer.row-deduplicate-ignore-fields (#10763)
7147f16019 is described below
commit 7147f16019ecf5d91c8f186564dd23db08dbf036
Author: Eunbin Son <[email protected]>
AuthorDate: Mon Oct 26 15:23:52 2026 +0900
[core] Trim field names in changelog-producer.row-deduplicate-ignore-fields
(#10763)
---
.../main/java/org/apache/paimon/CoreOptions.java | 6 +++-
.../java/org/apache/paimon/CoreOptionsTest.java | 9 ++++++
.../IncrementalDeltaStartingScannerTest.java | 32 ++++++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
b/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
index de729d86bb..737152d89a 100644
--- a/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
+++ b/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
@@ -4089,7 +4089,11 @@ public class CoreOptions implements Serializable {
public List<String> changelogRowDeduplicateIgnoreFields() {
return
options.getOptional(CHANGELOG_PRODUCER_ROW_DEDUPLICATE_IGNORE_FIELDS)
- .map(s -> Arrays.asList(s.split(",")))
+ .map(
+ s ->
+ Arrays.stream(s.split(","))
+ .map(String::trim)
+ .collect(Collectors.toList()))
.orElse(Collections.emptyList());
}
diff --git a/paimon-core/src/test/java/org/apache/paimon/CoreOptionsTest.java
b/paimon-core/src/test/java/org/apache/paimon/CoreOptionsTest.java
index 513331f755..7a883925f8 100644
--- a/paimon-core/src/test/java/org/apache/paimon/CoreOptionsTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/CoreOptionsTest.java
@@ -166,6 +166,15 @@ public class CoreOptionsTest {
assertThat(options.sequenceField()).containsExactly("f1", "f2", "f3");
}
+ @Test
+ public void testChangelogRowDeduplicateIgnoreFieldsTrim() {
+ Options conf = new Options();
+ conf.set(CoreOptions.CHANGELOG_PRODUCER_ROW_DEDUPLICATE_IGNORE_FIELDS,
" f1 ,f2 , f3 ");
+
+ CoreOptions options = new CoreOptions(conf);
+
assertThat(options.changelogRowDeduplicateIgnoreFields()).containsExactly("f1",
"f2", "f3");
+ }
+
@Test
public void testIgnoreGlobalIndexColumnUpdateAction() {
Options conf = new Options();
diff --git
a/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/IncrementalDeltaStartingScannerTest.java
b/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/IncrementalDeltaStartingScannerTest.java
index 1b3f9f31e3..da88e7752b 100644
---
a/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/IncrementalDeltaStartingScannerTest.java
+++
b/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/IncrementalDeltaStartingScannerTest.java
@@ -31,6 +31,7 @@ import org.apache.paimon.utils.SnapshotManager;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -123,6 +124,37 @@ public class IncrementalDeltaStartingScannerTest extends
ScannerTestBase {
"The specified scan snapshotId range [1, 5] is
out of available snapshotId range [1, 4]."));
}
+ @Test
+ public void testRowDeduplicateIgnoreFieldsWithSpaces() throws Exception {
+ table =
+ table.copy(
+ Collections.singletonMap(
+
CoreOptions.CHANGELOG_PRODUCER_ROW_DEDUPLICATE_IGNORE_FIELDS.key(),
+ "a, b"));
+ StreamTableWrite write =
+ table.newWrite(commitUser).withIOManager(new
IOManagerImpl(tempDir.toString()));
+ StreamTableCommit commit = table.newCommit(commitUser);
+
+ write.write(rowData(1, 10, 100L));
+ write.compact(binaryRow(1), 0, false);
+ commit.commit(0, write.prepareCommit(true, 0));
+
+ // only the ignored field b changes
+ write.write(rowData(1, 10, 500L));
+ write.compact(binaryRow(1), 0, false);
+ commit.commit(1, write.prepareCommit(true, 1));
+
+ write.close();
+ commit.close();
+ assertThat(table.snapshotManager().latestSnapshotId()).isEqualTo(4);
+
+ Map<String, String> dynamicOptions = new HashMap<>();
+ dynamicOptions.put(INCREMENTAL_BETWEEN.key(), "2,4");
+ dynamicOptions.put(INCREMENTAL_BETWEEN_SCAN_MODE.key(), "changelog");
+ List<Split> splits =
table.copy(dynamicOptions).newScan().plan().splits();
+ assertThat(getResult(table.newRead(), splits)).isEmpty();
+ }
+
private void writeDataToTable() throws Exception {
SnapshotManager snapshotManager = table.snapshotManager();
StreamTableWrite write =