Author: rhbutani
Date: Thu Dec  5 21:42:20 2013
New Revision: 1548312

URL: http://svn.apache.org/r1548312
Log:
HIVE-5899 NPE during explain extended with char/varchar columns (Jason Dere via 
Harish Butani)

Modified:
    hive/trunk/data/files/alltypes.txt
    
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
    hive/trunk/ql/src/test/queries/clientpositive/annotate_stats_select.q
    hive/trunk/ql/src/test/results/clientpositive/annotate_stats_select.q.out

Modified: hive/trunk/data/files/alltypes.txt
URL: 
http://svn.apache.org/viewvc/hive/trunk/data/files/alltypes.txt?rev=1548312&r1=1548311&r2=1548312&view=diff
==============================================================================
--- hive/trunk/data/files/alltypes.txt (original)
+++ hive/trunk/data/files/alltypes.txt Thu Dec  5 21:42:20 2013
@@ -1,2 +1,2 @@
-true|10|100|1000|10000|4.0|20.0|2.2222|1969-12-31 15:59:58.174|1970-01-01 
00:00:00|hello|k1:v1,k2:v2|100,200|{10, "foo"}
-true|20|200|2000|20000|8.0|40.0|4.2222|1970-12-31 15:59:58.174|1971-01-01 
00:00:00||k3:v3,k4:v4|200,300|{20, "bar"}
+true|10|100|1000|10000|4.0|20.0|2.2222|1969-12-31 15:59:58.174|1970-01-01 
00:00:00|hello|hello|k1:v1,k2:v2|100,200|{10, "foo"}
+true|20|200|2000|20000|8.0|40.0|4.2222|1970-12-31 15:59:58.174|1971-01-01 
00:00:00|||k3:v3,k4:v4|200,300|{20, "bar"}

Modified: 
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java?rev=1548312&r1=1548311&r2=1548312&view=diff
==============================================================================
--- 
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java 
(original)
+++ 
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java 
Thu Dec  5 21:42:20 2013
@@ -4943,38 +4943,39 @@ public class ObjectStore implements RawS
     ColumnStatisticsObj statsObj = new ColumnStatisticsObj();
     statsObj.setColType(mStatsObj.getColType());
     statsObj.setColName(mStatsObj.getColName());
-    String colType = mStatsObj.getColType();
+    String colType = mStatsObj.getColType().toLowerCase();
     ColumnStatisticsData colStatsData = new ColumnStatisticsData();
 
