From ea8e3d7290c5f13e619a84915e37c9a52da0de64 Mon Sep 17 00:00:00 2001 From: jackylee Date: Fri, 7 Aug 2026 22:13:48 +0800 Subject: [PATCH] [lance] Reject unsupported element types nested in ARRAY LanceRowTypeVisitor.visit(ArrayType) returned without checking the element type, so MULTISET/MAP/LOCAL_ZONED_TIMESTAMP passed validateDataFields when nested in an ARRAY even though they are rejected at the top level and inside ROW. --- .../paimon/format/lance/LanceFileFormat.java | 2 +- .../paimon/format/lance/LanceFileFormatTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java b/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java index 52184ad79892..05005432b6d8 100644 --- a/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java +++ b/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java @@ -190,7 +190,7 @@ public Void visit(BlobType blobType) { @Override public Void visit(ArrayType arrayType) { - return null; + return arrayType.getElementType().accept(this); } @Override diff --git a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java index ab63fc91ac4a..2352be764f91 100644 --- a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java +++ b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java @@ -63,6 +63,22 @@ public void testValidateDataFields_UnsupportedMultisetType() { assertThrows(UnsupportedOperationException.class, () -> format.validateDataFields(rowType)); } + @Test + public void testValidateDataFields_UnsupportedTypeNestedInArray() { + LanceFileFormat format = + new LanceFileFormat(new FileFormatFactory.FormatContext(new Options(), 1024, 1024)); + RowType rowType = RowType.of(DataTypes.ARRAY(DataTypes.MULTISET(DataTypes.STRING()))); + assertThrows(UnsupportedOperationException.class, () -> format.validateDataFields(rowType)); + } + + @Test + public void testValidateDataFields_SupportedTypeNestedInArray() { + LanceFileFormat format = + new LanceFileFormat(new FileFormatFactory.FormatContext(new Options(), 1024, 1024)); + RowType rowType = RowType.of(DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.INT()))); + assertDoesNotThrow(() -> format.validateDataFields(rowType)); + } + @Test public void testValidateDataFields_SupportedTypes() { LanceFileFormat format =