This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new 6211b65151 [format] Fix isNaN filter push-down failure on ORC tables
(#8627)
6211b65151 is described below
commit 6211b65151b7574931eb8c8bc65aeb9f87c3110c
Author: Eunbin Son <[email protected]>
AuthorDate: Wed Jul 15 09:34:13 2026 +0900
[format] Fix isNaN filter push-down failure on ORC tables (#8627)
---
.../format/orc/filter/OrcPredicateFunctionVisitor.java | 7 +++++++
.../format/orc/filter/OrcFilterConverterTest.java | 17 +++++++++++++++++
2 files changed, 24 insertions(+)
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/filter/OrcPredicateFunctionVisitor.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/filter/OrcPredicateFunctionVisitor.java
index bc32f5bd74..50c117b51f 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/filter/OrcPredicateFunctionVisitor.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/filter/OrcPredicateFunctionVisitor.java
@@ -60,6 +60,13 @@ public class OrcPredicateFunctionVisitor
return isNull.map(OrcFilters.Not::new);
}
+ @Override
+ public Optional<OrcFilters.Predicate> visitIsNaN(FieldRef fieldRef) {
+ // ORC SearchArgument has no isNaN leaf, so skip push-down and let the
engine
+ // evaluate the filter (consistent with the Parquet path).
+ return Optional.empty();
+ }
+
@Override
public Optional<OrcFilters.Predicate> visitStartsWith(FieldRef fieldRef,
Object literal) {
return Optional.empty();
diff --git
a/paimon-format/src/test/java/org/apache/paimon/format/orc/filter/OrcFilterConverterTest.java
b/paimon-format/src/test/java/org/apache/paimon/format/orc/filter/OrcFilterConverterTest.java
index 1e21578b2e..28f2dfac75 100644
---
a/paimon-format/src/test/java/org/apache/paimon/format/orc/filter/OrcFilterConverterTest.java
+++
b/paimon-format/src/test/java/org/apache/paimon/format/orc/filter/OrcFilterConverterTest.java
@@ -236,6 +236,23 @@ public class OrcFilterConverterTest {
true);
}
+ @Test
+ public void testIsNaN() {
+ PredicateBuilder builder =
+ new PredicateBuilder(
+ new RowType(
+ Arrays.asList(
+ new DataField(0, "floatField", new
FloatType()),
+ new DataField(1, "doubleField", new
DoubleType()))));
+
+ // ORC has no isNaN SearchArgument leaf, so the visitor must skip
push-down and
+ // return Optional.empty() instead of throwing
UnsupportedOperationException.
+ assertThat(builder.isNaN(0).visit(OrcPredicateFunctionVisitor.VISITOR))
+ .isEqualTo(Optional.empty());
+ assertThat(builder.isNaN(1).visit(OrcPredicateFunctionVisitor.VISITOR))
+ .isEqualTo(Optional.empty());
+ }
+
private void test(Predicate predicate, OrcFilters.Predicate orcPredicate,
boolean canPushDown) {
Optional<OrcFilters.Predicate> optionalPredicate =
predicate.visit(OrcPredicateFunctionVisitor.VISITOR);