HIVE-17189 : Fix backwards incompatibility in HiveMetaStoreClient (Vihang Karajgaonkar, reviewed by Alan Gates)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/b8bd4594 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/b8bd4594 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/b8bd4594 Branch: refs/heads/branch-2.3 Commit: b8bd4594bef718b1eeac9fceb437d7df7b480ed1 Parents: 0ff4d5b Author: Vihang Karajgaonkar <vih...@cloudera.com> Authored: Thu Jul 27 16:23:47 2017 -0700 Committer: Sahil Takiar <stak...@cloudera.com> Committed: Tue Nov 7 08:15:47 2017 -0800 ---------------------------------------------------------------------- .../hive/metastore/TestHiveMetaStore.java | 49 ++++++++++++++++++ .../hive/metastore/HiveMetaStoreClient.java | 23 +++++++++ .../hadoop/hive/metastore/IMetaStoreClient.java | 52 +++++++++++++++++++- .../ql/metadata/SessionHiveMetaStoreClient.java | 13 +++++ 4 files changed, 136 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/b8bd4594/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java ---------------------------------------------------------------------- diff --git a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java index 1b0b537..4b1df8e 100644 --- a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java +++ b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java @@ -608,6 +608,55 @@ public abstract class TestHiveMetaStore extends TestCase { assertEquals(" should have returned 50 partitions", maxParts, partitions.size()); } + public void testAlterTableCascade() throws Throwable { + // create a table with multiple partitions + String dbName = "compdb"; + String tblName = "comptbl"; + String typeName = "Person"; + + cleanUp(dbName, tblName, typeName); + + List<List<String>> values = new ArrayList<List<String>>(); + values.add(makeVals("2008-07-01 14:13:12", "14")); + values.add(makeVals("2008-07-01 14:13:12", "15")); + values.add(makeVals("2008-07-02 14:13:12", "15")); + values.add(makeVals("2008-07-03 14:13:12", "151")); + + createMultiPartitionTableSchema(dbName, tblName, typeName, values); + Table tbl = client.getTable(dbName, tblName); + List<FieldSchema> cols = tbl.getSd().getCols(); + cols.add(new FieldSchema("new_col", serdeConstants.STRING_TYPE_NAME, "")); + tbl.getSd().setCols(cols); + //add new column with cascade option + client.alter_table(dbName, tblName, tbl, true); + // + Table tbl2 = client.getTable(dbName, tblName); + Assert.assertEquals("Unexpected number of cols", 3, tbl2.getSd().getCols().size()); + Assert.assertEquals("Unexpected column name", "new_col", tbl2.getSd().getCols().get(2).getName()); + //get a partition + List<String> pvalues = new ArrayList<>(2); + pvalues.add("2008-07-01 14:13:12"); + pvalues.add("14"); + Partition partition = client.getPartition(dbName, tblName, pvalues); + Assert.assertEquals("Unexpected number of cols", 3, partition.getSd().getCols().size()); + Assert.assertEquals("Unexpected column name", "new_col", partition.getSd().getCols().get(2).getName()); + + //add another column + cols = tbl.getSd().getCols(); + cols.add(new FieldSchema("new_col2", serdeConstants.STRING_TYPE_NAME, "")); + tbl.getSd().setCols(cols); + //add new column with no cascade option + client.alter_table(dbName, tblName, tbl, false); + tbl2 = client.getTable(dbName, tblName); + Assert.assertEquals("Unexpected number of cols", 4, tbl2.getSd().getCols().size()); + Assert.assertEquals("Unexpected column name", "new_col2", tbl2.getSd().getCols().get(3).getName()); + //get partition, this partition should not have the newly added column since cascade option + //was false + partition = client.getPartition(dbName, tblName, pvalues); + Assert.assertEquals("Unexpected number of cols", 3, partition.getSd().getCols().size()); + } + + public void testListPartitionNames() throws Throwable { // create a table with multiple partitions String dbName = "compdb"; http://git-wip-us.apache.org/repos/asf/hive/blob/b8bd4594/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index c5db77f..b1a9782 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -50,6 +50,7 @@ import java.security.PrivilegedExceptionAction; import javax.security.auth.login.LoginException; import org.apache.hadoop.hive.common.ObjectPair; +import org.apache.hadoop.hive.common.StatsSetupConst; import org.apache.hadoop.hive.common.ValidTxnList; import org.apache.hadoop.hive.common.auth.HiveAuthUtils; import org.apache.hadoop.hive.common.classification.InterfaceAudience; @@ -359,6 +360,16 @@ public class HiveMetaStoreClient implements IMetaStoreClient { } @Override + public void alter_table(String defaultDatabaseName, String tblName, Table table, + boolean cascade) throws InvalidOperationException, MetaException, TException { + EnvironmentContext environmentContext = new EnvironmentContext(); + if (cascade) { + environmentContext.putToProperties(StatsSetupConst.CASCADE, StatsSetupConst.TRUE); + } + alter_table_with_environmentContext(defaultDatabaseName, tblName, table, environmentContext); + } + + @Override public void alter_table_with_environmentContext(String dbname, String tbl_name, Table new_tbl, EnvironmentContext envContext) throws InvalidOperationException, MetaException, TException { client.alter_table_with_environment_context(dbname, tbl_name, new_tbl, envContext); @@ -1493,12 +1504,24 @@ public class HiveMetaStoreClient implements IMetaStoreClient { } @Override + public void alter_partition(String dbName, String tblName, Partition newPart) + throws InvalidOperationException, MetaException, TException { + client.alter_partition_with_environment_context(dbName, tblName, newPart, null); + } + + @Override public void alter_partition(String dbName, String tblName, Partition newPart, EnvironmentContext environmentContext) throws InvalidOperationException, MetaException, TException { client.alter_partition_with_environment_context(dbName, tblName, newPart, environmentContext); } @Override + public void alter_partitions(String dbName, String tblName, List<Partition> newParts) + throws InvalidOperationException, MetaException, TException { + client.alter_partitions_with_environment_context(dbName, tblName, newParts, null); + } + + @Override public void alter_partitions(String dbName, String tblName, List<Partition> newParts, EnvironmentContext environmentContext) throws InvalidOperationException, MetaException, TException { client.alter_partitions_with_environment_context(dbName, tblName, newParts, environmentContext); http://git-wip-us.apache.org/repos/asf/hive/blob/b8bd4594/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java index e9df1e1..e7ead6b 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; import org.apache.hadoop.hive.common.ObjectPair; +import org.apache.hadoop.hive.common.StatsSetupConst; import org.apache.hadoop.hive.common.ValidTxnList; import org.apache.hadoop.hive.common.classification.InterfaceAudience; import org.apache.hadoop.hive.common.classification.InterfaceAudience.Public; @@ -707,6 +708,14 @@ public interface IMetaStoreClient { void alter_table(String defaultDatabaseName, String tblName, Table table) throws InvalidOperationException, MetaException, TException; + /** + * Use alter_table_with_environmentContext instead of alter_table with cascade option + * passed in EnvironmentContext using {@code StatsSetupConst.CASCADE} + */ + @Deprecated + void alter_table(String defaultDatabaseName, String tblName, Table table, + boolean cascade) throws InvalidOperationException, MetaException, TException; + //wrapper of alter_table_with_cascade void alter_table_with_environmentContext(String defaultDatabaseName, String tblName, Table table, EnvironmentContext environmentContext) throws InvalidOperationException, MetaException, @@ -780,6 +789,26 @@ public interface IMetaStoreClient { boolean dropPartition(String db_name, String tbl_name, String name, boolean deleteData) throws NoSuchObjectException, MetaException, TException; + + /** + * updates a partition to new partition + * + * @param dbName + * database of the old partition + * @param tblName + * table name of the old partition + * @param newPart + * new partition + * @throws InvalidOperationException + * if the old partition does not exist + * @throws MetaException + * if error in updating metadata + * @throws TException + * if error in communicating with metastore server + */ + void alter_partition(String dbName, String tblName, Partition newPart) + throws InvalidOperationException, MetaException, TException; + /** * updates a partition to new partition * @@ -815,7 +844,28 @@ public interface IMetaStoreClient { * @throws TException * if error in communicating with metastore server */ - void alter_partitions(String dbName, String tblName, List<Partition> newParts, EnvironmentContext environmentContext) + void alter_partitions(String dbName, String tblName, List<Partition> newParts) + throws InvalidOperationException, MetaException, TException; + + /** + * updates a list of partitions + * + * @param dbName + * database of the old partition + * @param tblName + * table name of the old partition + * @param newParts + * list of partitions + * @param environmentContext + * @throws InvalidOperationException + * if the old partition does not exist + * @throws MetaException + * if error in updating metadata + * @throws TException + * if error in communicating with metastore server + */ + void alter_partitions(String dbName, String tblName, List<Partition> newParts, + EnvironmentContext environmentContext) throws InvalidOperationException, MetaException, TException; /** http://git-wip-us.apache.org/repos/asf/hive/blob/b8bd4594/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java index 8eb011e..109bc3a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java @@ -280,6 +280,19 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I return super.getSchema(dbName, tableName); } + @Deprecated + @Override + public void alter_table(String dbname, String tbl_name, org.apache.hadoop.hive.metastore.api.Table new_tbl, + boolean cascade) throws InvalidOperationException, MetaException, TException { + org.apache.hadoop.hive.metastore.api.Table old_tbl = getTempTable(dbname, tbl_name); + if (old_tbl != null) { + //actually temp table does not support partitions, cascade is not applicable here + alterTempTable(dbname, tbl_name, old_tbl, new_tbl, null); + return; + } + super.alter_table(dbname, tbl_name, new_tbl, cascade); + } + @Override public void alter_table(String dbname, String tbl_name, org.apache.hadoop.hive.metastore.api.Table new_tbl) throws InvalidOperationException,