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 2019/01/25 15:49:34 UTC

hive git commit: HIVE-11708 : Logical operators raises ClassCastExceptions with NULL (Ryu Kobayashi via Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master 20d9306e9 -> 6d4b19b55


HIVE-11708 : Logical operators raises ClassCastExceptions with NULL (Ryu Kobayashi via Ashutosh Chauhan)

Signed-off-by: Ashutosh Chauhan <ha...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/6d4b19b5
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/6d4b19b5
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/6d4b19b5

Branch: refs/heads/master
Commit: 6d4b19b5534781e21d30b5c67889f64401c051ed
Parents: 20d9306
Author: Ryu Kobayashi <be...@gmail.com>
Authored: Fri Jan 25 07:48:26 2019 -0800
Committer: Ashutosh Chauhan <ha...@apache.org>
Committed: Fri Jan 25 07:48:26 2019 -0800

----------------------------------------------------------------------
 .../hive/ql/udf/generic/GenericUDFOPAnd.java    |   6 +-
 .../hive/ql/udf/generic/GenericUDFOPOr.java     |   6 +-
 .../ql/udf/generic/TestGenericUDFOPAnd.java     | 173 +++++++++++++++++++
 .../hive/ql/udf/generic/TestGenericUDFOPOr.java | 173 +++++++++++++++++++
 4 files changed, 356 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/6d4b19b5/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPAnd.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPAnd.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPAnd.java
index 138a419..d1777af 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPAnd.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPAnd.java
@@ -53,7 +53,11 @@ public class GenericUDFOPAnd extends GenericUDF {
     }
     boi = new BooleanObjectInspector[arguments.length];
     for (int i = 0; i < arguments.length; i++) {
-      boi[i] = (BooleanObjectInspector) arguments[i];
+      if (!(arguments[i] instanceof BooleanObjectInspector)) {
+        boi[i] = PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
+      } else {
+        boi[i] = (BooleanObjectInspector) arguments[i];
+      }
     }
     return PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/6d4b19b5/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPOr.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPOr.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPOr.java
index cab7176..5b0bdc2 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPOr.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPOr.java
@@ -54,7 +54,11 @@ public class GenericUDFOPOr extends GenericUDF {
     }
     boi = new BooleanObjectInspector[arguments.length];
     for (int i = 0; i < arguments.length; i++) {
-      boi[i] = (BooleanObjectInspector) arguments[i];
+      if (!(arguments[i] instanceof BooleanObjectInspector)) {
+        boi[i] = PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
+      } else {
+        boi[i] = (BooleanObjectInspector) arguments[i];
+      }
     }
     return PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/6d4b19b5/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPAnd.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPAnd.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPAnd.java
new file mode 100644
index 0000000..19be808
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPAnd.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.io.BooleanWritable;
+import org.apache.hadoop.io.Writable;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestGenericUDFOPAnd {
+  @Test
+  public void testTrueAndTrue() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    BooleanWritable left = new BooleanWritable(true);
+    BooleanWritable right = new BooleanWritable(true);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(true, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testTrueAndFalse() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    BooleanWritable left = new BooleanWritable(true);
+    BooleanWritable right = new BooleanWritable(false);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(false, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testFalseAndFalse() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    BooleanWritable left = new BooleanWritable(false);
+    BooleanWritable right = new BooleanWritable(false);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(false, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testTrueAndNull() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    BooleanWritable left = new BooleanWritable(true);
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(null, res);
+    udf.close();
+  }
+
+  @Test
+  public void testFalseAndNull() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    BooleanWritable left = new BooleanWritable(false);
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(false, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testNullAndNull() throws HiveException, IOException {
+    GenericUDFOPAnd udf = new GenericUDFOPAnd();
+
+    Writable left = null;
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(null, res);
+    udf.close();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/6d4b19b5/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPOr.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPOr.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPOr.java
new file mode 100644
index 0000000..83fe262
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPOr.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.io.BooleanWritable;
+import org.apache.hadoop.io.Writable;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestGenericUDFOPOr {
+  @Test
+  public void testTrueOrTrue() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    BooleanWritable left = new BooleanWritable(true);
+    BooleanWritable right = new BooleanWritable(true);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(true, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testTrueOrFalse() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    BooleanWritable left = new BooleanWritable(true);
+    BooleanWritable right = new BooleanWritable(false);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(true, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testFalseOrFalse() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    BooleanWritable left = new BooleanWritable(false);
+    BooleanWritable right = new BooleanWritable(false);
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(false, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testTrueOrNull() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    BooleanWritable left = new BooleanWritable(true);
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(true, res.get());
+    udf.close();
+  }
+
+  @Test
+  public void testFalseOrNull() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    BooleanWritable left = new BooleanWritable(false);
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(null, res);
+    udf.close();
+  }
+
+  @Test
+  public void testNullOrNull() throws HiveException, IOException {
+    GenericUDFOPOr udf = new GenericUDFOPOr();
+
+    Writable left = null;
+    Writable right = null;
+
+    ObjectInspector[] inputOIs = {
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector,
+        PrimitiveObjectInspectorFactory.writableVoidObjectInspector
+    };
+    DeferredObject[] args = {
+        new DeferredJavaObject(left),
+        new DeferredJavaObject(right),
+    };
+
+    PrimitiveObjectInspector oi = (PrimitiveObjectInspector) udf.initialize(inputOIs);
+    Assert.assertEquals(oi.getTypeInfo(), TypeInfoFactory.booleanTypeInfo);
+    BooleanWritable res = (BooleanWritable) udf.evaluate(args);
+    Assert.assertEquals(null, res);
+    udf.close();
+  }
+}