From 7739288651ff49fc8b74bbf72c59f84661c79bf9 Mon Sep 17 00:00:00 2001 From: Panagiotis Garefalakis Date: Sun, 10 Jan 2021 23:20:56 +0200 Subject: [PATCH] ORC-724: PPD: Date IN single value comparison throws ClassCastException Change-Id: I4445171dcec789f2165d1ae5a82dc911e2ed74a7 --- .../org/apache/orc/impl/RecordReaderImpl.java | 3 ++- .../apache/orc/impl/TestRecordReaderImpl.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/java/core/src/java/org/apache/orc/impl/RecordReaderImpl.java b/java/core/src/java/org/apache/orc/impl/RecordReaderImpl.java index 5c0aec3616..393434097d 100644 --- a/java/core/src/java/org/apache/orc/impl/RecordReaderImpl.java +++ b/java/core/src/java/org/apache/orc/impl/RecordReaderImpl.java @@ -649,7 +649,8 @@ private static TruthValue evaluatePredicateMinMax(PredicateLeaf predicate, // for a single value, look through to see if that value is in the // set for (Object arg : predicate.getLiteralList()) { - if (range.compare((Comparable) arg) == Location.MIN) { + predObj = getBaseObjectForComparison(predicate.getType(), (Comparable) arg); + if (range.compare(predObj) == Location.MIN) { return range.addNull(TruthValue.YES); } } diff --git a/java/core/src/test/org/apache/orc/impl/TestRecordReaderImpl.java b/java/core/src/test/org/apache/orc/impl/TestRecordReaderImpl.java index 4375d3a2c5..4247733b10 100644 --- a/java/core/src/test/org/apache/orc/impl/TestRecordReaderImpl.java +++ b/java/core/src/test/org/apache/orc/impl/TestRecordReaderImpl.java @@ -1082,6 +1082,23 @@ public void testIn() throws Exception { evaluateInteger(createIntStats(12L, 18L), pred)); } + @Test + public void testInDatePredConversion() { + List args = new ArrayList<>(); + args.add(toDate(LocalDate.ofEpochDay(15))); + PredicateLeaf pred = createPredicateLeaf + (PredicateLeaf.Operator.IN, PredicateLeaf.Type.DATE, + "x", null, args); + assertEquals(TruthValue.YES_NULL, + evaluateInteger(createDateStats(15, 15), pred)); + assertEquals(TruthValue.YES_NO_NULL, + evaluateInteger(createDateStats(10, 30), pred)); + assertEquals(TruthValue.NO_NULL, + evaluateInteger(createDateStats(5, 10), pred)); + assertEquals(TruthValue.NO_NULL, + evaluateInteger(createDateStats(16, 30), pred)); + } + @Test public void testBetween() { List args = new ArrayList();