You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by de...@apache.org on 2023/01/17 03:49:24 UTC

[hive] branch master updated: HIVE-26911: Renaming a translated external table with a specified location fails with location already exists (#3920)

This is an automated email from the ASF dual-hosted git repository.

dengzh 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 ad0ab58d994 HIVE-26911: Renaming a translated external table with a specified location fails with location already exists (#3920)
ad0ab58d994 is described below

commit ad0ab58d9945b9a4727ab606f566e1d346bbd20b
Author: Sai Hemanth Gantasala <68...@users.noreply.github.com>
AuthorDate: Mon Jan 16 19:49:13 2023 -0800

    HIVE-26911: Renaming a translated external table with a specified location fails with location already exists (#3920)
---
 .../rename_translated_external_table.q             |  24 ++++
 .../llap/rename_translated_external_table.q.out    | 147 +++++++++++++++++++++
 .../hadoop/hive/metastore/HiveAlterHandler.java    |   8 +-
 3 files changed, 178 insertions(+), 1 deletion(-)

diff --git a/ql/src/test/queries/clientpositive/rename_translated_external_table.q b/ql/src/test/queries/clientpositive/rename_translated_external_table.q
new file mode 100644
index 00000000000..9a8c5604352
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/rename_translated_external_table.q
@@ -0,0 +1,24 @@
+-- Mask the totalSize value as it can have slight variability, causing test flakiness
+--! qt:replace:/(\s+totalSize\s+)\S+(\s+)/$1#Masked#$2/
+set metastore.metadata.transformer.class=org.apache.hadoop.hive.metastore.MetastoreDefaultTransformer;
+
+create database if not exists tmp;
+
+use tmp;
+
+create table b(s string) stored as parquet location 'file:${system:test.tmp.dir}/tmp.db/some_location';
+
+insert into b values ("a"),("b"),("c");
+
+select * from b;
+
+desc formatted b;
+
+alter table b rename to bb;
+
+desc formatted bb;
+
+-- new table and location should be available after rename
+create table b(s string) stored as parquet location 'file:${system:test.tmp.dir}/tmp.db/some_location';
+
+select * from b;
diff --git a/ql/src/test/results/clientpositive/llap/rename_translated_external_table.q.out b/ql/src/test/results/clientpositive/llap/rename_translated_external_table.q.out
new file mode 100644
index 00000000000..ee6f3edbe6d
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/rename_translated_external_table.q.out
@@ -0,0 +1,147 @@
+PREHOOK: query: create database if not exists tmp
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:tmp
+POSTHOOK: query: create database if not exists tmp
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:tmp
+PREHOOK: query: use tmp
+PREHOOK: type: SWITCHDATABASE
+PREHOOK: Input: database:tmp
+POSTHOOK: query: use tmp
+POSTHOOK: type: SWITCHDATABASE
+POSTHOOK: Input: database:tmp
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+PREHOOK: Output: database:tmp
+PREHOOK: Output: tmp@b
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+POSTHOOK: Output: database:tmp
+POSTHOOK: Output: tmp@b
+PREHOOK: query: insert into b values ("a"),("b"),("c")
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: tmp@b
+POSTHOOK: query: insert into b values ("a"),("b"),("c")
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: tmp@b
+POSTHOOK: Lineage: b.s SCRIPT []
+PREHOOK: query: select * from b
+PREHOOK: type: QUERY
+PREHOOK: Input: tmp@b
+#### A masked pattern was here ####
+POSTHOOK: query: select * from b
+POSTHOOK: type: QUERY
+POSTHOOK: Input: tmp@b
+#### A masked pattern was here ####
+a
+b
+c
+PREHOOK: query: desc formatted b
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: tmp@b
+POSTHOOK: query: desc formatted b
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: tmp@b
+# col_name            	data_type           	comment             
+s                   	string              	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	tmp                 	 
+#### 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\":{\"s\":\"true\"}}
+	EXTERNAL            	TRUE                
+	TRANSLATED_TO_EXTERNAL	TRUE                
+	bucketing_version   	2                   
+	external.table.purge	TRUE                
+	numFiles            	1                   
+	numRows             	3                   
+	rawDataSize         	44                  
+	totalSize           	#Masked#                 
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe	 
+InputFormat:        	org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+Storage Desc Params:	 	 
+	serialization.format	1                   
+PREHOOK: query: alter table b rename to bb
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: tmp@b
+PREHOOK: Output: database:tmp
+PREHOOK: Output: tmp@b
+PREHOOK: Output: tmp@bb
+POSTHOOK: query: alter table b rename to bb
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: tmp@b
+POSTHOOK: Output: database:tmp
+POSTHOOK: Output: tmp@b
+POSTHOOK: Output: tmp@bb
+PREHOOK: query: desc formatted bb
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: tmp@bb
+POSTHOOK: query: desc formatted bb
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: tmp@bb
+# col_name            	data_type           	comment             
+s                   	string              	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	tmp                 	 
+#### 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\":{\"s\":\"true\"}}
+	EXTERNAL            	TRUE                
+	TRANSLATED_TO_EXTERNAL	TRUE                
+	bucketing_version   	2                   
+	external.table.purge	TRUE                
+#### A masked pattern was here ####
+	numFiles            	1                   
+	numRows             	3                   
+	rawDataSize         	44                  
+	totalSize           	#Masked#                 
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe	 
+InputFormat:        	org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+Storage Desc Params:	 	 
+	serialization.format	1                   
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+PREHOOK: Output: database:tmp
+PREHOOK: Output: tmp@b
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+POSTHOOK: Output: database:tmp
+POSTHOOK: Output: tmp@b
+PREHOOK: query: select * from b
+PREHOOK: type: QUERY
+PREHOOK: Input: tmp@b
+#### A masked pattern was here ####
+POSTHOOK: query: select * from b
+POSTHOOK: type: QUERY
+POSTHOOK: Input: tmp@b
+#### A masked pattern was here ####
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
index 4c293f6aeca..2ee80fd4eb4 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
@@ -288,7 +288,13 @@ public class HiveAlterHandler implements AlterHandler {
             // get new location
             assert(isReplicated == HMSHandler.isDbReplicationTarget(db));
             if (renamedTranslatedToExternalTable) {
-              destPath = new Path(newt.getSd().getLocation());
+              if (!tableInSpecifiedLoc) {
+                destPath = new Path(newt.getSd().getLocation());
+              } else {
+                Path databasePath = constructRenamedPath(wh.getDatabaseExternalPath(db), srcPath);
+                destPath = new Path(databasePath, newTblName);
+                newt.getSd().setLocation(destPath.toString());
+              }
             } else {
               Path databasePath = constructRenamedPath(wh.getDatabaseManagedPath(db), srcPath);
               destPath = new Path(databasePath, newTblName);