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;