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: 白发川(惊帆) <piaobomengxi...@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)); + } }