This is an automated email from the ASF dual-hosted git repository. fokko pushed a commit to branch fd-fix in repository https://gitbox.apache.org/repos/asf/parquet-java.git
commit c59b673f7d54199992c1de2802f83c2b96245e20 Author: Fokko Driesprong <[email protected]> AuthorDate: Fri Aug 29 15:27:43 2025 +0200 Add comparator for `UnknownLogicalType` This was missing, which caused exceptions. This PR adds them including a test. It takes the comparator of the underlying physical type, but it should always compare two null values: https://github.com/apache/parquet-format/blob/471d33a3c9d46e05b8a189437a9364f959f93f09/LogicalTypes.md?plain=1#L887-L892 --- .../org/apache/parquet/schema/PrimitiveType.java | 24 ++++++++++++++++++++++ .../parquet/schema/TestPrimitiveComparator.java | 23 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java b/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java index 6beff4da9..944cfb58e 100644 --- a/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java +++ b/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java @@ -119,6 +119,12 @@ public final class PrimitiveType extends Type { LogicalTypeAnnotation.TimestampLogicalTypeAnnotation timestampLogicalType) { return of(PrimitiveComparator.SIGNED_INT64_COMPARATOR); } + + @Override + public Optional<PrimitiveComparator> visit( + LogicalTypeAnnotation.UnknownLogicalTypeAnnotation unknownLogicalTypeAnnotation) { + return of(PrimitiveComparator.SIGNED_INT64_COMPARATOR); + } }) .orElseThrow(() -> new ShouldNeverHappenException( "No comparator logic implemented for INT64 logical type: " + logicalType)); @@ -183,6 +189,12 @@ public final class PrimitiveType extends Type { } return empty(); } + + @Override + public Optional<PrimitiveComparator> visit( + LogicalTypeAnnotation.UnknownLogicalTypeAnnotation unknownLogicalTypeAnnotation) { + return of(PrimitiveComparator.SIGNED_INT32_COMPARATOR); + } }) .orElseThrow(() -> new ShouldNeverHappenException( "No comparator logic implemented for INT32 logical type: " + logicalType)); @@ -283,6 +295,12 @@ public final class PrimitiveType extends Type { LogicalTypeAnnotation.GeographyLogicalTypeAnnotation geographyLogicalType) { return of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR); } + + @Override + public Optional<PrimitiveComparator> visit( + LogicalTypeAnnotation.UnknownLogicalTypeAnnotation unknownLogicalTypeAnnotation) { + return of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR); + } }) .orElseThrow(() -> new ShouldNeverHappenException( "No comparator logic implemented for BINARY logical type: " + logicalType)); @@ -417,6 +435,12 @@ public final class PrimitiveType extends Type { LogicalTypeAnnotation.Float16LogicalTypeAnnotation float16LogicalType) { return of(PrimitiveComparator.BINARY_AS_FLOAT16_COMPARATOR); } + + @Override + public Optional<PrimitiveComparator> visit( + LogicalTypeAnnotation.UnknownLogicalTypeAnnotation unknownLogicalTypeAnnotation) { + return of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR); + } }) .orElseThrow(() -> new ShouldNeverHappenException( "No comparator logic implemented for FIXED_LEN_BYTE_ARRAY logical type: " diff --git a/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java b/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java index d3d1b15bc..8fb53aca0 100644 --- a/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java +++ b/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java @@ -100,6 +100,29 @@ public class TestPrimitiveComparator { checkThrowingUnsupportedException(comparator, Integer.TYPE); } + @Test + public void testUnknownLogicalTypeComparator() { + PrimitiveType.PrimitiveTypeName[] types = new PrimitiveType.PrimitiveTypeName[] { + PrimitiveType.PrimitiveTypeName.BOOLEAN, + PrimitiveType.PrimitiveTypeName.BINARY, + PrimitiveType.PrimitiveTypeName.INT32, + PrimitiveType.PrimitiveTypeName.INT64, + PrimitiveType.PrimitiveTypeName.FLOAT, + PrimitiveType.PrimitiveTypeName.DOUBLE, + PrimitiveType.PrimitiveTypeName.INT96, + PrimitiveType.PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY + }; + + for (PrimitiveType.PrimitiveTypeName type : types) { + assertEquals( + new PrimitiveType(Type.Repetition.REQUIRED, type, "vo") + .withLogicalTypeAnnotation(LogicalTypeAnnotation.unknownType()) + .comparator() + .compare(null, null), + 0); + } + } + @Test public void testSignedInt64Comparator() { testInt64Comparator(