-    if (colType.equalsIgnoreCase("boolean")) {
+    if (colType.equals("boolean")) {
       BooleanColumnStatsData boolStats = new BooleanColumnStatsData();
       boolStats.setNumFalses(mStatsObj.getNumFalses());
       boolStats.setNumTrues(mStatsObj.getNumTrues());
       boolStats.setNumNulls(mStatsObj.getNumNulls());
       colStatsData.setBooleanStats(boolStats);
-    } else if (colType.equalsIgnoreCase("string")) {
+    } else if (colType.equals("string") ||
+        colType.startsWith("varchar") || colType.startsWith("char")) {
       StringColumnStatsData stringStats = new StringColumnStatsData();
       stringStats.setNumNulls(mStatsObj.getNumNulls());
       stringStats.setAvgColLen(mStatsObj.getAvgColLen());
       stringStats.setMaxColLen(mStatsObj.getMaxColLen());
       stringStats.setNumDVs(mStatsObj.getNumDVs());
       colStatsData.setStringStats(stringStats);
-    } else if (colType.equalsIgnoreCase("binary")) {
+    } else if (colType.equals("binary")) {
       BinaryColumnStatsData binaryStats = new BinaryColumnStatsData();
       binaryStats.setNumNulls(mStatsObj.getNumNulls());
       binaryStats.setAvgColLen(mStatsObj.getAvgColLen());
       binaryStats.setMaxColLen(mStatsObj.getMaxColLen());
       colStatsData.setBinaryStats(binaryStats);
-    } else if (colType.equalsIgnoreCase("bigint") || 
colType.equalsIgnoreCase("int") ||
-        colType.equalsIgnoreCase("smallint") || 
colType.equalsIgnoreCase("tinyint") ||
-        colType.equalsIgnoreCase("timestamp")) {
+    } else if (colType.equals("bigint") || colType.equals("int") ||
+        colType.equals("smallint") || colType.equals("tinyint") ||
+        colType.equals("timestamp")) {
       LongColumnStatsData longStats = new LongColumnStatsData();
       longStats.setNumNulls(mStatsObj.getNumNulls());
       longStats.setHighValue(mStatsObj.getLongHighValue());
       longStats.setLowValue(mStatsObj.getLongLowValue());
       longStats.setNumDVs(mStatsObj.getNumDVs());
       colStatsData.setLongStats(longStats);
-   } else if (colType.equalsIgnoreCase("double") || 
colType.equalsIgnoreCase("float")) {
+   } else if (colType.equals("double") || colType.equals("float")) {
      DoubleColumnStatsData doubleStats = new DoubleColumnStatsData();
      doubleStats.setNumNulls(mStatsObj.getNumNulls());
      doubleStats.setHighValue(mStatsObj.getDoubleHighValue());
@@ -5119,38 +5120,39 @@ public class ObjectStore implements RawS
     ColumnStatisticsObj statsObj = new ColumnStatisticsObj();
     statsObj.setColType(mStatsObj.getColType());
     statsObj.setColName(mStatsObj.getColName());
-    String colType = mStatsObj.getColType();
+    String colType = mStatsObj.getColType().toLowerCase();
     ColumnStatisticsData colStatsData = new ColumnStatisticsData();
 
-    if (colType.equalsIgnoreCase("boolean")) {
+    if (colType.equals("boolean")) {
       BooleanColumnStatsData boolStats = new BooleanColumnStatsData();
       boolStats.setNumFalses(mStatsObj.getNumFalses());
       boolStats.setNumTrues(mStatsObj.getNumTrues());
       boolStats.setNumNulls(mStatsObj.getNumNulls());
       colStatsData.setBooleanStats(boolStats);
-    } else if (colType.equalsIgnoreCase("string")) {
+    } else if (colType.equals("string") ||
+        colType.startsWith("varchar") || colType.startsWith("char")) {
       StringColumnStatsData stringStats = new StringColumnStatsData();
       stringStats.setNumNulls(mStatsObj.getNumNulls());
       stringStats.setAvgColLen(mStatsObj.getAvgColLen());
       stringStats.setMaxColLen(mStatsObj.getMaxColLen());
       stringStats.setNumDVs(mStatsObj.getNumDVs());
       colStatsData.setStringStats(stringStats);
-    } else if (colType.equalsIgnoreCase("binary")) {
+    } else if (colType.equals("binary")) {
       BinaryColumnStatsData binaryStats = new BinaryColumnStatsData();
       binaryStats.setNumNulls(mStatsObj.getNumNulls());
       binaryStats.setAvgColLen(mStatsObj.getAvgColLen());
       binaryStats.setMaxColLen(mStatsObj.getMaxColLen());
       colStatsData.setBinaryStats(binaryStats);
-    } else if (colType.equalsIgnoreCase("tinyint") || 
colType.equalsIgnoreCase("smallint") ||
-        colType.equalsIgnoreCase("int") || colType.equalsIgnoreCase("bigint") 
||
-        colType.equalsIgnoreCase("timestamp")) {
+    } else if (colType.equals("tinyint") || colType.equals("smallint") ||
+        colType.equals("int") || colType.equals("bigint") ||
+        colType.equals("timestamp")) {
       LongColumnStatsData longStats = new LongColumnStatsData();
       longStats.setNumNulls(mStatsObj.getNumNulls());
       longStats.setHighValue(mStatsObj.getLongHighValue());
       longStats.setLowValue(mStatsObj.getLongLowValue());
       longStats.setNumDVs(mStatsObj.getNumDVs());
       colStatsData.setLongStats(longStats);
-   } else if (colType.equalsIgnoreCase("double") || 
colType.equalsIgnoreCase("float")) {
+   } else if (colType.equals("double") || colType.equals("float")) {
      DoubleColumnStatsData doubleStats = new DoubleColumnStatsData();
      doubleStats.setNumNulls(mStatsObj.getNumNulls());
      doubleStats.setHighValue(mStatsObj.getDoubleHighValue());

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java?rev=1548312&r1=1548311&r2=1548312&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java Thu 
Dec  5 21:42:20 2013
@@ -1864,6 +1864,8 @@ class WriterImpl implements Writer, Memo
     case DOUBLE:
       return numVals * JavaDataModel.get().primitive2();
     case STRING:
+    case VARCHAR:
+    case CHAR:
       // ORC strings are converted to java Strings. so use JavaDataModel to
       // compute the overall size of strings
       child = (StringTreeWriter) child;

Modified: hive/trunk/ql/src/test/queries/clientpositive/annotate_stats_select.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/annotate_stats_select.q?rev=1548312&r1=1548311&r2=1548312&view=diff
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/annotate_stats_select.q 
(original)
+++ hive/trunk/ql/src/test/queries/clientpositive/annotate_stats_select.q Thu 
Dec  5 21:42:20 2013
@@ -12,6 +12,7 @@ create table if not exists alltypes (
  ts1 timestamp,
  da1 timestamp,
  s1 string,
+ vc1 varchar(5),
  m1 map<string, string>,
  l1 array<int>,
  st1 struct<c1:int, c2:string>
@@ -30,7 +31,7 @@ insert overwrite table alltypes_orc sele
 explain extended select * from alltypes_orc;
 
 -- statistics for complex types are not supported yet
-analyze table alltypes_orc compute statistics for columns bo1, ti1, si1, i1, 
bi1, f1, d1,s1;
+analyze table alltypes_orc compute statistics for columns bo1, ti1, si1, i1, 
bi1, f1, d1, s1, vc1;
 
 -- numRows: 2 rawDataSize: 1514
 explain extended select * from alltypes_orc;


Reply via email to