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 =

Reply via email to