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(

Reply via email to