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

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/dev/pr-12527-16cb26bde84ab42de392115d093d3098e4e657eb
in repository https://gitbox.apache.org/repos/asf/seatunnel.git

commit d3b557e8608d05a440afe2c4975f3477ef601803
Author: Jast <[email protected]>
AuthorDate: Tue Oct 13 16:01:54 2026 +0000

    [Fix][API] Copy the arrays passed to the SeaTunnelRowType constructor 
(#12527)
---
 .../seatunnel/api/table/type/SeaTunnelRowType.java |  7 +++++--
 .../seatunnel/api/table/type/SeaTunnelRowTest.java | 23 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git 
a/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRowType.java
 
b/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRowType.java
index 575def632d..a7ae5c92ae 100644
--- 
a/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRowType.java
+++ 
b/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRowType.java
@@ -34,8 +34,11 @@ public class SeaTunnelRowType implements 
CompositeType<SeaTunnelRow> {
         checkArgument(
                 fieldNames.length == fieldTypes.length,
                 "The number of field names must be the same as the number of 
field types.");
-        this.fieldNames = fieldNames;
-        this.fieldTypes = fieldTypes;
+        // Copy the arrays so later mutation of the caller's arrays cannot 
change this
+        // immutable type definition. Getters keep returning the internal 
arrays directly
+        // to preserve the existing behavior callers rely on.
+        this.fieldNames = Arrays.copyOf(fieldNames, fieldNames.length);
+        this.fieldTypes = Arrays.copyOf(fieldTypes, fieldTypes.length);
     }
 
     @Override
diff --git 
a/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
 
b/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
index cd85020481..8dcb8b2672 100644
--- 
a/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
+++ 
b/seatunnel-api/src/test/java/org/apache/seatunnel/api/table/type/SeaTunnelRowTest.java
@@ -248,4 +248,27 @@ public class SeaTunnelRowTest {
         SeaTunnelRow row = new SeaTunnelRow(new Object[] {map});
         Assertions.assertEquals(8, row.getBytesSize());
     }
+
+    @Test
+    void testRowTypeCopiesConstructorArrays() {
+        String[] fieldNames = new String[] {"id", "name"};
+        SeaTunnelDataType<?>[] fieldTypes =
+                new SeaTunnelDataType<?>[] {BasicType.INT_TYPE, 
BasicType.STRING_TYPE};
+        SeaTunnelRowType rowType = new SeaTunnelRowType(fieldNames, 
fieldTypes);
+
+        Assertions.assertEquals(0, rowType.indexOf("id", false));
+        Assertions.assertEquals(1, rowType.indexOf("name", false));
+
+        // Mutating the arrays passed to the constructor must not change the 
row type.
+        fieldNames[0] = "name";
+        fieldNames[1] = "id";
+        fieldTypes[0] = BasicType.STRING_TYPE;
+        fieldTypes[1] = BasicType.INT_TYPE;
+
+        Assertions.assertEquals(0, rowType.indexOf("id", false));
+        Assertions.assertEquals(1, rowType.indexOf("name", false));
+        Assertions.assertEquals(BasicType.INT_TYPE, rowType.getFieldType(0));
+        Assertions.assertEquals(BasicType.STRING_TYPE, 
rowType.getFieldType(1));
+        Assertions.assertArrayEquals(new String[] {"id", "name"}, 
rowType.getFieldNames());
+    }
 }

Reply via email to