This is an automated email from the ASF dual-hosted git repository.

dybyte pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new c780843b8b [Fix][Transform-V2] Prevent input row mutation in 
ReplaceTransform (#10941)
c780843b8b is described below

commit c780843b8bf63fd95322ab0ac01c0cfb2ae05cee
Author: Doyeon Kim <[email protected]>
AuthorDate: Mon May 25 05:40:19 2026 +0900

    [Fix][Transform-V2] Prevent input row mutation in ReplaceTransform (#10941)
---
 .../transform/replace/ReplaceTransform.java        |  8 ++++--
 .../transform/replace/ReplaceTransformTest.java    | 33 ++++++++++++++++++++++
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/replace/ReplaceTransform.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/replace/ReplaceTransform.java
index 2a2d6d64f5..0228e1f0ec 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/replace/ReplaceTransform.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/replace/ReplaceTransform.java
@@ -123,14 +123,16 @@ public class ReplaceTransform extends 
AbstractCatalogSupportMapTransform {
 
     @Override
     protected SeaTunnelRow transformRow(SeaTunnelRow inputRow) {
+        SeaTunnelRow outputRow = inputRow.copy();
+
         for (int index : replaceFieldIndexes) {
-            Object value = inputRow.getField(index);
+            Object value = outputRow.getField(index);
             if (value == null) {
                 continue;
             }
-            inputRow.setField(index, applyReplacement(value.toString()));
+            outputRow.setField(index, applyReplacement(value.toString()));
         }
-        return inputRow;
+        return outputRow;
     }
 
     private String applyReplacement(String value) {
diff --git 
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/replace/ReplaceTransformTest.java
 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/replace/ReplaceTransformTest.java
index 7ff23bf9a5..c716627c95 100644
--- 
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/replace/ReplaceTransformTest.java
+++ 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/replace/ReplaceTransformTest.java
@@ -268,4 +268,37 @@ class ReplaceTransformTest {
         Assertions.assertEquals("abcNUMdef456", output.getField(1));
         Assertions.assertEquals("xyzNUMuvw012", output.getField(2));
     }
+
+    @Test
+    void testReplaceDoesNotMutateInputRowForFanOut() {
+        Map<String, Object> phoneReplaceConfig = new HashMap<>();
+        phoneReplaceConfig.put("replace_field", "title");
+        phoneReplaceConfig.put(ReplaceTransformConfig.KEY_PATTERN.key(), "1");
+        phoneReplaceConfig.put(ReplaceTransformConfig.KEY_REPLACEMENT.key(), 
"a");
+
+        Map<String, Object> nameReplaceConfig = new HashMap<>();
+        nameReplaceConfig.put("replace_field", "name");
+        nameReplaceConfig.put(ReplaceTransformConfig.KEY_PATTERN.key(), 
"before");
+        nameReplaceConfig.put(ReplaceTransformConfig.KEY_REPLACEMENT.key(), 
"after");
+
+        ReplaceTransform phoneReplaceTransform =
+                new 
ReplaceTransform(ReadonlyConfig.fromMap(phoneReplaceConfig), catalogTable);
+        ReplaceTransform nameReplaceTransform =
+                new 
ReplaceTransform(ReadonlyConfig.fromMap(nameReplaceConfig), catalogTable);
+
+        SeaTunnelRow input = new SeaTunnelRow(new Object[] {1, "before name", 
"17111999384"});
+
+        SeaTunnelRow phoneOutput = phoneReplaceTransform.transformRow(input);
+        SeaTunnelRow nameOutput = nameReplaceTransform.transformRow(input);
+
+        Assertions.assertEquals("a7aaa999384", phoneOutput.getField(2));
+        Assertions.assertEquals("after name", nameOutput.getField(1));
+
+        // The sibling transform branch should still see the original title 
value.
+        Assertions.assertEquals("17111999384", nameOutput.getField(2));
+
+        // ReplaceTransform should not mutate the shared input row.
+        Assertions.assertEquals("before name", input.getField(1));
+        Assertions.assertEquals("17111999384", input.getField(2));
+    }
 }

Reply via email to