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()); + } }
