diff --git metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java index 86565a4198..64d9fc1a0f 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hive.metastore; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; @@ -777,7 +778,7 @@ private void updatePartColumnStats(RawStore msdb, String dbName, String tableNam } if (oldPartition.getSd() != null && newPart.getSd() != null) { List oldCols = oldPartition.getSd().getCols(); - if (!MetaStoreUtils.areSameColumns(oldCols, newPart.getSd().getCols())) { + if (!MetaStoreUtils.columnsIncluded(oldCols, newPart.getSd().getCols())) { updatePartColumnStatsForAlterColumns(msdb, oldPartition, oldPartName, partVals, oldCols, newPart); } } @@ -790,7 +791,8 @@ private void updatePartColumnStats(RawStore msdb, String dbName, String tableNam } } - private void alterTableUpdateTableColumnStats(RawStore msdb, + @VisibleForTesting + void alterTableUpdateTableColumnStats(RawStore msdb, Table oldTable, Table newTable) throws MetaException, InvalidObjectException { String dbName = oldTable.getDbName().toLowerCase(); @@ -808,7 +810,7 @@ private void alterTableUpdateTableColumnStats(RawStore msdb, // Nothing to update if everything is the same if (newDbName.equals(dbName) && newTableName.equals(tableName) && - MetaStoreUtils.areSameColumns(oldCols, newCols)) { + MetaStoreUtils.columnsIncluded(oldCols, newCols)) { updateColumnStats = false; } diff --git metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java index 05ee3ace1e..7f5795ac4d 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java @@ -655,6 +655,16 @@ static boolean areSameColumns(List oldCols, List newCo return true; } + static boolean columnsIncluded(List oldCols, List newCols) { + if (oldCols.size() > newCols.size()) { + return false; + } else if (oldCols.size() == newCols.size()){ + return areSameColumns(oldCols, newCols); + } else { + return areSameColumns(oldCols, newCols.subList(0, oldCols.size())); + } + } + /** * @return true if oldType and newType are compatible. * Two types are compatible if we have internal functions to cast one to another. diff --git metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java index a308970f6f..778615da3c 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -7218,7 +7218,6 @@ public boolean updatePartitionColumnStatistics(ColumnStatistics colStats, List