You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/10/17 17:35:00 UTC
svn commit: r1632610 - in /hive/branches/branch-0.14/ql/src:
java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
test/queries/clientpositive/orc_ppd_decimal.q
Author: hashutosh
Date: Fri Oct 17 15:35:00 2014
New Revision: 1632610
URL: http://svn.apache.org/r1632610
Log:
HIVE-8460 : ORC SARG literal creation for double from float may lead to wrong evaluation of SARG (Prashanth J via Ashutosh Chauhan)
Modified:
hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
hive/branches/branch-0.14/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
hive/branches/branch-0.14/ql/src/test/queries/clientpositive/orc_ppd_decimal.q
Modified: hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java?rev=1632610&r1=1632609&r2=1632610&view=diff
==============================================================================
--- hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java (original)
+++ hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java Fri Oct 17 15:35:00 2014
@@ -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.obj
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 @@ final class SearchArgumentImpl implement
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 @@ final class SearchArgumentImpl implement
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);
Modified: hive/branches/branch-0.14/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java?rev=1632610&r1=1632609&r2=1632610&view=diff
==============================================================================
--- hive/branches/branch-0.14/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java (original)
+++ hive/branches/branch-0.14/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java Fri Oct 17 15:35:00 2014
@@ -2881,4 +2881,24 @@ public class TestSearchArgumentImpl {
"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());
+ }
}
Modified: hive/branches/branch-0.14/ql/src/test/queries/clientpositive/orc_ppd_decimal.q
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/ql/src/test/queries/clientpositive/orc_ppd_decimal.q?rev=1632610&r1=1632609&r2=1632610&view=diff
==============================================================================
--- hive/branches/branch-0.14/ql/src/test/queries/clientpositive/orc_ppd_decimal.q (original)
+++ hive/branches/branch-0.14/ql/src/test/queries/clientpositive/orc_ppd_decimal.q Fri Oct 17 15:35:00 2014
@@ -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;