diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java index f5023bb..f8a6e64 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java @@ -21,6 +21,7 @@ import java.io.EOFException; import java.io.IOException; +import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.sql.Timestamp; @@ -2410,6 +2411,9 @@ static TruthValue evaluatePredicateRange(PredicateLeaf predicate, Object min, private static Object getBaseObjectForComparison(Object predObj, Object statsObj) { if (predObj != null) { + if (predObj instanceof ExprNodeConstantDesc) { + predObj = ((ExprNodeConstantDesc) predObj).getValue(); + } // following are implicitly convertible if (statsObj instanceof Long) { if (predObj instanceof Double) { @@ -2428,10 +2432,6 @@ private static Object getBaseObjectForComparison(Object predObj, Object statsObj return Double.valueOf(predObj.toString()); } } else if (statsObj instanceof String) { - // Ex: where d = date '1970-02-01' will be ExprNodeConstantDesc - if (predObj instanceof ExprNodeConstantDesc) { - return ((ExprNodeConstantDesc) predObj).getValue().toString(); - } return predObj.toString(); } else if (statsObj instanceof HiveDecimal) { if (predObj instanceof Long) { @@ -2440,6 +2440,8 @@ private static Object getBaseObjectForComparison(Object predObj, Object statsObj return HiveDecimal.create(predObj.toString()); } else if (predObj instanceof String) { return HiveDecimal.create(predObj.toString()); + } else if (predObj instanceof BigDecimal) { + return HiveDecimal.create((BigDecimal)predObj); } } } diff --git ql/src/test/queries/clientpositive/orc_ppd_decimal.q ql/src/test/queries/clientpositive/orc_ppd_decimal.q index a93590e..a54b862 100644 --- ql/src/test/queries/clientpositive/orc_ppd_decimal.q +++ ql/src/test/queries/clientpositive/orc_ppd_decimal.q @@ -85,6 +85,18 @@ set hive.optimize.index.filter=true; select sum(hash(*)) from newtypesorc where d<=cast('11.22' as float); set hive.optimize.index.filter=false; +select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal); + +set hive.optimize.index.filter=true; +select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal); + +set hive.optimize.index.filter=false; +select sum(hash(*)) from newtypesorc where d<=11.22BD; + +set hive.optimize.index.filter=true; +select sum(hash(*)) from newtypesorc where d<=11.22BD; + +set hive.optimize.index.filter=false; select sum(hash(*)) from newtypesorc where d<=12; set hive.optimize.index.filter=true; diff --git ql/src/test/results/clientpositive/orc_ppd_decimal.q.out ql/src/test/results/clientpositive/orc_ppd_decimal.q.out index 0c11ea8..6ddff10 100644 --- ql/src/test/results/clientpositive/orc_ppd_decimal.q.out +++ ql/src/test/results/clientpositive/orc_ppd_decimal.q.out @@ -254,6 +254,42 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@newtypesorc #### A masked pattern was here #### 81475875500 +PREHOOK: query: select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal) +PREHOOK: type: QUERY +PREHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +POSTHOOK: query: select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +-252951929000 +PREHOOK: query: select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal) +PREHOOK: type: QUERY +PREHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +POSTHOOK: query: select sum(hash(*)) from newtypesorc where d<=cast('11.22' as decimal) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +-252951929000 +PREHOOK: query: select sum(hash(*)) from newtypesorc where d<=11.22BD +PREHOOK: type: QUERY +PREHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +POSTHOOK: query: select sum(hash(*)) from newtypesorc where d<=11.22BD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +81475875500 +PREHOOK: query: select sum(hash(*)) from newtypesorc where d<=11.22BD +PREHOOK: type: QUERY +PREHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +POSTHOOK: query: select sum(hash(*)) from newtypesorc where d<=11.22BD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@newtypesorc +#### A masked pattern was here #### +81475875500 PREHOOK: query: select sum(hash(*)) from newtypesorc where d<=12 PREHOOK: type: QUERY PREHOOK: Input: default@newtypesorc