You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by dm...@apache.org on 2020/03/25 20:42:22 UTC

[hive] branch master updated: HIVE-23057: ColumnStatsMergerFactory NPE Possible (David Mollitor reviewed by Zoltan Haindrich)

This is an automated email from the ASF dual-hosted git repository.

dmollitor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new ab31df6  HIVE-23057: ColumnStatsMergerFactory NPE Possible (David Mollitor reviewed by Zoltan Haindrich)
ab31df6 is described below

commit ab31df6b819925f6ea785371d6ab40106b342b07
Author: David Mollitor <dm...@apache.org>
AuthorDate: Wed Mar 25 16:39:50 2020 -0400

    HIVE-23057: ColumnStatsMergerFactory NPE Possible (David Mollitor reviewed by Zoltan Haindrich)
---
 .../merge/ColumnStatsMergerFactory.java            | 95 ++++++++++++----------
 1 file changed, 52 insertions(+), 43 deletions(-)

diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/columnstats/merge/ColumnStatsMergerFactory.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/columnstats/merge/ColumnStatsMergerFactory.java
index 261437b..04a2649 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/columnstats/merge/ColumnStatsMergerFactory.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/columnstats/merge/ColumnStatsMergerFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.hadoop.hive.metastore.columnstats.merge;
 
+import java.util.Objects;
+
 import org.apache.hadoop.hive.metastore.api.BinaryColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.BooleanColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsData;
@@ -31,60 +33,64 @@ import org.apache.hadoop.hive.metastore.columnstats.cache.LongColumnStatsDataIns
 import org.apache.hadoop.hive.metastore.columnstats.cache.StringColumnStatsDataInspector;
 import org.apache.hadoop.hive.metastore.columnstats.cache.TimestampColumnStatsDataInspector;
 
+import com.google.common.base.Preconditions;
+
 public class ColumnStatsMergerFactory {
 
   private ColumnStatsMergerFactory() {
   }
 
-  public static ColumnStatsMerger getColumnStatsMerger(ColumnStatisticsObj statsObjNew,
-      ColumnStatisticsObj statsObjOld) {
-    ColumnStatsMerger agg;
-    _Fields typeNew = statsObjNew.getStatsData().getSetField();
-    _Fields typeOld = statsObjOld.getStatsData().getSetField();
-    // make sure that they have the same type
-    typeNew = typeNew == typeOld ? typeNew : null;
+  /**
+   * Get a statistics merger to merge the given statistics object.
+   *
+   * @param statsObjNew A statistics object to merger
+   * @param statsObjOld A statistics object to merger
+   * @return A ColumnStatsMerger object that can process the requested type
+   * @throws IllegalArgumentException if the column statistics objects are of
+   *           two different types or if they are of an unknown type
+   * @throws NullPointerException if statistics object is {@code null}
+   */
+  public static ColumnStatsMerger getColumnStatsMerger(final ColumnStatisticsObj statsObjNew,
+      final ColumnStatisticsObj statsObjOld) {
+    Objects.requireNonNull(statsObjNew, "Column 1 statistcs cannot be null");
+    Objects.requireNonNull(statsObjOld, "Column 2 statistcs cannot be null");
+
+    final _Fields typeNew = statsObjNew.getStatsData().getSetField();
+    final _Fields typeOld = statsObjOld.getStatsData().getSetField();
+
+    Preconditions.checkArgument(typeNew == typeOld, "The column types must match: [" + typeNew + "::" + typeOld + "]");
+
     switch (typeNew) {
     case BOOLEAN_STATS:
-      agg = new BooleanColumnStatsMerger();
-      break;
-    case LONG_STATS: {
-      agg = new LongColumnStatsMerger();
-      break;
-    }
-    case DOUBLE_STATS: {
-      agg = new DoubleColumnStatsMerger();
-      break;
-    }
-    case STRING_STATS: {
-      agg = new StringColumnStatsMerger();
-      break;
-    }
+      return new BooleanColumnStatsMerger();
+    case LONG_STATS:
+      return new LongColumnStatsMerger();
+    case DOUBLE_STATS:
+      return new DoubleColumnStatsMerger();
+    case STRING_STATS:
+      return new StringColumnStatsMerger();
     case BINARY_STATS:
-      agg = new BinaryColumnStatsMerger();
-      break;
-    case DECIMAL_STATS: {
-      agg = new DecimalColumnStatsMerger();
-      break;
-    }
-    case DATE_STATS: {
-      agg = new DateColumnStatsMerger();
-      break;
-    }
-    case TIMESTAMP_STATS: {
-      agg = new TimestampColumnStatsMerger();
-      break;
-    }
+      return new BinaryColumnStatsMerger();
+    case DECIMAL_STATS:
+      return new DecimalColumnStatsMerger();
+    case DATE_STATS:
+      return new DateColumnStatsMerger();
+    case TIMESTAMP_STATS:
+      return new TimestampColumnStatsMerger();
     default:
-      throw new IllegalArgumentException("Unknown stats type " + statsObjNew.getStatsData().getSetField());
+      throw new IllegalArgumentException("Unknown stats type: " + statsObjNew.getStatsData().getSetField());
     }
-    return agg;
   }
 
-  public static ColumnStatisticsObj newColumnStaticsObj(String colName, String colType, _Fields type) {
-    ColumnStatisticsObj cso = new ColumnStatisticsObj();
-    ColumnStatisticsData csd = new ColumnStatisticsData();
-    cso.setColName(colName);
-    cso.setColType(colType);
+  public static ColumnStatisticsObj newColumnStaticsObj(final String colName, final String colType,
+      final _Fields type) {
+    final ColumnStatisticsObj cso = new ColumnStatisticsObj();
+    final ColumnStatisticsData csd = new ColumnStatisticsData();
+
+    Objects.requireNonNull(colName, "Column name cannot be null");
+    Objects.requireNonNull(colType, "Column type cannot be null");
+    Objects.requireNonNull(type, "Field type cannot be null");
+
     switch (type) {
     case BOOLEAN_STATS:
       csd.setBooleanStats(new BooleanColumnStatsData());
@@ -119,10 +125,13 @@ public class ColumnStatsMergerFactory {
       break;
 
     default:
-      throw new IllegalArgumentException("Unknown stats type");
+      throw new IllegalArgumentException("Unknown stats type: " + type);
     }
 
+    cso.setColName(colName);
+    cso.setColType(colType);
     cso.setStatsData(csd);
+
     return cso;
   }