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);

Reply via email to