diff --git ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java index 6aa35e1..eeb9641 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java @@ -18,17 +18,21 @@ package org.apache.hadoop.hive.ql.io.sarg; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.common.type.HiveChar; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.common.type.HiveVarchar; -import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf; -import org.apache.hadoop.hive.ql.io.sarg.SearchArgument; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; @@ -52,15 +56,9 @@ import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; -import java.math.BigDecimal; -import java.sql.Timestamp; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Deque; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; /** * The implementation of SearchArguments. @@ -366,7 +364,7 @@ private static Object boxLiteral(ExprNodeConstantDesc lit) { case STRING: return StringUtils.stripEnd(lit.getValue().toString(), null); case FLOAT: - return ((Number) lit.getValue()).doubleValue(); + return Double.parseDouble(lit.getValue().toString()); case DATE: case TIMESTAMP: case DECIMAL: @@ -977,7 +975,9 @@ private static Object boxLiteral(Object literal) { literal instanceof Integer) { return Long.valueOf(literal.toString()); } else if (literal instanceof Float) { - return Double.valueOf((Float) literal); + // to avoid change in precision when upcasting float to double + // we convert the literal to string and parse it as double. (HIVE-8460) + return Double.parseDouble(literal.toString()); } else { throw new IllegalArgumentException("Unknown type for literal " + literal); diff --git ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java index 96728d9..831ef8c 100644 --- ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java +++ ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java @@ -2881,4 +2881,24 @@ public void testBuilderComplexTypes2() throws Exception { "leaf-3 = (NULL_SAFE_EQUALS a stinger)\n" + "expr = (and (not leaf-0) (not leaf-1) (not leaf-2) (not leaf-3))", sarg.toString()); } + + @Test + public void testBuilderFloat() throws Exception { + SearchArgument sarg = + SearchArgumentFactory.newBuilder() + .startAnd() + .lessThan("x", new Short((short) 22)) + .lessThan("x1", new Integer(22)) + .lessThanEquals("y", new HiveChar("hi", 10)) + .equals("z", new Float("0.22")) + .equals("z1", new Double(0.22)) + .end() + .build(); + assertEquals("leaf-0 = (LESS_THAN x 22)\n" + + "leaf-1 = (LESS_THAN x1 22)\n" + + "leaf-2 = (LESS_THAN_EQUALS y hi)\n" + + "leaf-3 = (EQUALS z 0.22)\n" + + "leaf-4 = (EQUALS z1 0.22)\n" + + "expr = (and leaf-0 leaf-1 leaf-2 leaf-3 leaf-4)", sarg.toString()); + } } diff --git ql/src/test/queries/clientpositive/orc_ppd_decimal.q ql/src/test/queries/clientpositive/orc_ppd_decimal.q index dde64b3..a54b862 100644 --- ql/src/test/queries/clientpositive/orc_ppd_decimal.q +++ ql/src/test/queries/clientpositive/orc_ppd_decimal.q @@ -22,9 +22,7 @@ set hive.optimize.index.filter=false; select sum(hash(*)) from newtypesorc where d=cast('0.22' as float); set hive.optimize.index.filter=true; -set hive.optimize.constant.propagation=false; select sum(hash(*)) from newtypesorc where d=cast('0.22' as float); -set hive.optimize.constant.propagation=true; set hive.optimize.index.filter=false; select sum(hash(*)) from newtypesorc where d!=0.22;