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;