You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ku...@apache.org on 2019/07/09 09:15:39 UTC
[hive] branch master updated: HIVE-21874: Implement add partitions
related methods on temporary table (Laszlo Pinter via Marta Kuczora)
This is an automated email from the ASF dual-hosted git repository.
kuczoram 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 d1a99d1 HIVE-21874: Implement add partitions related methods on temporary table (Laszlo Pinter via Marta Kuczora)
d1a99d1 is described below
commit d1a99d19c5c41de44d9d86e1c8961b1327044ea5
Author: Laszlo Pinter <lp...@cloudera.com>
AuthorDate: Tue Jul 9 11:14:56 2019 +0200
HIVE-21874: Implement add partitions related methods on temporary table (Laszlo Pinter via Marta Kuczora)
---
.../ql/metadata/SessionHiveMetaStoreClient.java | 325 +++++++++++++++++++--
...astoreClientAddPartitionsFromSpecTempTable.java | 117 ++++++++
...nHiveMetastoreClientAddPartitionsTempTable.java | 228 +++++++++++++++
.../hive/metastore/client/TestAddPartitions.java | 48 ++-
.../client/TestAddPartitionsFromPartSpec.java | 31 +-
5 files changed, 699 insertions(+), 50 deletions(-)
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 957ebb1..d39a0b4 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
@@ -577,7 +577,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
ss.getTempTables().put(dbName, tables);
}
tables.put(tblName, tTable);
- createTempTable(tbl);
+ createPartitionedTempTable(tbl);
}
private org.apache.hadoop.hive.metastore.api.Table getTempTable(String dbName, String tableName)
@@ -774,7 +774,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
throw new MetaException(
"Could not find temp table entry for " + StatsUtils.getFullyQualifiedTableName(dbName, tableName));
}
- removeTempTable(table);
+ removePartitionedTempTable(table);
// Delete table data
if (deleteData && !MetaStoreUtils.isExternalTable(table)) {
@@ -927,8 +927,11 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
this.tTable = t;
pTree = t.getPartitionKeysSize() > 0 ? new PartitionTree(tTable) : null;
}
- private void addPartition(Partition p) throws AlreadyExistsException, MetaException {
- pTree.addPartition(p);
+
+ private Partition addPartition(Partition p) throws AlreadyExistsException, MetaException {
+ String partName = makePartName(tTable.getPartitionKeys(), p.getValues());
+ Partition partition = pTree.addPartition(p, partName, false);
+ return partition == null ? pTree.getPartition(partName) : partition;
}
private Partition getPartition(String partName) throws MetaException {
@@ -945,9 +948,9 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
return pTree.getPartition(partVals);
}
- private int addPartitions(List<Partition> partitions) throws AlreadyExistsException,
- MetaException {
- return pTree.addPartitions(partitions);
+ private List<Partition> addPartitions(List<Partition> partitions, boolean ifNotExists)
+ throws MetaException, AlreadyExistsException {
+ return pTree.addPartitions(partitions, ifNotExists);
}
private List<Partition> getPartitionsByNames(List<String> partNames) throws MetaException {
@@ -1041,11 +1044,14 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
private PartitionTree(org.apache.hadoop.hive.metastore.api.Table t) {
this.tTable = t;
}
- private void addPartition(Partition p) throws AlreadyExistsException, MetaException {
- String partName = Warehouse.makePartName(tTable.getPartitionKeys(), p.getValues());
- if(parts.putIfAbsent(partName, p) != null) {
+ private Partition addPartition(Partition partition, String partName, boolean ifNotExists)
+ throws AlreadyExistsException {
+ partition.setDbName(partition.getDbName().toLowerCase());
+ partition.setTableName(partition.getTableName().toLowerCase());
+ if(!ifNotExists && parts.containsKey(partName)) {
throw new AlreadyExistsException("Partition " + partName + " already exists");
}
+ return parts.putIfAbsent(partName, partition);
}
/**
* @param partName - "p=1/q=2" full partition name {@link Warehouse#makePartName(List, List)}
@@ -1068,16 +1074,35 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
return getPartition(partName);
}
- private int addPartitions(List<Partition> partitions)
- throws AlreadyExistsException, MetaException {
- int partitionsAdded = 0;
+ /**
+ * Add partitions to the partition tree.
+ *
+ * @param partitions The partitions to add
+ * @param ifNotExists only add partitions if they don't exist
+ * @return the partitions that were added
+ * @throws MetaException
+ */
+ private List<Partition> addPartitions(List<Partition> partitions, boolean ifNotExists)
+ throws MetaException, AlreadyExistsException {
+ List<Partition> partitionsAdded = new ArrayList<>();
+ Map<String, Partition> partNameToPartition = new HashMap<>();
+ // validate that the new partition values is not already added to the table
for (Partition partition : partitions) {
- addPartition(partition);
- partitionsAdded++;
+ String partName = makePartName(tTable.getPartitionKeys(), partition.getValues());
+ if (!ifNotExists && parts.containsKey(partName)) {
+ throw new AlreadyExistsException("Partition " + partName + " already exists");
+ }
+ partNameToPartition.put(partName, partition);
}
+
+ for (Entry<String, Partition> entry : partNameToPartition.entrySet()) {
+ if (addPartition(entry.getValue(), entry.getKey(), ifNotExists) == null) {
+ partitionsAdded.add(entry.getValue());
+ }
+ }
+
return partitionsAdded;
}
-
/**
* Provided values for the 1st N partition columns, will return all matching PartitionS
* The list is a partial list of partition values in the same order as partition columns.
@@ -1109,6 +1134,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
}
}
}
+
/**
* Hive.loadPartition() calls this.
* @param partition
@@ -1119,6 +1145,9 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
public org.apache.hadoop.hive.metastore.api.Partition add_partition(
org.apache.hadoop.hive.metastore.api.Partition partition) throws TException {
// First try temp table
+ if (partition == null) {
+ throw new MetaException("Partition cannot be null");
+ }
org.apache.hadoop.hive.metastore.api.Table table =
getTempTable(partition.getDbName(), partition.getTableName());
if (table == null) {
@@ -1126,8 +1155,11 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
return super.add_partition(partition);
}
TempTable tt = getPartitionedTempTable(table);
- tt.addPartition(deepCopy(partition));
- return partition;
+ checkPartitionProperties(partition);
+ Path partitionLocation = getPartitionLocation(table, partition);
+ Partition result = tt.addPartition(deepCopy(partition));
+ createAndSetLocationForAddedPartition(result, partitionLocation);
+ return result;
}
/**
@@ -1139,18 +1171,68 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
*/
@Override
public int add_partitions(List<Partition> partitions) throws TException {
+ if (partitions == null || partitions.contains(null)) {
+ throw new MetaException("Partitions cannot be null");
+ }
if (partitions.isEmpty()) {
return 0;
}
- Partition partition = partitions.get(0);
+
+ List<Partition> addedPartitions = add_partitions(partitions, false, true);
+ if (addedPartitions != null) {
+ return addedPartitions.size();
+ }
+
+ return super.add_partitions(partitions);
+ }
+
+ @Override
+ public int add_partitions_pspec(PartitionSpecProxy partitionSpec) throws TException {
+ if (partitionSpec == null) {
+ throw new MetaException("PartitionSpec cannot be null.");
+ }
+ if (partitionSpec.size() == 0) {
+ return 0;
+ }
+
org.apache.hadoop.hive.metastore.api.Table table =
- getTempTable(partition.getDbName(), partition.getTableName());
+ getTempTable(partitionSpec.getDbName(), partitionSpec.getTableName());
if (table == null) {
- // not a temp table - Try underlying client
- return super.add_partitions(partitions);
+ return super.add_partitions_pspec(partitionSpec);
}
- TempTable tt = getPartitionedTempTable(table);
- return tt.addPartitions(deepCopyPartitions(partitions));
+ assertTempTablePartitioned(table);
+ PartitionSpecProxy.PartitionIterator partitionIterator = partitionSpec.getPartitionIterator();
+ List<Partition> partitionsToAdd = new ArrayList<>(partitionSpec.size());
+ while (partitionIterator.hasNext()) {
+ partitionsToAdd.add(partitionIterator.next());
+ }
+
+ List<Partition> addedPartitions = addPartitionsToTempTable(partitionsToAdd, partitionSpec.getDbName(),
+ partitionSpec.getTableName(), false);
+ if (addedPartitions != null) {
+ return addedPartitions.size();
+ }
+
+ return super.add_partitions_pspec(partitionSpec);
+ }
+
+ @Override
+ public List<Partition> add_partitions(List<Partition> partitions, boolean ifNotExists, boolean needResults)
+ throws TException {
+ if (partitions == null || partitions.contains(null)) {
+ throw new MetaException("Partitions cannot be null");
+ }
+
+ if (partitions.isEmpty()) {
+ return needResults ? new ArrayList<>() : null;
+ }
+
+ List<Partition> addedPartitions = addPartitionsToTempTable(partitions, null, null, ifNotExists);
+ if (addedPartitions != null) {
+ return needResults ? addedPartitions : null;
+ }
+
+ return super.add_partitions(partitions, ifNotExists, needResults);
}
@@ -1375,7 +1457,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
LOG.warn("No current SessionState, skipping temp partitions for " + qualifiedTableName);
return null;
}
- assertPartitioned(t);
+ assertTempTablePartitioned(t);
TempTable tt = ss.getTempPartitions().get(qualifiedTableName);
if (tt == null) {
throw new IllegalStateException("TempTable not found for " +
@@ -1383,7 +1465,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
}
return tt;
}
- private void removeTempTable(org.apache.hadoop.hive.metastore.api.Table t) {
+ private void removePartitionedTempTable(org.apache.hadoop.hive.metastore.api.Table t) {
String qualifiedTableName = Warehouse.
getQualifiedName(t.getDbName().toLowerCase(), t.getTableName().toLowerCase());
SessionState ss = SessionState.get();
@@ -1393,7 +1475,8 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
}
ss.getTempPartitions().remove(Warehouse.getQualifiedName(t));
}
- private void createTempTable(org.apache.hadoop.hive.metastore.api.Table t) {
+
+ private void createPartitionedTempTable(org.apache.hadoop.hive.metastore.api.Table t) {
if(t.getPartitionKeysSize() <= 0) {
//do nothing as it's not a partitioned table
return;
@@ -1411,7 +1494,193 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I
}
}
- private void assertPartitioned(org.apache.hadoop.hive.metastore.api.Table table) throws MetaException {
+ /**
+ * Create the directory for partition and set it to the partition.
+ *
+ * @param partition instance of the partition, must be not null
+ * @param partitionLocation the location of the partition
+ * @throws MetaException if the target directory already exists
+ */
+ private void createAndSetLocationForAddedPartition(Partition partition, Path partitionLocation) throws MetaException {
+
+ if (partitionLocation != null) {
+ partition.getSd().setLocation(partitionLocation.toString());
+
+ // Check to see if the directory already exists before calling
+ // mkdirs() because if the file system is read-only, mkdirs will
+ // throw an exception even if the directory already exists.
+ if (!wh.isDir(partitionLocation)) {
+ if (!wh.mkdirs(partitionLocation)) {
+ throw new MetaException(partitionLocation
+ + " is not a directory or unable to create one");
+ }
+ }
+ }
+ }
+
+ /**
+ * Checking the validity of some partition properties (values, storage descriptor, columns, serdeinfo).
+ *
+ * @param partition an instance of the partition, must be not null
+ * @throws MetaException if some check is failing
+ */
+ private void checkPartitionProperties(Partition partition) throws MetaException {
+ if (partition.getDbName() == null) {
+ throw new MetaException("Database name cannot be null. " + partition);
+ }
+ if (partition.getTableName() == null) {
+ throw new MetaException("Table name cannot be null. " + partition);
+ }
+ if (partition.getValues() == null) {
+ throw new MetaException("Partition values cannot be null. " + partition);
+ }
+ if (partition.getSd() == null) {
+ throw new MetaException("Storage descriptor for partition cannot be null. " + partition);
+ }
+ if (partition.getSd().getCols() == null) {
+ // not sure this is correct, but it is possible to add a partition without column information.
+ return;
+ }
+
+ for (FieldSchema schema : partition.getSd().getCols()) {
+ if (schema.getType() == null) {
+ throw new MetaException("Storage descriptor column type for partition cannot be null. " + partition);
+ }
+ if (schema.getName() == null) {
+ throw new MetaException("Storage descriptor column name for partition cannot be null. " + partition);
+ }
+ }
+ if (partition.getSd().getSerdeInfo() == null) {
+ throw new MetaException("Storage descriptor serde info for partition cannot be null. " + partition);
+ }
+ }
+
+ /**
+ * Get the partition location. If the partition location is not set the location of the parent table will be used.
+ *
+ * @param table the parent table, must be not null
+ * @param partition instance of the partition, must be not null
+ * @return location of partition
+ * @throws MetaException if the partition location cannot be specified or the location is invalid.
+ */
+ private Path getPartitionLocation(org.apache.hadoop.hive.metastore.api.Table table, Partition partition)
+ throws MetaException {
+ Path partLocation = null;
+ String partLocationStr = null;
+ if (partition.getSd() != null) {
+ partLocationStr = partition.getSd().getLocation();
+ }
+ if (partLocationStr == null || partLocationStr.isEmpty()) {
+ // set default location if not specified and this is
+ // a physical table partition (not a view)
+ if (table.getSd().getLocation() != null) {
+ partLocation =
+ new Path(table.getSd().getLocation(), makePartName(table.getPartitionKeys(), partition.getValues()));
+ }
+ } else {
+ if (table.getSd().getLocation() == null) {
+ throw new MetaException("Cannot specify location for a view partition");
+ }
+ try {
+ partLocation = wh.getDnsPath(new Path(partLocationStr));
+ } catch (IllegalArgumentException e) {
+ throw new MetaException("Partition path is invalid. " + e.getLocalizedMessage());
+ }
+ }
+ return partLocation;
+ }
+
+ /**
+ * Try to add the partitions to an already existing temporary table.
+ *
+ * @param partitions The partitions to add. It must contain at least one item.
+ * @param dbName Name of the database, can be null
+ * @param tableName Name of the table, can be null
+ * @param ifNotExists only add partition if they don't exist
+ * @return the partitions that were added to the temp table. If the temp table is not found, null.
+ * @throws MetaException
+ */
+ private List<Partition> addPartitionsToTempTable(List<Partition> partitions, String dbName, String tableName,
+ boolean ifNotExists) throws MetaException, AlreadyExistsException {
+ if (!validatePartitions(partitions, dbName, tableName)) {
+ return null;
+ }
+ if (dbName == null) {
+ dbName = partitions.get(0).getDbName();
+ }
+ if (tableName == null) {
+ tableName = partitions.get(0).getTableName();
+ }
+ org.apache.hadoop.hive.metastore.api.Table table = getTempTable(dbName, tableName);
+ TempTable tt = getPartitionedTempTable(table);
+ List<Partition> result = tt.addPartitions(deepCopyPartitions(partitions), ifNotExists);
+ for (Partition p : result) {
+ createAndSetLocationForAddedPartition(p, getPartitionLocation(table, p));
+ }
+ return result;
+ }
+
+ /**
+ * Validate various partition and table properties (dbName, tableName, partitionValues, table key size).
+ * @param partitions the partition, must be not null
+ * @param dbName name of the database, must be not null
+ * @param tableName name of the table, must be not null
+ * @return true, if all the validation passed. false, if the associated temporary table cannot be found
+ * @throws MetaException some validations can throw it.
+ */
+ private boolean validatePartitions(List<Partition> partitions, String dbName, String tableName) throws MetaException {
+ Set<List<String>> partitionVals = new HashSet<>();
+ // do some basic validation
+ for (Partition p : partitions) {
+ if (p.getDbName() == null) {
+ throw new MetaException("Database for partition cannot be null. " + p.toString());
+ }
+ if (p.getTableName() == null) {
+ throw new MetaException("Table for partition cannot be null. " + p.toString());
+ }
+
+ // check that all new partitions are belonging to tables located in the same database
+ if (dbName != null && !dbName.equals(p.getDbName())) {
+ throw new MetaException("Partition tables doesn't belong to the same database "
+ + Arrays.toString(partitions.toArray()));
+ } else {
+ dbName = p.getDbName();
+ }
+ // check if all new partitions are part of the same table
+ if (tableName != null && !tableName.equals(p.getTableName())) {
+ throw new MetaException("New partitions doesn't belong to the same table "
+ + Arrays.toString(partitions.toArray()));
+ } else {
+ tableName = p.getTableName();
+ }
+
+ // validate that new partitions belonging to the same table doesn't contain duplicate partition values
+ if (!partitionVals.contains(p.getValues())) {
+ partitionVals.add(p.getValues());
+ } else {
+ throw new MetaException("Partition values contains duplicate entries. "
+ + Arrays.toString(partitions.toArray()));
+ }
+
+ // check if all the tables are tmp tables
+ org.apache.hadoop.hive.metastore.api.Table table = getTempTable(p.getDbName(), p.getTableName());
+ if (table == null) {
+ return false;
+ }
+
+ checkPartitionProperties(p);
+ // validate partition location
+ getPartitionLocation(table, p);
+ }
+ return true;
+ }
+
+ /**
+ * Check partition properties of temporary table.
+ * @param table table instance, must be not null.
+ * @throws MetaException if check fails.
+ */
+ private void assertTempTablePartitioned(org.apache.hadoop.hive.metastore.api.Table table) throws MetaException {
if(table.getPartitionKeysSize() <= 0) {
throw new MetaException(getCatalogQualifiedTableName(table) + " is not partitioned");
}
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsFromSpecTempTable.java b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsFromSpecTempTable.java
new file mode 100644
index 0000000..6f996a3
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsFromSpecTempTable.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.metadata;
+
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.metastore.annotation.MetastoreCheckinTest;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
+import org.apache.hadoop.hive.metastore.api.Table;
+import org.apache.hadoop.hive.metastore.client.CustomIgnoreRule;
+import org.apache.hadoop.hive.metastore.client.TestAddPartitionsFromPartSpec;
+import org.apache.hadoop.hive.metastore.client.builder.DatabaseBuilder;
+import org.apache.hadoop.hive.metastore.client.builder.TableBuilder;
+import org.apache.hadoop.hive.metastore.minihms.AbstractMetaStoreService;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.List;
+
+/**
+ * Test class for adding partitions from partition spec related methods on temporary tables.
+ */
+@RunWith(Parameterized.class)
+@Category(MetastoreCheckinTest.class)
+public class TestSessionHiveMetastoreClientAddPartitionsFromSpecTempTable
+ extends TestAddPartitionsFromPartSpec {
+
+ private HiveConf conf;
+
+ public TestSessionHiveMetastoreClientAddPartitionsFromSpecTempTable(String name, AbstractMetaStoreService metaStore) {
+ super(name, metaStore);
+ ignoreRule = new CustomIgnoreRule();
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ initHiveConf();
+ SessionState.start(conf);
+ setClient(Hive.get(conf).getMSC());
+ getClient().dropDatabase(DB_NAME, true, true, true);
+ getMetaStore().cleanWarehouseDirs();
+ new DatabaseBuilder().
+ setName(DB_NAME).
+ create(getClient(), conf);
+ }
+
+ private void initHiveConf() throws HiveException {
+ conf = Hive.get().getConf();
+ conf.setBoolVar(HiveConf.ConfVars.METASTORE_FASTPATH, true);
+ }
+
+ @Override
+ protected Table createTable(String dbName, String tableName, List<FieldSchema> partCols, String location)
+ throws Exception {
+ new TableBuilder().setDbName(dbName).setTableName(tableName).addCol("test_id", "int", "test col id")
+ .addCol("test_value", "string", "test col value")
+ .addTableParam("partTestTableParamKey", "partTestTableParamValue").setPartCols(partCols)
+ .addStorageDescriptorParam("partTestSDParamKey", "partTestSDParamValue").setSerdeName(tableName)
+ .setStoredAsSubDirectories(false).addSerdeParam("partTestSerdeParamKey", "partTestSerdeParamValue")
+ .setLocation(location).setTemporary(true).create(getClient(), conf);
+ return getClient().getTable(dbName, tableName);
+ }
+
+ @Override
+ protected void verifyPartition(Table table, String name, List<String> values, int index) throws Exception {
+
+ Partition part = getClient().getPartition(table.getDbName(), table.getTableName(), name);
+ Assert.assertNotNull("The partition should not be null.", part);
+ Assert.assertEquals("The table name in the partition is not correct.", table.getTableName(), part.getTableName());
+ List<String> partValues = part.getValues();
+ Assert.assertEquals(values.size(), partValues.size());
+ Assert.assertTrue("The partition has wrong values.", partValues.containsAll(values));
+ Assert.assertEquals("The DB name in the partition is not correct.", table.getDbName(), part.getDbName());
+ Assert.assertEquals("The last access time is not correct.", DEFAULT_CREATE_TIME, part.getLastAccessTime());
+ Assert.assertEquals("The partition's parameter map should contain the partparamkey - partparamvalue pair.",
+ DEFAULT_PARAM_VALUE + index, part.getParameters().get(DEFAULT_PARAM_KEY + index));
+ StorageDescriptor sd = part.getSd();
+ Assert.assertNotNull("The partition's storage descriptor must not be null.", sd);
+ Assert.assertEquals("The input format is not correct.", "TestInputFormat" + index, sd.getInputFormat());
+ Assert.assertEquals("The output format is not correct.", "TestOutputFormat" + index, sd.getOutputFormat());
+ Assert.assertEquals("The serdeInfo name is not correct.", "partserde" + index, sd.getSerdeInfo().getName());
+ Assert.assertEquals(
+ "The parameter map of the partition's storage descriptor should contain the partsdkey - partsdvalue pair.",
+ "partsdvalue" + index, sd.getParameters().get("partsdkey" + index));
+ Assert.assertEquals("The parameter's location is not correct.",
+ getMetaStore().getWarehouseRoot() + "/" + TABLE_NAME + "/" + name, sd.getLocation());
+ Assert.assertTrue("The parameter's location should exist on the file system.",
+ getMetaStore().isPathExists(new Path(sd.getLocation())));
+ // If the 'metastore.partition.inherit.table.properties' property is set in the metastore
+ // config, the partition inherits the listed table parameters.
+ // This property is not set in this test, therefore the partition doesn't inherit the table
+ // parameters.
+ Assert.assertFalse("The partition should not inherit the table parameters.",
+ part.getParameters().keySet().contains(table.getParameters().keySet()));
+ }
+}
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsTempTable.java b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsTempTable.java
new file mode 100644
index 0000000..eb96a99
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestSessionHiveMetastoreClientAddPartitionsTempTable.java
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.metadata;
+
+import com.google.common.collect.Lists;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.metastore.annotation.MetastoreCheckinTest;
+import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.Table;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.metastore.api.SerDeInfo;
+import org.apache.hadoop.hive.metastore.api.SkewedInfo;
+import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
+import org.apache.hadoop.hive.metastore.client.CustomIgnoreRule;
+import org.apache.hadoop.hive.metastore.client.TestAddPartitions;
+import org.apache.hadoop.hive.metastore.client.builder.DatabaseBuilder;
+import org.apache.hadoop.hive.metastore.client.builder.TableBuilder;
+import org.apache.hadoop.hive.metastore.minihms.AbstractMetaStoreService;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test class for adding partitions related methods on temporary tables.
+ */
+@RunWith(Parameterized.class)
+@Category(MetastoreCheckinTest.class)
+public class TestSessionHiveMetastoreClientAddPartitionsTempTable
+ extends TestAddPartitions {
+
+ private HiveConf conf;
+
+ public TestSessionHiveMetastoreClientAddPartitionsTempTable(String name, AbstractMetaStoreService metaStore) {
+ super(name, metaStore);
+ ignoreRule = new CustomIgnoreRule();
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ initHiveConf();
+ SessionState.start(conf);
+ setClient(Hive.get(conf).getMSC());
+ getClient().dropDatabase(DB_NAME, true, true, true);
+ getMetaStore().cleanWarehouseDirs();
+ new DatabaseBuilder().
+ setName(DB_NAME).
+ create(getClient(), conf);
+ }
+
+ private void initHiveConf() throws HiveException {
+ conf = Hive.get().getConf();
+ conf.setBoolVar(HiveConf.ConfVars.METASTORE_FASTPATH, true);
+ }
+
+ @Override
+ protected Table createTable(String dbName, String tableName, List<FieldSchema> partCols, String location)
+ throws Exception {
+ new TableBuilder().setDbName(dbName).setTableName(tableName).addCol("test_id", "int", "test col id")
+ .addCol("test_value", "string", "test col value")
+ .addTableParam("partTestTableParamKey", "partTestTableParamValue").setPartCols(partCols)
+ .addStorageDescriptorParam("partTestSDParamKey", "partTestSDParamValue").setSerdeName(tableName)
+ .setStoredAsSubDirectories(false).addSerdeParam("partTestSerdeParamKey", "partTestSerdeParamValue")
+ .setLocation(location).setTemporary(true).create(getClient(), conf);
+ return getClient().getTable(dbName, tableName);
+ }
+
+ protected void createExternalTable(String tableName, String location) throws Exception {
+ new TableBuilder().setDbName(DB_NAME).setTableName(tableName).addCol("test_id", "int", "test col id")
+ .addCol("test_value", DEFAULT_COL_TYPE, "test col value").addPartCol(YEAR_COL_NAME, DEFAULT_COL_TYPE)
+ .addTableParam("EXTERNAL", "TRUE").setLocation(location).setTemporary(true).create(getClient(), conf);
+ }
+
+ @Override
+ protected void verifyPartition(Table table, String name, List<String> values, int index) throws Exception {
+
+ Partition part = getClient().getPartition(table.getDbName(), table.getTableName(), name);
+ Assert.assertNotNull("The partition should not be null.", part);
+ assertEquals("The table name in the partition is not correct.", table.getTableName(), part.getTableName());
+ List<String> partValues = part.getValues();
+ assertEquals(values.size(), partValues.size());
+ Assert.assertTrue("The partition has wrong values.", partValues.containsAll(values));
+ assertEquals("The DB name in the partition is not correct.", table.getDbName(), part.getDbName());
+ assertEquals("The last access time is not correct.", 123456, part.getLastAccessTime());
+ assertEquals("The partition's parameter map should contain the partparamkey - partparamvalue pair.",
+ DEFAULT_PARAM_VALUE + index, part.getParameters().get(DEFAULT_PARAM_KEY + index));
+ StorageDescriptor sd = part.getSd();
+ Assert.assertNotNull("The partition's storage descriptor must not be null.", sd);
+ assertEquals("The input format is not correct.", "TestInputFormat" + index, sd.getInputFormat());
+ assertEquals("The output format is not correct.", "TestOutputFormat" + index, sd.getOutputFormat());
+ assertEquals("The serdeInfo name is not correct.", "partserde" + index, sd.getSerdeInfo().getName());
+ assertEquals(
+ "The parameter map of the partition's storage descriptor should contain the partsdkey - partsdvalue pair.",
+ "partsdvalue" + index, sd.getParameters().get("partsdkey" + index));
+ assertEquals("The parameter's location is not correct.",
+ getMetaStore().getWarehouseRoot() + "/" + TABLE_NAME + "/" + name, sd.getLocation());
+ Assert.assertTrue("The parameter's location should exist on the file system.",
+ getMetaStore().isPathExists(new Path(sd.getLocation())));
+ Assert.assertFalse("The partition should not inherit the table parameters.",
+ part.getParameters().keySet().contains(table.getParameters().keySet()));
+ }
+
+ @Override
+ protected void verifyPartitionAttributesDefaultValues(Partition partition, String tableLocation) {
+ Assert.assertNotEquals("The partition's last access time should be set.", 0, partition.getLastAccessTime());
+ Assert.assertNotEquals("The partition's create time should be set.", 0, partition.getCreateTime());
+ StorageDescriptor sd = partition.getSd();
+ Assert.assertNotNull("The storage descriptor of the partition must not be null.", sd);
+ assertEquals("The partition location is not correct.", tableLocation + "/year=2017", sd.getLocation());
+ assertEquals("The input format doesn't have the default value.", "org.apache.hadoop.hive.ql.io.HiveInputFormat",
+ sd.getInputFormat());
+ assertEquals("The output format doesn't have the default value.", "org.apache.hadoop.hive.ql.io.HiveOutputFormat",
+ sd.getOutputFormat());
+ Assert.assertFalse("The compressed attribute doesn't have the default value.", sd.isCompressed());
+ Assert.assertFalse("The storedAsSubDirectories attribute doesn't have the default value.",
+ sd.isStoredAsSubDirectories());
+ assertEquals("The numBuckets attribute doesn't have the default value.", 0, sd.getNumBuckets());
+ Assert.assertTrue("The default value of the attribute 'bucketCols' should be an empty list.",
+ sd.getBucketCols().isEmpty());
+ Assert.assertTrue("The default value of the attribute 'sortCols' should be an empty list.",
+ sd.getSortCols().isEmpty());
+ Assert.assertTrue("Per default the storage descriptor parameters should be empty.", sd.getParameters().isEmpty());
+ SerDeInfo serdeInfo = sd.getSerdeInfo();
+ Assert.assertNotNull("The serdeInfo attribute should not be null.", serdeInfo);
+ Assert.assertNull("The default value of the serde's name attribute should be null.", serdeInfo.getName());
+ assertEquals("The serde's 'serializationLib' attribute doesn't have the default value.",
+ "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", serdeInfo.getSerializationLib());
+ Assert.assertTrue("Per default the serde info parameters should be empty.", serdeInfo.getParameters().isEmpty());
+ SkewedInfo skewedInfo = sd.getSkewedInfo();
+ Assert.assertTrue("Per default the skewedInfo column names list should be empty.",
+ skewedInfo.getSkewedColNames().isEmpty());
+ Assert.assertTrue("Per default the skewedInfo column value list should be empty.",
+ skewedInfo.getSkewedColValues().isEmpty());
+ Assert.assertTrue("Per default the skewedInfo column value location map should be empty.",
+ skewedInfo.getSkewedColValueLocationMaps().isEmpty());
+ }
+
+ @Test
+ @Override
+ public void testAddPartitionNullLocationInTableToo() throws Exception {
+ createTable(DB_NAME, TABLE_NAME, null);
+ Partition partition = buildPartition(DB_NAME, TABLE_NAME, DEFAULT_YEAR_VALUE, null);
+ getClient().add_partition(partition);
+ Partition part = getClient().getPartition(DB_NAME, TABLE_NAME, "year=2017");
+ Assert.assertTrue(getMetaStore().isPathExists(new Path(part.getSd().getLocation())));
+ assertEquals(SessionState.get().getTempTables().get(DB_NAME).get(TABLE_NAME).getSd().getLocation() + "/year=2017",
+ part.getSd().getLocation());
+ }
+
+ @Test
+ @Override
+ public void testAddPartitionForExternalTableNullLocation() throws Exception {
+ String tableName = "part_add_ext_table";
+ createExternalTable(tableName, null);
+ Partition partition = buildPartition(DB_NAME, tableName, DEFAULT_YEAR_VALUE, null);
+ getClient().add_partition(partition);
+ Partition resultPart = getClient().getPartition(DB_NAME, tableName, Lists.newArrayList(DEFAULT_YEAR_VALUE));
+ Assert.assertNotNull(resultPart);
+ Assert.assertNotNull(resultPart.getSd());
+ assertEquals(SessionState.get().getTempTables().get(DB_NAME).get(tableName).getSd().getLocation() + "/year=2017",
+ resultPart.getSd().getLocation());
+ }
+
+ @Test
+ @Override
+ public void testAddPartitionsNullLocationInTableToo() throws Exception {
+ createTable(DB_NAME, TABLE_NAME, null);
+ List<Partition> partitions = new ArrayList<>();
+ Partition partition = buildPartition(DB_NAME, TABLE_NAME, DEFAULT_YEAR_VALUE, null);
+ partitions.add(partition);
+ getClient().add_partitions(partitions);
+
+ Partition part = getClient().getPartition(DB_NAME, TABLE_NAME, "year=2017");
+ assertEquals(SessionState.get().getTempTables().get(DB_NAME).get(TABLE_NAME).getSd().getLocation() + "/year=2017",
+ part.getSd().getLocation());
+ Assert.assertTrue(getMetaStore().isPathExists(new Path(part.getSd().getLocation())));
+ }
+
+ @Test
+ @Override
+ public void testAddPartitionsForExternalTableNullLocation() throws Exception {
+ String tableName = "part_add_ext_table";
+ createExternalTable(tableName, null);
+ Partition partition1 = buildPartition(DB_NAME, tableName, "2017", null);
+ Partition partition2 = buildPartition(DB_NAME, tableName, "2018", null);
+ List<Partition> partitions = Lists.newArrayList(partition1, partition2);
+ getClient().add_partitions(partitions);
+
+ List<Partition> resultParts =
+ getClient().getPartitionsByNames(DB_NAME, tableName, Lists.newArrayList("year=2017", "year=2018"));
+ Assert.assertNotNull(resultParts);
+ Assert.assertEquals(2, resultParts.size());
+ String defaultTableLocation = SessionState.get().getTempTables().get(DB_NAME).get(tableName).getSd().getLocation();
+ String defaultPartLocation1 = defaultTableLocation + "/year=2017";
+ String defaultPartLocation2 = defaultTableLocation + "/year=2018";
+ if (resultParts.get(0).getValues().get(0).equals("2017")) {
+ Assert.assertEquals(defaultPartLocation1, resultParts.get(0).getSd().getLocation());
+ Assert.assertEquals(defaultPartLocation2, resultParts.get(1).getSd().getLocation());
+ } else {
+ Assert.assertEquals(defaultPartLocation2, resultParts.get(0).getSd().getLocation());
+ Assert.assertEquals(defaultPartLocation1, resultParts.get(1).getSd().getLocation());
+ }
+ }
+}
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitions.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitions.java
index a15f5ea..3d66c3f 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitions.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitions.java
@@ -65,13 +65,13 @@ public class TestAddPartitions extends MetaStoreClientTest {
private AbstractMetaStoreService metaStore;
private IMetaStoreClient client;
- private static final String DB_NAME = "test_partition_db";
- private static final String TABLE_NAME = "test_partition_table";
- private static final String DEFAULT_PARAM_VALUE = "partparamvalue";
- private static final String DEFAULT_PARAM_KEY = "partparamkey";
- private static final String DEFAULT_YEAR_VALUE = "2017";
- private static final String DEFAULT_COL_TYPE = "string";
- private static final String YEAR_COL_NAME = "year";
+ protected static final String DB_NAME = "test_partition_db";
+ protected static final String TABLE_NAME = "test_partition_table";
+ protected static final String DEFAULT_PARAM_VALUE = "partparamvalue";
+ protected static final String DEFAULT_PARAM_KEY = "partparamkey";
+ protected static final String DEFAULT_YEAR_VALUE = "2017";
+ protected static final String DEFAULT_COL_TYPE = "string";
+ protected static final String YEAR_COL_NAME = "year";
private static final String MONTH_COL_NAME = "month";
private static final short MAX = -1;
@@ -105,6 +105,18 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
}
+ protected AbstractMetaStoreService getMetaStore() {
+ return metaStore;
+ }
+
+ protected IMetaStoreClient getClient() {
+ return client;
+ }
+
+ protected void setClient(IMetaStoreClient client) {
+ this.client = client;
+ }
+
// Tests for the Partition add_partition(Partition partition) method
@Test
@@ -130,6 +142,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void addPartitionOtherCatalog() throws TException {
String catName = "add_partition_catalog";
Catalog cat = new CatalogBuilder()
@@ -177,6 +190,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test(expected = InvalidObjectException.class)
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void noSuchCatalog() throws TException {
String tableName = "table_for_no_such_catalog";
Table table = new TableBuilder()
@@ -462,6 +476,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test(expected = MetaException.class)
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionForView() throws Exception {
String tableName = "test_add_partition_view";
@@ -471,6 +486,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionsForViewNullPartLocation() throws Exception {
String tableName = "test_add_partition_view";
@@ -484,6 +500,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionsForViewNullPartSd() throws Exception {
String tableName = "test_add_partition_view";
@@ -770,6 +787,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
Assert.fail("MetaException should have been thrown.");
} catch (MetaException e) {
// Expected exception
+ System.out.println(e);
}
List<String> partitionNames = client.listPartitionNames(DB_NAME, tableName, MAX);
@@ -810,7 +828,6 @@ public class TestAddPartitions extends MetaStoreClientTest {
@Test
public void testAddPartitionsDifferentDBs() throws Exception {
-
createDB("parttestdb2");
createTable();
createTable("parttestdb2", TABLE_NAME, null);
@@ -1148,6 +1165,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
}
@Test(expected=MetaException.class)
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionsForView() throws Exception {
String tableName = "test_add_partition_view";
@@ -1513,11 +1531,11 @@ public class TestAddPartitions extends MetaStoreClientTest {
return createTable(DB_NAME, TABLE_NAME, metaStore.getWarehouseRoot() + "/" + TABLE_NAME);
}
- private Table createTable(String dbName, String tableName, String location) throws Exception {
+ protected Table createTable(String dbName, String tableName, String location) throws Exception {
return createTable(dbName, tableName, getYearPartCol(), location);
}
- private Table createTable(String dbName, String tableName, List<FieldSchema> partCols,
+ protected Table createTable(String dbName, String tableName, List<FieldSchema> partCols,
String location) throws Exception {
new TableBuilder()
.setDbName(dbName)
@@ -1535,7 +1553,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
return client.getTable(dbName, tableName);
}
- private void createExternalTable(String tableName, String location) throws Exception {
+ protected void createExternalTable(String tableName, String location) throws Exception {
new TableBuilder()
.setDbName(DB_NAME)
.setTableName(tableName)
@@ -1547,13 +1565,13 @@ public class TestAddPartitions extends MetaStoreClientTest {
.create(client, metaStore.getConf());
}
- private Partition buildPartition(String dbName, String tableName, String value)
+ protected Partition buildPartition(String dbName, String tableName, String value)
throws MetaException {
return buildPartition(dbName, tableName, value,
metaStore.getWarehouseRoot() + "/" + tableName + "/addparttest");
}
- private Partition buildPartition(String dbName, String tableName, String value,
+ protected Partition buildPartition(String dbName, String tableName, String value,
String location) throws MetaException {
Partition partition = new PartitionBuilder()
.setDbName(dbName)
@@ -1607,7 +1625,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
return cols;
}
- private void verifyPartition(Table table, String name, List<String> values, int index)
+ protected void verifyPartition(Table table, String name, List<String> values, int index)
throws Exception {
Partition part = client.getPartition(table.getDbName(), table.getTableName(), name);
@@ -1647,7 +1665,7 @@ public class TestAddPartitions extends MetaStoreClientTest {
part.getParameters().keySet().contains(table.getParameters().keySet()));
}
- private void verifyPartitionAttributesDefaultValues(Partition partition, String tableLocation) {
+ protected void verifyPartitionAttributesDefaultValues(Partition partition, String tableLocation) {
Assert.assertNotEquals("The partition's last access time should be set.", 0,
partition.getLastAccessTime());
Assert.assertNotEquals("The partition's create time should be set.", 0,
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitionsFromPartSpec.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitionsFromPartSpec.java
index 2564349..e0662bf 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitionsFromPartSpec.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddPartitionsFromPartSpec.java
@@ -63,15 +63,15 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
private AbstractMetaStoreService metaStore;
private IMetaStoreClient client;
- private static final String DB_NAME = "test_partition_db";
- private static final String TABLE_NAME = "test_partition_table";
- private static final String DEFAULT_PARAM_VALUE = "partparamvalue";
- private static final String DEFAULT_PARAM_KEY = "partparamkey";
+ protected static final String DB_NAME = "test_partition_db";
+ protected static final String TABLE_NAME = "test_partition_table";
+ protected static final String DEFAULT_PARAM_VALUE = "partparamvalue";
+ protected static final String DEFAULT_PARAM_KEY = "partparamkey";
private static final String DEFAULT_YEAR_VALUE = "2017";
private static final String DEFAULT_COL_TYPE = "string";
private static final String YEAR_COL_NAME = "year";
private static final String MONTH_COL_NAME = "month";
- private static final int DEFAULT_CREATE_TIME = 123456;
+ protected static final int DEFAULT_CREATE_TIME = 123456;
private static final short MAX = -1;
public TestAddPartitionsFromPartSpec(String name, AbstractMetaStoreService metaStore) {
@@ -106,6 +106,18 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
}
+ protected AbstractMetaStoreService getMetaStore() {
+ return metaStore;
+ }
+
+ protected IMetaStoreClient getClient() {
+ return client;
+ }
+
+ protected void setClient(IMetaStoreClient client) {
+ this.client = client;
+ }
+
// Tests for int add_partitions_pspec(PartitionSpecProxy partitionSpec) method
@Test
@@ -238,6 +250,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionSpecUpperCaseDBAndTableNameInOnePart() throws Exception {
String tableName = "test_add_part_table";
@@ -702,6 +715,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
@Test(expected = MetaException.class)
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionSpecWithSharedSDInvalidSD() throws Exception {
Table table = createTable();
@@ -763,6 +777,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
@Test(expected=MetaException.class)
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionSpecForView() throws Exception {
String tableName = "test_add_partition_view";
@@ -774,6 +789,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionSpecForViewNullPartLocation() throws Exception {
String tableName = "test_add_partition_view";
@@ -788,6 +804,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
}
@Test
+ @ConditionalIgnoreOnSessionHiveMetastoreClient
public void testAddPartitionsForViewNullPartSd() throws Exception {
String tableName = "test_add_partition_view";
@@ -1005,7 +1022,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
metaStore.getWarehouseRoot() + "/" + TABLE_NAME);
}
- private Table createTable(String dbName, String tableName, List<FieldSchema> partCols,
+ protected Table createTable(String dbName, String tableName, List<FieldSchema> partCols,
String location) throws Exception {
new TableBuilder()
.setDbName(dbName)
@@ -1077,7 +1094,7 @@ public class TestAddPartitionsFromPartSpec extends MetaStoreClientTest {
return cols;
}
- private void verifyPartition(Table table, String name, List<String> values, int index)
+ protected void verifyPartition(Table table, String name, List<String> values, int index)
throws Exception {
Partition part = client.getPartition(table.getDbName(), table.getTableName(), name);