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 423fc83d20f HIVE-29481: Fix create table with transactional=false and
transactional_properties=insert_only to create a translated to external table
(#6432)
423fc83d20f is described below
commit 423fc83d20fcd2d1e203c7a481e65089a930c245
Author: Venu Reddy <[email protected]>
AuthorDate: Thu Apr 16 04:25:07 2026 +0530
HIVE-29481: Fix create table with transactional=false and
transactional_properties=insert_only to create a translated to external table
(#6432)
Co-authored-by: Venu Reddy <[email protected]>
---
.../metastore/TestHiveMetastoreTransformer.java | 2 +-
.../clientpositive/translated_external_create.q | 17 +++
.../llap/translated_external_create.q.out | 135 +++++++++++++++++++++
.../metastore/MetastoreDefaultTransformer.java | 16 +--
4 files changed, 156 insertions(+), 14 deletions(-)
diff --git
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetastoreTransformer.java
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetastoreTransformer.java
index 8c5a68c4296..c3c174bcc34 100644
---
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetastoreTransformer.java
+++
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetastoreTransformer.java
@@ -1276,7 +1276,7 @@ public void testTransformerAlterTable() throws Exception {
table_params = new StringBuilder();
table_params.append("key1=val1");
table_params.append(";");
- table_params.append("transactional_properties=insert_only");
+
table_params.append("transactional=true;transactional_properties=insert_only");
tProps.put("PROPERTIES", table_params.toString());
List<String> capabilities = new ArrayList<>();
diff --git a/ql/src/test/queries/clientpositive/translated_external_create.q
b/ql/src/test/queries/clientpositive/translated_external_create.q
new file mode 100644
index 00000000000..124e2f195fc
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/translated_external_create.q
@@ -0,0 +1,17 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+set hive.create.as.acid=true;
+set hive.default.fileformat.managed=ORC;
+set
hive.metastore.client.capabilities=HIVEFULLACIDWRITE,HIVEMANAGEDINSERTWRITE;
+set
metastore.metadata.transformer.class=org.apache.hadoop.hive.metastore.MetastoreDefaultTransformer;
+
+-- Should create translated external table when transactional=false
+create table translated_table1 (i int) tblproperties('transactional'='false');
+desc formatted translated_table1;
+
+-- Should create translated external table when transactional=false and have
transactional_properties
+create table translated_table2 (i int) tblproperties('transactional'='false',
'transactional_properties'='default');
+desc formatted translated_table2;
+
+create table translated_table3 (i int) tblproperties('transactional'='false',
'transactional_properties'='insert_only');
+desc formatted translated_table3;
\ No newline at end of file
diff --git
a/ql/src/test/results/clientpositive/llap/translated_external_create.q.out
b/ql/src/test/results/clientpositive/llap/translated_external_create.q.out
new file mode 100644
index 00000000000..522624fd79c
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/translated_external_create.q.out
@@ -0,0 +1,135 @@
+PREHOOK: query: create table translated_table1 (i int)
tblproperties('transactional'='false')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@translated_table1
+POSTHOOK: query: create table translated_table1 (i int)
tblproperties('transactional'='false')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@translated_table1
+PREHOOK: query: desc formatted translated_table1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@translated_table1
+POSTHOOK: query: desc formatted translated_table1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@translated_table1
+# col_name data_type comment
+i 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\":{\"i\":\"true\"}}
+ EXTERNAL TRUE
+ TRANSLATED_TO_EXTERNAL TRUE
+ bucketing_version 2
+ external.table.purge TRUE
+ numFiles 0
+ numRows 0
+ rawDataSize 0
+ totalSize #Masked#
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
+InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+Storage Desc Params:
+ serialization.format 1
+PREHOOK: query: create table translated_table2 (i int)
tblproperties('transactional'='false', 'transactional_properties'='default')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@translated_table2
+POSTHOOK: query: create table translated_table2 (i int)
tblproperties('transactional'='false', 'transactional_properties'='default')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@translated_table2
+PREHOOK: query: desc formatted translated_table2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@translated_table2
+POSTHOOK: query: desc formatted translated_table2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@translated_table2
+# col_name data_type comment
+i 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\":{\"i\":\"true\"}}
+ EXTERNAL TRUE
+ TRANSLATED_TO_EXTERNAL TRUE
+ bucketing_version 2
+ external.table.purge TRUE
+ numFiles 0
+ numRows 0
+ rawDataSize 0
+ totalSize #Masked#
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
+InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+Storage Desc Params:
+ serialization.format 1
+PREHOOK: query: create table translated_table3 (i int)
tblproperties('transactional'='false', 'transactional_properties'='insert_only')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@translated_table3
+POSTHOOK: query: create table translated_table3 (i int)
tblproperties('transactional'='false', 'transactional_properties'='insert_only')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@translated_table3
+PREHOOK: query: desc formatted translated_table3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@translated_table3
+POSTHOOK: query: desc formatted translated_table3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@translated_table3
+# col_name data_type comment
+i 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\":{\"i\":\"true\"}}
+ EXTERNAL TRUE
+ TRANSLATED_TO_EXTERNAL TRUE
+ bucketing_version 2
+ external.table.purge TRUE
+ numFiles 0
+ numRows 0
+ rawDataSize 0
+ totalSize #Masked#
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
+InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+Storage Desc Params:
+ serialization.format 1
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 235d1cfef55..468f3b0db5f 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
@@ -20,7 +20,6 @@
import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.ACCESSTYPE_NONE;
import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.ACCESSTYPE_READONLY;
import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.ACCESSTYPE_READWRITE;
-import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.CTAS_LEGACY_CONFIG;
import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.TABLE_IS_TRANSACTIONAL;
import static
org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.TABLE_TRANSACTIONAL_PROPERTIES;
import static
org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.EXTERNAL_TABLE_PURGE;
@@ -630,10 +629,6 @@ public Table transformCreateTable(Table table,
List<String> processorCapabilitie
params = new HashMap<>();
}
String tableType = newTable.getTableType();
- String txnal = null;
- String txn_properties = null;
- boolean isInsertAcid = false;
-
String dbName = table.getDbName();
Database db = null;
try {
@@ -642,13 +637,9 @@ public Table transformCreateTable(Table table,
List<String> processorCapabilitie
throw new MetaException("Database " + dbName + " for table " +
table.getTableName() + " could not be found");
}
- if (TableType.MANAGED_TABLE.name().equals(tableType)) {
+ if (TableType.MANAGED_TABLE.name().equals(tableType)) {
LOG.debug("Table is a MANAGED_TABLE");
- txnal = params.get(TABLE_IS_TRANSACTIONAL);
- txn_properties = params.get(TABLE_TRANSACTIONAL_PROPERTIES);
- isInsertAcid = (txn_properties != null &&
txn_properties.equalsIgnoreCase("insert_only"));
- boolean ctas_legacy_config = params.containsKey(CTAS_LEGACY_CONFIG) &&
params.get(CTAS_LEGACY_CONFIG).equalsIgnoreCase("true") ? true : false;
- if (((txnal == null || txnal.equalsIgnoreCase("FALSE")) &&
!isInsertAcid) || (ctas_legacy_config && (txnal == null ||
txnal.equalsIgnoreCase("FALSE")))) { // non-ACID MANAGED TABLE
+ if (!Boolean.parseBoolean(params.get(TABLE_IS_TRANSACTIONAL))) { //
non-ACID MANAGED TABLE
LOG.info("Converting " + newTable.getTableName() + " to EXTERNAL
tableType for " + processorId);
newTable.setTableType(TableType.EXTERNAL_TABLE.toString());
params.remove(TABLE_IS_TRANSACTIONAL);
@@ -682,9 +673,8 @@ public Table transformCreateTable(Table table, List<String>
processorCapabilitie
throw new MetaException("Processor has no capabilities, cannot
create an ACID table.");
}
-
newTable = validateTablePaths(table);
- if (isInsertAcid) { // MICRO_MANAGED Tables
+ if (MetaStoreUtils.isInsertOnlyTableParam(table.getParameters())) { //
MICRO_MANAGED Tables
if (processorCapabilities.contains(HIVEMANAGEDINSERTWRITE)) {
LOG.debug("Processor has required capabilities to be able to
create INSERT-only tables");
return newTable;