You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pv...@apache.org on 2022/02/14 06:48:57 UTC
[hive] branch master updated: HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)
This is an automated email from the ASF dual-hosted git repository.
pvary 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 108f151 HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)
108f151 is described below
commit 108f1513dd353a019f9182dee0a0eba35b0d6f9f
Author: 白发川(惊帆) <pi...@gmail.com>
AuthorDate: Mon Feb 14 14:48:47 2022 +0800
HIVE-25912: Drop external table throw NPE if the location set to ROOT (Fachuan Bai reviewed by Peter Vary) (#3009)
Closes #3009
---
.../hive/metastore/utils/MetaStoreUtils.java | 8 ++++++++
.../apache/hadoop/hive/metastore/HMSHandler.java | 5 +++++
.../client/TestTablesCreateDropAlterTruncate.java | 21 +++++++++++++++++++++
.../metastore/utils/TestMetaStoreServerUtils.java | 22 ++++++++++++++++++++++
4 files changed, 56 insertions(+)
diff --git a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
index 93c1000..07be990 100644
--- a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
+++ b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java
@@ -186,6 +186,14 @@ public class MetaStoreUtils {
return colNames;
}
+ /*
+ * Check the table storage location must not be root path.
+ */
+ public static boolean validateTblStorage(StorageDescriptor sd) {
+ return !(StringUtils.isNotBlank(sd.getLocation())
+ && new Path(sd.getLocation()).getParent() == null);
+ }
+
/**
* validateName
*
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
index bd74b3e..2d57e58 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
@@ -2282,6 +2282,11 @@ public class HMSHandler extends FacebookBase implements IHMSHandler {
+ " is not a valid object name");
}
+ if (!MetaStoreUtils.validateTblStorage(tbl.getSd())) {
+ throw new InvalidObjectException(tbl.getTableName()
+ + " location must not be root path");
+ }
+
if (!tbl.isSetCatName()) {
tbl.setCatName(getDefaultCatalog(conf));
}
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
index a6ea8cd..b92790a 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestTablesCreateDropAlterTruncate.java
@@ -78,6 +78,7 @@ import java.util.Set;
import static org.apache.hadoop.hive.metastore.TestHiveMetaStore.createSourceTable;
import static org.apache.hadoop.hive.metastore.Warehouse.DEFAULT_CATALOG_NAME;
import static org.apache.hadoop.hive.metastore.Warehouse.DEFAULT_DATABASE_NAME;
+import static org.junit.Assert.assertThrows;
/**
* Test class for IMetaStoreClient API. Testing the Table related functions for metadata
@@ -357,6 +358,26 @@ public class TestTablesCreateDropAlterTruncate extends MetaStoreClientTest {
createdTable.getSd().getLocation());
}
+
+ @Test
+ public void testCreateTableRooPathLocationInSpecificDatabase() {
+ Table table = new Table();
+ StorageDescriptor sd = new StorageDescriptor();
+ List<FieldSchema> cols = new ArrayList<>();
+ sd.setLocation("hdfs://localhost:8020");
+ table.setDbName(DEFAULT_DATABASE);
+ table.setTableName("test_table_2_with_root_path");
+ cols.add(new FieldSchema("column_name", "int", null));
+ sd.setCols(cols);
+ sd.setSerdeInfo(new SerDeInfo());
+ table.setSd(sd);
+
+ Exception exception = assertThrows(InvalidObjectException.class, () -> client.createTable(table));
+ Assert.assertEquals("Storage descriptor location",
+ table.getTableName() + " location must not be root path",
+ exception.getMessage());
+ }
+
@Test
public void testCreateTableDefaultValuesView() throws Exception {
Table table = new Table();
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
index 0e74d39..c6597eb 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
@@ -862,5 +862,27 @@ public class TestMetaStoreServerUtils {
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal"));
}
+ @Test
+ public void throwFailExceptionWithHDFSStorageIsRootPath() {
+ StorageDescriptor sd = new StorageDescriptor();
+ sd.setLocation("hdfs://localhost:8020");
+ Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+ sd.setLocation("hdfs://localhost:8020/other_path");
+ Assert.assertTrue(MetaStoreUtils.validateTblStorage(sd));
+ }
+
+ @Test
+ public void throwFailExceptionWithS3StorageIsRootPath() {
+ StorageDescriptor sd = new StorageDescriptor();
+ sd.setLocation("s3a://bucket/");
+ Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+ sd.setLocation("s3a://bucket");
+ Assert.assertFalse(MetaStoreUtils.validateTblStorage(sd));
+
+ sd.setLocation("s3a://bucket/other_path");
+ Assert.assertTrue(MetaStoreUtils.validateTblStorage(sd));
+ }
}