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: 白发川(惊帆)
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 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/had