HIVE-11484 : Fix ObjectInspector for Char and VarChar for null and string 
objects (Deepak Barr, reviewed by Amareshwari)


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

Branch: refs/heads/llap
Commit: ddab69c495ce6c325d7e06cfb0c704546e0d56b9
Parents: 94c1974
Author: Deepak Barr <deepak.b...@gmail.com>
Authored: Wed Apr 13 09:50:24 2016 +0530
Committer: Amareshwari Sriramadasu <amareshw...@apache.org>
Committed: Wed Apr 13 09:50:24 2016 +0530

----------------------------------------------------------------------
 .../hadoop/hive/common/type/HiveBaseChar.java   |  6 ++
 .../hadoop/hive/common/type/HiveVarchar.java    |  4 +-
 .../hive/common/type/TestHiveBaseChar.java      |  2 +
 .../primitive/JavaHiveCharObjectInspector.java  | 15 +++-
 .../JavaHiveVarcharObjectInspector.java         | 15 +++-
 .../PrimitiveObjectInspectorConverter.java      |  8 +-
 .../TestObjectInspectorConverters.java          | 95 ++++++++++++++++++++
 .../TestStandardObjectInspectors.java           | 14 ++-
 8 files changed, 148 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
----------------------------------------------------------------------
diff --git 
a/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java 
b/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
index 3514726..53684e7 100644
--- a/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
+++ b/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
@@ -38,6 +38,9 @@ public abstract class HiveBaseChar {
   }
 
   public static String enforceMaxLength(String val, int maxLength) {
+    if (val == null) {
+      return null;
+    }
     String value = val;
 
     if (maxLength > 0) {
@@ -52,6 +55,9 @@ public abstract class HiveBaseChar {
   }
 
   public static String getPaddedValue(String val, int maxLength) {
+    if (val == null) {
+      return null;
+    }
     if (maxLength < 0) {
       return val;
     }

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
----------------------------------------------------------------------
diff --git 
a/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java 
b/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
index 969d474..09009eb 100644
--- a/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
+++ b/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
@@ -58,10 +58,10 @@ public class HiveVarchar extends HiveBaseChar
     return this.getValue().compareTo(rhs.getValue());
   }
 
-  public boolean equals(HiveVarchar rhs) {
+  public boolean equals(Object rhs) {
     if (rhs == this) {
       return true;
     }
-    return this.getValue().equals(rhs.getValue());
+    return this.getValue().equals(((HiveVarchar)rhs).getValue());
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/common/src/test/org/apache/hadoop/hive/common/type/TestHiveBaseChar.java
----------------------------------------------------------------------
diff --git 
a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveBaseChar.java 
b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveBaseChar.java
index 2848465..98ad74a 100644
--- a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveBaseChar.java
+++ b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveBaseChar.java
@@ -80,6 +80,7 @@ public class TestHiveBaseChar extends TestCase {
         assertEquals(strLen, enforcedString.codePointCount(0, 
enforcedString.length()));
       }
     }
+    assertNull(HiveBaseChar.enforceMaxLength(null, 0));
   }
 
   public void testGetPaddedValue() {
@@ -96,5 +97,6 @@ public class TestHiveBaseChar extends TestCase {
 
     assertEquals("abc       ", HiveBaseChar.getPaddedValue("abc", 10));
     assertEquals("abc       ", HiveBaseChar.getPaddedValue("abc ", 10));
+    assertNull(HiveBaseChar.getPaddedValue(null, 0));
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveCharObjectInspector.java
----------------------------------------------------------------------
diff --git 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveCharObjectInspector.java
 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveCharObjectInspector.java
index f429709..3d89c92 100644
--- 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveCharObjectInspector.java
+++ 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveCharObjectInspector.java
@@ -37,7 +37,12 @@ public class JavaHiveCharObjectInspector extends 
AbstractPrimitiveJavaObjectInsp
     if (o == null) {
       return null;
     }
-    HiveChar value = (HiveChar) o;
+    HiveChar value;
+    if (o instanceof String) {
+      value = new HiveChar((String) o, getMaxLength());
+    } else {
+      value = (HiveChar) o;
+    }
     if (BaseCharUtils.doesPrimitiveMatchTypeParams(value, (CharTypeInfo) 
typeInfo)) {
       return value;
     }
@@ -49,7 +54,13 @@ public class JavaHiveCharObjectInspector extends 
AbstractPrimitiveJavaObjectInsp
     if (o == null) {
       return null;
     }
-    return getWritableWithParams((HiveChar) o);
+    HiveChar var;
+    if (o instanceof String) {
+      var = new HiveChar((String) o, getMaxLength());
+    } else {
+      var = (HiveChar) o;
+    }
+    return getWritableWithParams(var);
   }
 
   private HiveChar getPrimitiveWithParams(HiveChar val) {

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
----------------------------------------------------------------------
diff --git 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
index a8e34ff..2320d2d 100644
--- 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
+++ 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
@@ -38,7 +38,12 @@ public class JavaHiveVarcharObjectInspector extends 
AbstractPrimitiveJavaObjectI
     if (o == null) {
       return null;
     }
-    HiveVarchar value = (HiveVarchar) o;
+    HiveVarchar value;
+    if (o instanceof String) {
+      value= new HiveVarchar((String)o, getMaxLength());
+    } else {
+      value = (HiveVarchar)o;
+    }
     if (BaseCharUtils.doesPrimitiveMatchTypeParams(value, (VarcharTypeInfo) 
typeInfo)) {
       return value;
     }
@@ -51,7 +56,13 @@ public class JavaHiveVarcharObjectInspector extends 
AbstractPrimitiveJavaObjectI
     if (o == null) {
       return null;
     }
-    return getWritableWithParams((HiveVarchar) o);
+    HiveVarchar var;
+    if (o instanceof String) {
+      var= new HiveVarchar((String)o, getMaxLength());
+    } else {
+      var = (HiveVarchar)o;
+    }
+    return getWritableWithParams(var);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
----------------------------------------------------------------------
diff --git 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
index 5eb41d5..e08ad43 100644
--- 
a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
+++ 
b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
@@ -514,7 +514,7 @@ public class PrimitiveObjectInspectorConverter {
 
     PrimitiveObjectInspector inputOI;
     SettableHiveVarcharObjectInspector outputOI;
-    HiveVarcharWritable hc;
+    Object hc;
 
     public HiveVarcharConverter(PrimitiveObjectInspector inputOI,
         SettableHiveVarcharObjectInspector outputOI) {
@@ -528,7 +528,7 @@ public class PrimitiveObjectInspectorConverter {
       //if (typeParams == null) {
       //  throw new RuntimeException("varchar type used without type params");
       //}
-      hc = new HiveVarcharWritable();
+      hc = outputOI.create(new HiveVarchar("",-1));
     }
 
     @Override
@@ -551,13 +551,13 @@ public class PrimitiveObjectInspectorConverter {
   public static class HiveCharConverter implements Converter {
     PrimitiveObjectInspector inputOI;
     SettableHiveCharObjectInspector outputOI;
-    HiveCharWritable hc;
+    Object hc;
 
     public HiveCharConverter(PrimitiveObjectInspector inputOI,
         SettableHiveCharObjectInspector outputOI) {
       this.inputOI = inputOI;
       this.outputOI = outputOI;
-      hc = new HiveCharWritable();
+      hc = outputOI.create(new HiveChar("",-1));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
----------------------------------------------------------------------
diff --git 
a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
 
b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
index dd18517..2e1bb22 100644
--- 
a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
+++ 
b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java
@@ -22,10 +22,15 @@ import java.util.List;
 
 import junit.framework.TestCase;
 
+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.serde2.io.ByteWritable;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveCharWritable;
+import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
 import org.apache.hadoop.hive.serde2.io.ShortWritable;
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
 import 
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
@@ -116,6 +121,96 @@ public class TestObjectInspectorConverters extends 
TestCase {
           .convert(Integer.valueOf(1)));
       assertEquals("DoubleConverter", null, doubleConverter.convert(null));
 
+      // Char
+      Converter charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveChar("TRUE", -1), charConverter
+        .convert(Boolean.valueOf(true)));
+      assertEquals("CharConverter", new HiveChar("FALSE", -1), charConverter
+        .convert(Boolean.valueOf(false)));
+
+      charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveCharWritable(new HiveChar("TRUE", 
-1)), charConverter
+        .convert(Boolean.valueOf(true)));
+      assertEquals("CharConverter", new HiveCharWritable(new HiveChar("FALSE", 
-1)), charConverter
+        .convert(Boolean.valueOf(false)));
+
+      charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveChar("0", -1), charConverter
+        .convert(Integer.valueOf(0)));
+      assertEquals("CharConverter", new HiveChar("1", -1), charConverter
+        .convert(Integer.valueOf(1)));
+
+      charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveCharWritable(new HiveChar("0", 
-1)), charConverter
+        .convert(Integer.valueOf(0)));
+      assertEquals("CharConverter", new HiveCharWritable(new HiveChar("1", 
-1)), charConverter
+        .convert(Integer.valueOf(1)));
+
+      charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveChar("hive", -1), charConverter
+        .convert(String.valueOf("hive")));
+
+      charConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveCharObjectInspector);
+      assertEquals("CharConverter", new HiveCharWritable(new HiveChar("hive", 
-1)), charConverter
+        .convert(String.valueOf("hive")));
+
+      // VarChar
+      Converter varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarchar("TRUE", -1), 
varcharConverter
+        .convert(Boolean.valueOf(true)));
+      assertEquals("VarCharConverter", new HiveVarchar("FALSE", -1), 
varcharConverter
+        .convert(Boolean.valueOf(false)));
+
+      varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaBooleanObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarcharWritable(new 
HiveVarchar("TRUE", -1)), varcharConverter
+        .convert(Boolean.valueOf(true)));
+      assertEquals("VarCharConverter", new HiveVarcharWritable(new 
HiveVarchar("FALSE", -1)), varcharConverter
+        .convert(Boolean.valueOf(false)));
+
+      varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarchar("0", -1), 
varcharConverter
+        .convert(Integer.valueOf(0)));
+      assertEquals("VarCharConverter", new HiveVarchar("1", -1), 
varcharConverter
+        .convert(Integer.valueOf(1)));
+
+      varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarcharWritable(new 
HiveVarchar("0", -1)), varcharConverter
+        .convert(Integer.valueOf(0)));
+      assertEquals("VarCharConverter", new HiveVarcharWritable(new 
HiveVarchar("1", -1)), varcharConverter
+        .convert(Integer.valueOf(1)));
+
+      varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+        PrimitiveObjectInspectorFactory.javaHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarchar("hive", -1), 
varcharConverter
+        .convert(String.valueOf("hive")));
+
+      varcharConverter = ObjectInspectorConverters.getConverter(
+        PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+        PrimitiveObjectInspectorFactory.writableHiveVarcharObjectInspector);
+      assertEquals("VarCharConverter", new HiveVarcharWritable(new 
HiveVarchar("hive", -1)), varcharConverter
+        .convert(String.valueOf("hive")));
+
       // Text
       Converter textConverter = ObjectInspectorConverters.getConverter(
           PrimitiveObjectInspectorFactory.javaIntObjectInspector,

http://git-wip-us.apache.org/repos/asf/hive/blob/ddab69c4/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
----------------------------------------------------------------------
diff --git 
a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
 
b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
index 7d87666..29906c9 100644
--- 
a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
+++ 
b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
@@ -24,9 +24,13 @@ import java.util.List;
 
 import junit.framework.TestCase;
 
+import org.apache.hadoop.hive.common.type.HiveChar;
+import org.apache.hadoop.hive.common.type.HiveVarchar;
 import org.apache.hadoop.hive.serde2.SerDeUtils;
 import org.apache.hadoop.hive.serde2.io.ByteWritable;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveCharWritable;
+import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
 import org.apache.hadoop.hive.serde2.io.ShortWritable;
 import org.apache.hadoop.hive.serde2.io.TimestampWritable;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
@@ -118,8 +122,14 @@ public class TestStandardObjectInspectors extends TestCase 
{
             .getClass());
       }
 
-      assertEquals(PrimitiveObjectInspectorUtils
+      if (javaClass == HiveVarchar.class) {
+        assertEquals("varchar(65535)", oi1.getTypeName());
+      } else if (javaClass == HiveChar.class) {
+        assertEquals("char(255)", oi1.getTypeName());
+      } else {
+        assertEquals(PrimitiveObjectInspectorUtils
           .getTypeNameFromPrimitiveJava(javaClass), oi1.getTypeName());
+      }
     } catch (Throwable e) {
       e.printStackTrace();
       throw e;
@@ -143,6 +153,8 @@ public class TestStandardObjectInspectors extends TestCase {
       doTestJavaPrimitiveObjectInspector(DoubleWritable.class, Double.class,
           (double) 1);
       doTestJavaPrimitiveObjectInspector(Text.class, String.class, "a");
+      doTestJavaPrimitiveObjectInspector(HiveVarcharWritable.class, 
HiveVarchar.class, "a");
+      doTestJavaPrimitiveObjectInspector(HiveCharWritable.class, 
HiveChar.class, "a");
       doTestJavaPrimitiveObjectInspector(BytesWritable.class, byte[].class, 
new byte[]{'3'});
 
     } catch (Throwable e) {

Reply via email to