This is an automated email from the ASF dual-hosted git repository. kgyrtkirk 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 9a51d84 HIVE-25630: Transformer fixes (#2738) (Zoltan Haindrich reviewed by Krisztian Kasa) 9a51d84 is described below commit 9a51d84ad3dfb4628078ecd57c8cedbfbc2e4efe Author: Zoltan Haindrich <k...@rxd.hu> AuthorDate: Wed Oct 27 16:22:24 2021 +0200 HIVE-25630: Transformer fixes (#2738) (Zoltan Haindrich reviewed by Krisztian Kasa) --- .../translated_external_createexisting.q | 13 ++ .../clientpositive/translated_external_alter.q | 8 ++ .../clientpositive/translated_external_rename3.q | 26 ++++ .../translated_external_createexisting.q.out | 50 +++++++ .../llap/translated_external_alter.q.out | 16 +++ .../llap/translated_external_rename3.q.out | 154 +++++++++++++++++++++ .../hadoop/hive/metastore/conf/MetastoreConf.java | 7 +- .../hive/metastore/utils/MetaStoreUtils.java | 2 +- .../hadoop/hive/metastore/ExceptionHandler.java | 2 +- .../apache/hadoop/hive/metastore/HMSHandler.java | 5 + .../metastore/MetastoreDefaultTransformer.java | 12 +- .../hive/metastore/TestMetastoreTransformer.java | 141 +++++++++++++++++++ .../client/TestTablesCreateDropAlterTruncate.java | 1 + 13 files changed, 430 insertions(+), 7 deletions(-) diff --git a/ql/src/test/queries/clientnegative/translated_external_createexisting.q b/ql/src/test/queries/clientnegative/translated_external_createexisting.q new file mode 100644 index 0000000..c2dab16 --- /dev/null +++ b/ql/src/test/queries/clientnegative/translated_external_createexisting.q @@ -0,0 +1,13 @@ +set metastore.metadata.transformer.class=org.apache.hadoop.hive.metastore.MetastoreDefaultTransformer; +set metastore.metadata.transformer.location.mode=prohibit; + +set hive.fetch.task.conversion=none; +set hive.compute.query.using.stats=false; + +create table t (a integer); + +-- table should be translated +desc formatted t; + +create table t (a integer); + diff --git a/ql/src/test/queries/clientpositive/translated_external_alter.q b/ql/src/test/queries/clientpositive/translated_external_alter.q new file mode 100644 index 0000000..7010782 --- /dev/null +++ b/ql/src/test/queries/clientpositive/translated_external_alter.q @@ -0,0 +1,8 @@ +set metastore.metadata.transformer.class=org.apache.hadoop.hive.metastore.MetastoreDefaultTransformer; +set metastore.metadata.transformer.location.mode=seqsuffix; + +set hive.fetch.task.conversion=none; +set hive.compute.query.using.stats=false; + +create table caseSensitive (a integer); +alter table casesEnsitivE set tblproperties('some'='one'); diff --git a/ql/src/test/queries/clientpositive/translated_external_rename3.q b/ql/src/test/queries/clientpositive/translated_external_rename3.q new file mode 100644 index 0000000..7ccce0d --- /dev/null +++ b/ql/src/test/queries/clientpositive/translated_external_rename3.q @@ -0,0 +1,26 @@ +set metastore.metadata.transformer.class=org.apache.hadoop.hive.metastore.MetastoreDefaultTransformer; +set metastore.metadata.transformer.location.mode=force; + +set hive.fetch.task.conversion=none; +set hive.compute.query.using.stats=false; + +create external table t (a integer); +insert into t values(1); +alter table t rename to t2; + +-- this TRANSLATED table will have its location shared with the pre-existing t2 table +create table t (a integer); +insert into t values(2); + +-- the rows from bot T and T2 can be seen from both tables +select assert_true(count(1) = 2) from t; +select assert_true(count(1) = 2) from t2; + +select * from t; +select * from t2; + +-- the location of both T and T2 is the same +desc formatted t; +desc formatted t2; + + diff --git a/ql/src/test/results/clientnegative/translated_external_createexisting.q.out b/ql/src/test/results/clientnegative/translated_external_createexisting.q.out new file mode 100644 index 0000000..3550da4 --- /dev/null +++ b/ql/src/test/results/clientnegative/translated_external_createexisting.q.out @@ -0,0 +1,50 @@ +PREHOOK: query: create table t (a integer) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t +POSTHOOK: query: create table t (a integer) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t +PREHOOK: query: desc formatted t +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@t +POSTHOOK: query: desc formatted t +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@t +# col_name data_type comment +a int + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +#### A masked pattern was here #### +Table Type: EXTERNAL_TABLE +Table Parameters: + COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"a\":\"true\"}} + EXTERNAL TRUE + TRANSLATED_TO_EXTERNAL TRUE + bucketing_version 2 + external.table.purge TRUE + numFiles 0 + numRows 0 + rawDataSize 0 + totalSize 0 +#### A masked pattern was here #### + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 +PREHOOK: query: create table t (a integer) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t +FAILED: Execution Error, return code 40000 from org.apache.hadoop.hive.ql.ddl.DDLTask. AlreadyExistsException(message:Table hive.default.t already exists) diff --git a/ql/src/test/results/clientpositive/llap/translated_external_alter.q.out b/ql/src/test/results/clientpositive/llap/translated_external_alter.q.out new file mode 100644 index 0000000..04b13b2 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/translated_external_alter.q.out @@ -0,0 +1,16 @@ +PREHOOK: query: create table caseSensitive (a integer) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@caseSensitive +POSTHOOK: query: create table caseSensitive (a integer) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@caseSensitive +PREHOOK: query: alter table casesEnsitivE set tblproperties('some'='one') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@casesensitive +PREHOOK: Output: default@casesensitive +POSTHOOK: query: alter table casesEnsitivE set tblproperties('some'='one') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@casesensitive +POSTHOOK: Output: default@casesensitive diff --git a/ql/src/test/results/clientpositive/llap/translated_external_rename3.q.out b/ql/src/test/results/clientpositive/llap/translated_external_rename3.q.out new file mode 100644 index 0000000..0272be3 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/translated_external_rename3.q.out @@ -0,0 +1,154 @@ +PREHOOK: query: create external table t (a integer) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t +POSTHOOK: query: create external table t (a integer) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t +PREHOOK: query: insert into t values(1) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@t +POSTHOOK: query: insert into t values(1) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@t +POSTHOOK: Lineage: t.a SCRIPT [] +PREHOOK: query: alter table t rename to t2 +PREHOOK: type: ALTERTABLE_RENAME +PREHOOK: Input: default@t +PREHOOK: Output: default@t +POSTHOOK: query: alter table t rename to t2 +POSTHOOK: type: ALTERTABLE_RENAME +POSTHOOK: Input: default@t +POSTHOOK: Output: default@t +POSTHOOK: Output: default@t2 +PREHOOK: query: create table t (a integer) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t +POSTHOOK: query: create table t (a integer) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t +PREHOOK: query: insert into t values(2) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@t +POSTHOOK: query: insert into t values(2) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@t +POSTHOOK: Lineage: t.a SCRIPT [] +PREHOOK: query: select assert_true(count(1) = 2) from t +PREHOOK: type: QUERY +PREHOOK: Input: default@t +#### A masked pattern was here #### +POSTHOOK: query: select assert_true(count(1) = 2) from t +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t +#### A masked pattern was here #### +NULL +PREHOOK: query: select assert_true(count(1) = 2) from t2 +PREHOOK: type: QUERY +PREHOOK: Input: default@t2 +#### A masked pattern was here #### +POSTHOOK: query: select assert_true(count(1) = 2) from t2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t2 +#### A masked pattern was here #### +NULL +PREHOOK: query: select * from t +PREHOOK: type: QUERY +PREHOOK: Input: default@t +#### A masked pattern was here #### +POSTHOOK: query: select * from t +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t +#### A masked pattern was here #### +1 +2 +PREHOOK: query: select * from t2 +PREHOOK: type: QUERY +PREHOOK: Input: default@t2 +#### A masked pattern was here #### +POSTHOOK: query: select * from t2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t2 +#### A masked pattern was here #### +1 +2 +PREHOOK: query: desc formatted t +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@t +POSTHOOK: query: desc formatted t +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@t +# col_name data_type comment +a int + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +#### A masked pattern was here #### +Table Type: EXTERNAL_TABLE +Table Parameters: + COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"a\":\"true\"}} + EXTERNAL TRUE + TRANSLATED_TO_EXTERNAL TRUE + bucketing_version 2 + external.table.purge TRUE + numFiles 2 + numRows 1 + rawDataSize 1 + totalSize 4 +#### A masked pattern was here #### + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 +PREHOOK: query: desc formatted t2 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@t2 +POSTHOOK: query: desc formatted t2 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@t2 +# col_name data_type comment +a int + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +#### A masked pattern was here #### +Table Type: EXTERNAL_TABLE +Table Parameters: + COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"a\":\"true\"}} + EXTERNAL TRUE + bucketing_version 2 +#### A masked pattern was here #### + numFiles 1 + numRows 1 + rawDataSize 1 + totalSize 2 +#### A masked pattern was here #### + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 diff --git a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/conf/MetastoreConf.java b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/conf/MetastoreConf.java index 9af81a7..0e05ad3 100644 --- a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/conf/MetastoreConf.java +++ b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/conf/MetastoreConf.java @@ -1086,12 +1086,13 @@ public class MetastoreConf { "Wether TRANSLATED_TO_EXTERNAL tables should follow renames. In case the default directory exists " + "the strategy of metastore.metadata.transformer.location.mode is used"), METASTORE_METADATA_TRANSFORMER_LOCATION_MODE("metastore.metadata.transformer.location.mode", - "metastore.metadata.transformer.location.mode", "prohibit", - new StringSetValidator("seqsuffix", "seqprefix", "prohibit"), + "metastore.metadata.transformer.location.mode", "force", + new StringSetValidator("seqsuffix", "seqprefix", "prohibit", "force"), "Defines the strategy to use in case the default location for a translated table already exists.\n" + " seqsuffix: add a '_N' suffix to the table name to get a unique location (table,table_1,table_2,...)\n" + " seqprefix: adds a 'N_' prefix to the table name to get a unique location (table,1_table,2_table,...)\n" - + " prohibit: do not allow alternate locations; throw error if the default is not available\n"), + + " prohibit: do not consider alternate locations; throw error if the default is not available\n" + + " force: use the default location even in case the directory is already available"), MULTITHREADED("javax.jdo.option.Multithreaded", "javax.jdo.option.Multithreaded", true, "Set this to true if multiple threads access metastore through JDO concurrently."), 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 d4d08f3..93c1000 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 @@ -1081,7 +1081,7 @@ public class MetaStoreUtils { } public static TableName getTableNameFor(Table table) { - return TableName.fromString(table.getTableName(), table.getCatName(), table.getDbName(), null); + return TableName.fromString(table.getTableName().toLowerCase(), table.getCatName().toLowerCase(), table.getDbName().toLowerCase(), null); } /** diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ExceptionHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ExceptionHandler.java index cda540c..8bffa97 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ExceptionHandler.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ExceptionHandler.java @@ -58,7 +58,7 @@ public final class ExceptionHandler { public <T extends Exception> ExceptionHandler throwIfInstance(Class ...te) throws T { if (te != null) { - for (Class t : te) { + for (Class<T> t : te) { throwIfInstance(t); } } 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 a75091b..c2b166b 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 @@ -2335,6 +2335,11 @@ public class HMSHandler extends FacebookBase implements IHMSHandler { throw new MetaException("Create table in REMOTE database " + db.getName() + " is not allowed"); } + if (is_table_exists(ms, tbl.getCatName(), tbl.getDbName(), tbl.getTableName())) { + throw new AlreadyExistsException("Table " + getCatalogQualifiedTableName(tbl) + + " already exists"); + } + if (transformer != null) { tbl = transformer.transformCreateTable(tbl, processorCapabilities, processorId); } diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetastoreDefaultTransformer.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetastoreDefaultTransformer.java index 99fc9e4..25867c4 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetastoreDefaultTransformer.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetastoreDefaultTransformer.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.MetaException; @@ -593,6 +594,13 @@ public class MetastoreDefaultTransformer implements IMetaStoreMetadataTransforme } throw new MetaException("Default location is not available for table: " + p); } + }, + force { + @Override + Path getLocation(IHMSHandler hmsHandler, Database db, Table table, int idx) throws MetaException { + Path p = getDefaultPath(hmsHandler, db, table.getTableName()); + return p; + } }; @@ -701,7 +709,7 @@ public class MetastoreDefaultTransformer implements IMetaStoreMetadataTransforme Path location = null; while (true) { location = strategy.getLocation(hmsHandler, db, table, idx++); - if (!hmsHandler.getWh().isDir(location)) { + if (strategy == TableLocationStrategy.force || !hmsHandler.getWh().isDir(location)) { break; } } @@ -710,7 +718,7 @@ public class MetastoreDefaultTransformer implements IMetaStoreMetadataTransforme } private Path getLocation(Table table) { - if (table.isSetSd() && table.getSd().getLocation() != null) { + if (table.isSetSd() && StringUtils.isNotBlank(table.getSd().getLocation())) { return new Path(table.getSd().getLocation()); } return null; diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestMetastoreTransformer.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestMetastoreTransformer.java new file mode 100644 index 0000000..664403e --- /dev/null +++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestMetastoreTransformer.java @@ -0,0 +1,141 @@ +/* + * 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.metastore; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.util.ArrayList; +import org.apache.hadoop.hive.metastore.client.builder.DatabaseBuilder; +import org.apache.hadoop.hive.metastore.client.builder.TableBuilder; +import org.apache.hadoop.hive.metastore.conf.MetastoreConf; +import org.apache.hadoop.hive.metastore.conf.MetastoreConf.ConfVars; +import org.junit.After; +import org.junit.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.metastore.api.InvalidOperationException; +import org.apache.hadoop.hive.metastore.api.MetaException; +import org.apache.hadoop.hive.metastore.api.NoSuchObjectException; +import org.apache.hadoop.hive.metastore.api.Table; +import org.apache.hadoop.util.StringUtils; +import org.apache.thrift.TException; +import org.junit.Test; + +public class TestMetastoreTransformer { + private static final Logger LOG = LoggerFactory.getLogger(TestMetastoreTransformer.class); + protected static HiveMetaStoreClient client; + protected static Configuration conf = null; + protected static Warehouse warehouse; + protected static boolean isThriftClient = false; + + @Before + public void setUp() throws Exception { + initConf(); + warehouse = new Warehouse(conf); + + // set some values to use for getting conf. vars + MetastoreConf.setBoolVar(conf, ConfVars.METRICS_ENABLED, true); + conf.set("datanucleus.autoCreateTables", "false"); + conf.set("hive.in.test", "true"); + + MetaStoreTestUtils.setConfForStandloneMode(conf); + + warehouse = new Warehouse(conf); + client = createClient(); + } + + @After + public void tearDown() throws Exception { + client.close(); + } + + protected HiveMetaStoreClient createClient() throws Exception { + try { + return new HiveMetaStoreClient(conf); + } catch (Throwable e) { + System.err.println("Unable to open the metastore"); + System.err.println(StringUtils.stringifyException(e)); + throw new Exception(e); + } + } + + protected void initConf() { + if (null == conf) { + conf = MetastoreConf.newMetastoreConf(); + } + } + + private static void silentDropDatabase(String dbName) throws TException { + try { + for (String tableName : client.getTables(dbName, "*")) { + client.dropTable(dbName, tableName); + } + client.dropDatabase(dbName); + } catch (NoSuchObjectException | InvalidOperationException | MetaException e) { + // NOP + } + } + + @Test + public void testAlterTableIsCaseInSensitive() throws Exception { + String dbName = "alterdb"; + String tblName = "altertbl"; + + client.dropTable(dbName, tblName); + silentDropDatabase(dbName); + + String dbLocation = MetastoreConf.getVar(conf, ConfVars.WAREHOUSE_EXTERNAL) + "/_testDB_table_create_"; + String mgdLocation = MetastoreConf.getVar(conf, ConfVars.WAREHOUSE) + "/_testDB_table_create_"; + new DatabaseBuilder().setName(dbName).setLocation(dbLocation).setManagedLocation(mgdLocation).create(client, conf); + + ArrayList<FieldSchema> invCols = new ArrayList<>(2); + invCols.add(new FieldSchema("n-ame", ColumnType.STRING_TYPE_NAME, "")); + invCols.add(new FieldSchema("in.come", ColumnType.INT_TYPE_NAME, "")); + + Table tbl = new TableBuilder().setDbName(dbName).setTableName(tblName).setCols(invCols).build(conf); + + client.createTable(tbl); + tbl = client.getTable(tbl.getDbName(), tbl.getTableName()); + tbl.setTableName(tblName.toUpperCase()); + + // expected to execute the operation without any exceptions + client.alter_table(tbl.getDbName(), tbl.getTableName().toUpperCase(), tbl); + + Table tbl2 = client.getTable(tbl.getDbName(), tbl.getTableName().toLowerCase()); + assertEquals(tbl.getTableName().toLowerCase(), tbl2.getTableName()); + + } + + @Test + public void testLocationBlank() throws Exception { + Table tbl = + new TableBuilder().setTableName("locationBlank").setCols(new ArrayList<FieldSchema>()).setLocation("") + .build(conf); + + // expected to execute the operation without any exceptions + client.createTable(tbl); + + Table tbl2 = client.getTable(tbl.getDbName(), tbl.getTableName().toLowerCase()); + assertEquals("locationblank", new File(tbl2.getSd().getLocation()).getName()); + } + +} 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 bc5f35f..1f9d956 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 @@ -411,6 +411,7 @@ public class TestTablesCreateDropAlterTruncate extends MetaStoreClientTest { @Test(expected = MetaException.class) public void testCreateTableNullStorageDescriptor() throws Exception { Table table = testTables[0]; + table.setTableName("NullStorageT"); table.setSd(null); client.createTable(table);