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