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 2013/10/25 06:04:30 UTC
svn commit: r1535621 - in /hive/trunk:
ql/src/java/org/apache/hadoop/hive/ql/udf/generic/
ql/src/test/queries/clientpositive/ ql/src/test/results/clientpositive/
serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/
Author: hashutosh
Date: Fri Oct 25 04:04:29 2013
New Revision: 1535621
URL: http://svn.apache.org/r1535621
Log:
HIVE-5619 : Allow concat() to accept mixed string/binary args (Jason Dere via Ashutosh Chauhan)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java
hive/trunk/ql/src/test/queries/clientpositive/udf_concat.q
hive/trunk/ql/src/test/results/clientpositive/udf_concat.q.out
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java?rev=1535621&r1=1535620&r2=1535621&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcat.java Fri Oct 25 04:04:29 2013
@@ -61,7 +61,6 @@ public class GenericUDFConcat extends Ge
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
// Loop through all the inputs to determine the appropriate return type/length.
- // Either all arguments are binary, or all columns are non-binary.
// Return type:
// All VARCHAR inputs: return VARCHAR
// All BINARY inputs: return BINARY
@@ -85,21 +84,16 @@ public class GenericUDFConcat extends Ge
case BINARY:
fixedLengthReturnValue = false;
if (returnType != currentCategory) {
- throw new UDFArgumentException(
- "CONCAT cannot take a mix of binary and non-binary arguments");
+ // mix of binary/non-binary args
+ returnType = PrimitiveCategory.STRING;
}
break;
case VARCHAR:
- if (returnType == PrimitiveCategory.BINARY) {
- throw new UDFArgumentException(
- "CONCAT cannot take a mix of binary and non-binary arguments");
+ if (!fixedLengthReturnValue) {
+ returnType = PrimitiveCategory.STRING;
}
break;
default:
- if (returnType == PrimitiveCategory.BINARY) {
- throw new UDFArgumentException(
- "CONCAT cannot take a mix of binary and non-binary arguments");
- }
returnType = PrimitiveCategory.STRING;
fixedLengthReturnValue = false;
break;
Modified: hive/trunk/ql/src/test/queries/clientpositive/udf_concat.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_concat.q?rev=1535621&r1=1535620&r2=1535621&view=diff
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_concat.q (original)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_concat.q Fri Oct 25 04:04:29 2013
@@ -13,3 +13,9 @@ SELECT
concat(1),
concat('1234', 'abc', 'extra argument')
FROM src LIMIT 1;
+
+-- binary/mixed
+SELECT
+ concat(cast('ab' as binary), cast('cd' as binary)),
+ concat('ab', cast('cd' as binary))
+FROM src LIMIT 1;
Modified: hive/trunk/ql/src/test/results/clientpositive/udf_concat.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_concat.q.out?rev=1535621&r1=1535620&r2=1535621&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_concat.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_concat.q.out Fri Oct 25 04:04:29 2013
@@ -43,3 +43,20 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@src
#### A masked pattern was here ####
ab abc NULL NULL a NULL 123a 12 1 1234abcextra argument
+PREHOOK: query: -- binary/mixed
+SELECT
+ concat(cast('ab' as binary), cast('cd' as binary)),
+ concat('ab', cast('cd' as binary))
+FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- binary/mixed
+SELECT
+ concat(cast('ab' as binary), cast('cd' as binary)),
+ concat('ab', cast('cd' as binary))
+FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+abcd abcd
Modified: hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java?rev=1535621&r1=1535620&r2=1535621&view=diff
==============================================================================
--- hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java (original)
+++ hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java Fri Oct 25 04:04:29 2013
@@ -21,6 +21,7 @@ package org.apache.hadoop.hive.serde2.ob
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
+import java.nio.charset.CharacterCodingException;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.HashMap;
@@ -773,6 +774,16 @@ public final class PrimitiveObjectInspec
case VOID:
result = null;
break;
+ case BINARY:
+ try {
+ byte[] bytes = ((BinaryObjectInspector) oi).getPrimitiveWritableObject(o).getBytes();
+ int byteLen = ((BinaryObjectInspector) oi).getPrimitiveWritableObject(o).getLength();
+ result = Text.decode(bytes, 0, byteLen);
+ } catch (CharacterCodingException err) {
+ // we tried ..
+ result = null;
+ }
+ break;
case BOOLEAN:
result = String.valueOf((((BooleanObjectInspector) oi).get(o)));
break;