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 <[email protected]>
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);