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();
+ }
+}