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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 02fa772ab6c [feature](insert)support default value when create hive 
table (#33666)
02fa772ab6c is described below

commit 02fa772ab6cfef1c65a82a04635d68c40d0562af
Author: slothever <18522955+w...@users.noreply.github.com>
AuthorDate: Fri Apr 19 11:28:10 2024 +0800

    [feature](insert)support default value when create hive table (#33666)
    
    Issue Number: #31442
    
    hive3 support create table with column's default value
    if use hive3, we can write default value to table
---
 .../main/java/org/apache/doris/catalog/Column.java |   6 +
 .../doris/datasource/hive/HMSCachedClient.java     |   2 +
 .../doris/datasource/hive/HMSExternalTable.java    |  10 +-
 .../doris/datasource/hive/HiveVersionUtil.java     |   2 +-
 .../hive/PostgreSQLJdbcHMSCachedClient.java        |  10 +
 .../datasource/hive/ThriftHMSCachedClient.java     |  60 ++++-
 .../hadoop/hive/metastore/HiveMetaStoreClient.java |   5 +-
 .../doris/datasource/TestHMSCachedClient.java      |   5 +
 .../hive/ddl/test_hive_ctas.groovy                 |  47 ++--
 .../hive/ddl/test_hive_ddl.groovy                  | 258 ++++++++++++---------
 10 files changed, 280 insertions(+), 125 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
index 82bac846d7d..9ea53f41e56 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
@@ -193,6 +193,12 @@ public class Column implements Writable, 
GsonPostProcessable {
                 false, null);
     }
 
+    public Column(String name, Type type, boolean isKey, AggregateType 
aggregateType, boolean isAllowNull,
+                  String defaultValue, String comment, boolean visible, int 
colUniqueId) {
+        this(name, type, isKey, aggregateType, isAllowNull, -1, defaultValue, 
comment, visible, null, colUniqueId, null,
+                false, null);
+    }
+
     public Column(String name, Type type, boolean isKey, AggregateType 
aggregateType, boolean isAllowNull,
             String defaultValue, String comment, boolean visible, 
DefaultValueExprDef defaultValueExprDef,
             int colUniqueId, String realDefaultValue) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSCachedClient.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSCachedClient.java
index d8daeb155c5..b10bfc39d44 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSCachedClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSCachedClient.java
@@ -63,6 +63,8 @@ public interface HMSCachedClient {
 
     List<FieldSchema> getSchema(String dbName, String tblName);
 
+    Map<String, String> getDefaultColumnValues(String dbName, String tblName);
+
     List<ColumnStatisticsObj> getTableColumnStatistics(String dbName, String 
tblName,
             List<String> columns);
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
index 05bba50ecb5..38556682ee0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
@@ -584,13 +584,17 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
     }
 
     private List<Column> getHiveSchema() {
+        HMSCachedClient client = ((HMSExternalCatalog) catalog).getClient();
         List<Column> columns;
-        List<FieldSchema> schema = ((HMSExternalCatalog) 
catalog).getClient().getSchema(dbName, name);
+        List<FieldSchema> schema = client.getSchema(dbName, name);
+        Map<String, String> colDefaultValues = 
client.getDefaultColumnValues(dbName, name);
         List<Column> tmpSchema = Lists.newArrayListWithCapacity(schema.size());
         for (FieldSchema field : schema) {
-            tmpSchema.add(new Column(field.getName().toLowerCase(Locale.ROOT),
+            String fieldName = field.getName().toLowerCase(Locale.ROOT);
+            String defaultValue = colDefaultValues.getOrDefault(fieldName, 
null);
+            tmpSchema.add(new Column(fieldName,
                     
HiveMetaStoreClientHelper.hiveTypeToDorisType(field.getType()), true, null,
-                    true, field.getComment(), true, -1));
+                    true, defaultValue, field.getComment(), true, -1));
         }
         columns = tmpSchema;
         return columns;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveVersionUtil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveVersionUtil.java
index 59afad2d4be..6f2346d3d80 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveVersionUtil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveVersionUtil.java
@@ -71,7 +71,7 @@ public class HiveVersionUtil {
                     return DEFAULT_HIVE_VERSION;
                 }
             } else if (major >= 3) {
-                return HiveVersion.V2_3;
+                return HiveVersion.V3_0;
             } else {
                 LOG.warn("invalid hive version: " + version);
                 return DEFAULT_HIVE_VERSION;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/PostgreSQLJdbcHMSCachedClient.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/PostgreSQLJdbcHMSCachedClient.java
index 11cec91eb90..a98e71d4b2a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/PostgreSQLJdbcHMSCachedClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/PostgreSQLJdbcHMSCachedClient.java
@@ -49,6 +49,7 @@ import org.apache.logging.log4j.Logger;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -245,6 +246,15 @@ public class PostgreSQLJdbcHMSCachedClient extends 
JdbcHMSCachedClient {
         }
     }
 
+    @Override
+    public Map<String, String> getDefaultColumnValues(String dbName, String 
tblName) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Do not support default column values in 
PostgreSQLJdbcHMSCachedClient."
+                    + " Will use null values instead.");
+        }
+        return new HashMap<>();
+    }
+
     @Override
     public Table getTable(String dbName, String tblName) {
         String sql = "SELECT \"TBL_ID\", \"TBL_NAME\", \"DBS\".\"NAME\", 
\"OWNER\", \"CREATE_TIME\","
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java
index 9fae854645b..0f74da32018 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java
@@ -18,6 +18,7 @@
 package org.apache.doris.datasource.hive;
 
 import org.apache.doris.analysis.TableName;
+import org.apache.doris.catalog.Column;
 import org.apache.doris.common.Config;
 import org.apache.doris.datasource.DatabaseMetadata;
 import org.apache.doris.datasource.TableMetadata;
@@ -46,6 +47,7 @@ import 
org.apache.hadoop.hive.metastore.api.ColumnStatisticsObj;
 import org.apache.hadoop.hive.metastore.api.CurrentNotificationEventId;
 import org.apache.hadoop.hive.metastore.api.DataOperationType;
 import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.DefaultConstraintsRequest;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.LockComponent;
 import org.apache.hadoop.hive.metastore.api.LockResponse;
@@ -53,17 +55,22 @@ import org.apache.hadoop.hive.metastore.api.LockState;
 import org.apache.hadoop.hive.metastore.api.MetaException;
 import org.apache.hadoop.hive.metastore.api.NotificationEventResponse;
 import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.SQLDefaultConstraint;
 import org.apache.hadoop.hive.metastore.api.Table;
 import org.apache.hadoop.hive.metastore.api.TableValidWriteIds;
 import org.apache.hadoop.hive.metastore.txn.TxnUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import shade.doris.hive.org.apache.thrift.TApplicationException;
 
 import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Queue;
@@ -153,8 +160,28 @@ public class ThriftHMSCachedClient implements 
HMSCachedClient {
             try {
                 // String location,
                 if (tbl instanceof HiveTableMetadata) {
+                    Table hiveTable = HiveUtil.toHiveTable((HiveTableMetadata) 
tbl);
+                    List<Column> tableColumns = ((HiveTableMetadata) 
tbl).getColumns();
+                    List<SQLDefaultConstraint> dvs = new 
ArrayList<>(tableColumns.size());
+                    for (Column tableColumn : tableColumns) {
+                        if (tableColumn.hasDefaultValue()) {
+                            SQLDefaultConstraint dv = new 
SQLDefaultConstraint();
+                            dv.setTable_db(tbl.getDbName());
+                            dv.setTable_name(tbl.getTableName());
+                            dv.setColumn_name(tableColumn.getName());
+                            dv.setDefault_value(tableColumn.getDefaultValue());
+                            dv.setDc_name(tableColumn.getName() + 
"_dv_constraint");
+                            dvs.add(dv);
+                        }
+                    }
                     ugiDoAs(() -> {
-                        
client.client.createTable(HiveUtil.toHiveTable((HiveTableMetadata) tbl));
+                        if (!dvs.isEmpty()) {
+                            // foreignKeys, uniqueConstraints, 
notNullConstraints, defaultConstraints, checkConstraints
+                            
client.client.createTableWithConstraints(hiveTable, null,
+                                    null, null, null, dvs, null);
+                            return null;
+                        }
+                        client.client.createTable(hiveTable);
                         return null;
                     });
                 }
@@ -293,6 +320,37 @@ public class ThriftHMSCachedClient implements 
HMSCachedClient {
         }
     }
 
+    public Map<String, String> getDefaultColumnValues(String dbName, String 
tblName) {
+        Map<String, String> res = new HashMap<>();
+        try (ThriftHMSClient client = getClient()) {
+            try {
+                DefaultConstraintsRequest req = new 
DefaultConstraintsRequest();
+                req.setDb_name(dbName);
+                req.setTbl_name(tblName);
+                List<SQLDefaultConstraint> dvcs = ugiDoAs(() -> {
+                    try {
+                        return client.client.getDefaultConstraints(req);
+                    } catch (TApplicationException e) {
+                        if (e.getMessage().contains("Invalid method name: 
'get_default_constraints'")) {
+                            // the getDefaultConstraints method only supported 
on hive3
+                            return ImmutableList.of();
+                        }
+                        throw e;
+                    }
+                });
+                for (SQLDefaultConstraint dvc : dvcs) {
+                    res.put(dvc.getColumn_name().toLowerCase(Locale.ROOT), 
dvc.getDefault_value());
+                }
+                return res;
+            } catch (Exception e) {
+                client.setThrowable(e);
+                throw e;
+            }
+        } catch (Exception e) {
+            throw new HMSClientException("failed to get table %s in db %s from 
hms client", e, tblName, dbName);
+        }
+    }
+
     @Override
     public Table getTable(String dbName, String tblName) {
         try (ThriftHMSClient client = getClient()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
 
b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
index 1064a3e70e6..5c86d9025e8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
@@ -1089,7 +1089,10 @@ public class HiveMetaStoreClient implements 
IMetaStoreClient, AutoCloseable {
     List<SQLCheckConstraint> checkConstraints)
         throws AlreadyExistsException, InvalidObjectException,
         MetaException, NoSuchObjectException, TException {
-
+    if (hiveVersion != HiveVersion.V3_0) {
+      throw new UnsupportedOperationException("Table with default values is 
not supported "
+          + "if the hive version is less than 3.0. Can set 'hive.version' to 
3.0 in properties.");
+    }
     if (!tbl.isSetCatName()) {
       String defaultCat = getDefaultCatalog(conf);
       tbl.setCatName(defaultCat);
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/TestHMSCachedClient.java 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/TestHMSCachedClient.java
index 3927c0db524..dd2e8dc2d11 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/TestHMSCachedClient.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/TestHMSCachedClient.java
@@ -162,6 +162,11 @@ public class TestHMSCachedClient implements 
HMSCachedClient {
         return null;
     }
 
+    @Override
+    public Map<String, String> getDefaultColumnValues(String dbName, String 
tblName) {
+        return new HashMap<>();
+    }
+
     @Override
     public List<ColumnStatisticsObj> getTableColumnStatistics(String dbName, 
String tblName, List<String> columns) {
         return null;
diff --git 
a/regression-test/suites/external_table_p0/hive/ddl/test_hive_ctas.groovy 
b/regression-test/suites/external_table_p0/hive/ddl/test_hive_ctas.groovy
index 1c69004867f..2aff01d0a03 100644
--- a/regression-test/suites/external_table_p0/hive/ddl/test_hive_ctas.groovy
+++ b/regression-test/suites/external_table_p0/hive/ddl/test_hive_ctas.groovy
@@ -396,22 +396,43 @@ suite("test_hive_ctas", 
"p0,external,hive,external_docker,external_docker_hive")
             sql """ switch `${catalog_name}` """
             sql """ CREATE DATABASE IF NOT EXISTS `test_ctas_all_type` """;
             sql """ use test_ctas_all_type """;
+            // TODO: work on hive3
+            //            sql """
+            //                CREATE TABLE IF NOT EXISTS 
all_types_ctas_${file_format}_with_dv(
+            //                  `col1` BOOLEAN DEFAULT 'false' COMMENT 'col1',
+            //                  `col2` TINYINT DEFAULT '127' COMMENT 'col2',
+            //                  `col3` SMALLINT DEFAULT '32767' COMMENT 'col3',
+            //                  `col4` INT DEFAULT '2147483647' COMMENT 'col4',
+            //                  `col5` BIGINT DEFAULT '9223372036854775807' 
COMMENT 'col5',
+            //                  `col6` CHAR(10) DEFAULT 'default' COMMENT 
'col6',
+            //                  `col7` FLOAT DEFAULT '1' COMMENT 'col7',
+            //                  `col8` DOUBLE DEFAULT '3.141592653' COMMENT 
'col8',
+            //                  `col9` DECIMAL(9,4) DEFAULT '99999.9999' 
COMMENT 'col9',
+            //                  `col10` VARCHAR(11) DEFAULT 'default' COMMENT 
'col10',
+            //                  `col11` STRING DEFAULT 'default' COMMENT 
'col11',
+            //                  `col12` DATE DEFAULT '2023-05-29' COMMENT 
'col12',
+            //                  `col13` DATETIME DEFAULT current_timestamp 
COMMENT 'col13'
+            //                )  ENGINE=hive
+            //                PROPERTIES (
+            //                  'file_format'='${file_format}'
+            //                )
+            //                """
 
             sql """
                 CREATE TABLE IF NOT EXISTS all_types_ctas_${file_format}(
-                  `col1` BOOLEAN DEFAULT 'false' COMMENT 'col1',
-                  `col2` TINYINT DEFAULT '127' COMMENT 'col2',
-                  `col3` SMALLINT DEFAULT '32767' COMMENT 'col3',
-                  `col4` INT DEFAULT '2147483647' COMMENT 'col4',
-                  `col5` BIGINT DEFAULT '9223372036854775807' COMMENT 'col5',
-                  `col6` CHAR(10) DEFAULT 'default' COMMENT 'col6',
-                  `col7` FLOAT DEFAULT '1' COMMENT 'col7',
-                  `col8` DOUBLE DEFAULT '3.141592653' COMMENT 'col8',
-                  `col9` DECIMAL(9,4) DEFAULT '99999.9999' COMMENT 'col9',
-                  `col10` VARCHAR(11) DEFAULT 'default' COMMENT 'col10',
-                  `col11` STRING DEFAULT 'default' COMMENT 'col11',
-                  `col12` DATE DEFAULT '2023-05-29' COMMENT 'col12',
-                  `col13` DATETIME DEFAULT current_timestamp COMMENT 'col13'
+                  `col1` BOOLEAN COMMENT 'col1',
+                  `col2` TINYINT COMMENT 'col2',
+                  `col3` SMALLINT COMMENT 'col3',
+                  `col4` INT COMMENT 'col4',
+                  `col5` BIGINT COMMENT 'col5',
+                  `col6` CHAR(10) COMMENT 'col6',
+                  `col7` FLOAT COMMENT 'col7',
+                  `col8` DOUBLE COMMENT 'col8',
+                  `col9` DECIMAL(9,4) COMMENT 'col9',
+                  `col10` VARCHAR(11) COMMENT 'col10',
+                  `col11` STRING COMMENT 'col11',
+                  `col12` DATE COMMENT 'col12',
+                  `col13` DATETIME COMMENT 'col13'
                 )  ENGINE=hive
                 PROPERTIES (
                   'file_format'='${file_format}'
diff --git 
a/regression-test/suites/external_table_p0/hive/ddl/test_hive_ddl.groovy 
b/regression-test/suites/external_table_p0/hive/ddl/test_hive_ddl.groovy
index b494ffcc7e5..07d93ea7d72 100644
--- a/regression-test/suites/external_table_p0/hive/ddl/test_hive_ddl.groovy
+++ b/regression-test/suites/external_table_p0/hive/ddl/test_hive_ddl.groovy
@@ -91,113 +91,27 @@ suite("test_hive_ddl", 
"p0,external,hive,external_docker,external_docker_hive")
             }
         }
 
-        def test_loc_tbl = { String file_format, String externalEnvIp, String 
hdfs_port, String catalog_name ->
-            logger.info("Test create/drop table with location...")
-            sql """switch ${catalog_name}"""
-            def loc = "${externalEnvIp}:${hdfs_port}/tmp/hive/test_hive_loc_db"
-            sql  """ create database if not exists `test_hive_loc`
-                    properties('location'='hdfs://${loc}')
-                 """
-            sql """use `test_hive_loc`"""
-
-            // case1. the table default location is inherited from db
-            sql """DROP TABLE IF EXISTS `loc_tbl_${file_format}_default`"""
-            sql """
-                    CREATE TABLE loc_tbl_${file_format}_default (
-                      `col` STRING COMMENT 'col'
-                    )  ENGINE=hive 
-                    PROPERTIES (
-                      'file_format'='${file_format}'
-                    )
-                 """
-            def create_tbl_res = sql """ show create table 
loc_tbl_${file_format}_default """
-            logger.info("${create_tbl_res}")
-            
assertTrue(create_tbl_res.toString().containsIgnoreCase("${loc}/loc_tbl_${file_format}_default"))
-
-            sql """ INSERT INTO loc_tbl_${file_format}_default values(1)  """
+        def test_tbl_default_val = { String file_format, String externalEnvIp, 
String hms_port,
+                                     String hdfs_port, String catalog_name ->
 
-            def tvfRes = sql """ SELECT * FROM hdfs(
-                                  
'uri'='hdfs://${loc}/loc_tbl_${file_format}_default/*',
-                                  'format' = '${file_format}',
-                                  'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
-                                 )
-                             """
-            logger.info("${tvfRes}")
-            assertTrue(!tvfRes.isEmpty())
-            sql """DROP TABLE `loc_tbl_${file_format}_default`"""
-            def tvfDropRes = sql """ SELECT * FROM hdfs(
-                                  
'uri'='hdfs://${loc}/loc_tbl_${file_format}_default/*',
-                                  'format' = '${file_format}',
-                                  'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
-                                 )
-                             """
-            logger.info("${tvfDropRes}")
-            assertTrue(tvfDropRes.isEmpty())
-
-            // case2. use a custom location to create table
-            def tbl_loc = "hdfs://${loc}/custom_loc"
-            sql """ DROP TABLE IF EXISTS loc_tbl_${file_format}_customm"""
-            sql """
-                    CREATE TABLE loc_tbl_${file_format}_custom (
-                      `col` STRING COMMENT 'col'
-                    )  ENGINE=hive 
-                    PROPERTIES (
-                      'file_format'='${file_format}',
-                      'location'='${tbl_loc}'
-                    )
+            // create and insert default value is supported on hive3, we can 
test default hive version 2.3
+            sql """switch ${catalog_name}"""
+            sql  """ create database if not exists `test_hive_default_val`
                  """
-            def create_tbl_res2 = sql """ show create table 
loc_tbl_${file_format}_custom """
-            logger.info("${create_tbl_res2}")
-            
assertTrue(create_tbl_res2.toString().containsIgnoreCase("${tbl_loc}"))
-            sql """ INSERT INTO loc_tbl_${file_format}_custom values(1)  """
-            def tvfRes2 = sql """ SELECT * FROM hdfs(
-                                    'uri'='${tbl_loc}/*',
-                                    'format' = '${file_format}',
-                                    'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
-                                  )
-                              """
-            logger.info("${tvfRes2}")
-            assertTrue(!tvfRes2.isEmpty())
-            sql """DROP TABLE `loc_tbl_${file_format}_custom`"""
-            def tvfDropRes2 = sql """ SELECT * FROM hdfs(
-                                        'uri'='${tbl_loc}/*',
-                                        'format' = '${file_format}',
-                                        'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
-                                      )
-                                  """
-            logger.info("${tvfDropRes2}")
-            assertTrue(tvfDropRes2.isEmpty())
-
-            // case3. check default
-            sql """
-                CREATE TABLE all_default_values_${file_format}(
-                  `col1` BOOLEAN DEFAULT 'false' COMMENT 'col1',
-                  `col2` TINYINT DEFAULT '127' COMMENT 'col2',
-                  `col3` SMALLINT DEFAULT '32767' COMMENT 'col3',
-                  `col4` INT DEFAULT '2147483647' COMMENT 'col4',
-                  `col5` BIGINT DEFAULT '9223372036854775807' COMMENT 'col5',
-                  `col6` CHAR(10) DEFAULT 'default' COMMENT 'col6',
-                  `col7` FLOAT DEFAULT '1' COMMENT 'col7',
-                  `col8` DOUBLE DEFAULT '3.141592653' COMMENT 'col8',
-                  `col9` DECIMAL(9,4) DEFAULT '99999.9999' COMMENT 'col9',
-                  `col10` VARCHAR(11) DEFAULT 'default' COMMENT 'col10',
-                  `col11` STRING DEFAULT 'default' COMMENT 'col11',
-                  `col12` DATE DEFAULT '2023-05-29' COMMENT 'col12',
-                  `col13` DATETIME DEFAULT current_timestamp COMMENT 'col13'
-                )  ENGINE=hive
-                PROPERTIES (
-                  'file_format'='${file_format}'
-                )
-                """
-            // need support default insert:
-            //            sql """ INSERT INTO all_default_values_${file_format}
-            //                    VALUES(null, null, null, null, null, null, 
null, null, null, null, null, null, null)
-            //                """
-            //            sql """ INSERT INTO 
all_default_values_${file_format} (col1, col3, col5, col7, col12)
-            //                    VALUES(null, null, null, null)
-            //                """
-            //            order_qt_default_val01 """ SELECT * FROM 
all_default_values_${file_format} """
-            sql """DROP TABLE `all_default_values_${file_format}`"""
+            sql """use `test_hive_default_val`"""
+            test {
+                sql """ 
+                        CREATE TABLE all_default_values_${file_format}_hive2(
+                          `col1` BOOLEAN DEFAULT 'false' COMMENT 'col1',
+                          `col2` TINYINT DEFAULT '127' COMMENT 'col2'
+                        )  ENGINE=hive
+                        PROPERTIES (
+                          'file_format'='${file_format}'
+                        )
+                    """
+                exception "java.sql.SQLException: errCode = 2, detailMessage = 
errCode = 2, detailMessage = failed to create database from hms client. reason: 
java.lang.UnsupportedOperationException: Table with default values is not 
supported if the hive version is less than 3.0. Can set 'hive.version' to 3.0 
in properties."
+            }
+            sql """DROP DATABASE `test_hive_default_val`"""
 
             test {
                 sql """
@@ -283,7 +197,138 @@ suite("test_hive_ddl", 
"p0,external,hive,external_docker,external_docker_hive")
                 exception "errCode = 2, detailMessage = errCode = 2, 
detailMessage = date literal [2020-09-20 02:60] is invalid: Text '2020-09-20 
02:60' could not be parsed: Invalid value for MinuteOfHour (valid values 0 - 
59): 60"
             }
 
-            // case4. check some exceptions
+            // test 'hive.version' = '3.0'
+            //            sql """drop catalog if exists 
${catalog_name}_hive3"""
+            //            sql """create catalog if not exists 
${catalog_name}_hive3 properties (
+            //                'type'='hms',
+            //                'hive.metastore.uris' = 
'thrift://${externalEnvIp}:${hms_port}',
+            //                'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}',
+            //                'hive.version' = '3.0'
+            //            );"""
+            //            sql """ switch ${catalog_name}_hive3 """
+            //            sql  """ create database if not exists 
`test_hive_default_val_hive3`
+            //                 """
+            //            sql """use `test_hive_default_val_hive3`"""
+            //            // test create hive3 table when use 'hive.version' = 
'3.0'
+            //            sql """
+            //                CREATE TABLE all_default_values_${file_format}(
+            //                  `col1` BOOLEAN DEFAULT 'false' COMMENT 'col1',
+            //                  `col2` TINYINT DEFAULT '127' COMMENT 'col2',
+            //                  `col3` SMALLINT DEFAULT '32767' COMMENT 'col3',
+            //                  `col4` INT DEFAULT '2147483647' COMMENT 'col4',
+            //                  `col5` BIGINT DEFAULT '9223372036854775807' 
COMMENT 'col5',
+            //                  `col6` CHAR(10) DEFAULT 'default' COMMENT 
'col6',
+            //                  `col7` FLOAT DEFAULT '1' COMMENT 'col7',
+            //                  `col8` DOUBLE DEFAULT '3.141592653' COMMENT 
'col8',
+            //                  `col9` DECIMAL(9,4) DEFAULT '99999.9999' 
COMMENT 'col9',
+            //                  `col10` VARCHAR(11) DEFAULT 'default' COMMENT 
'col10',
+            //                  `col11` STRING DEFAULT 'default' COMMENT 
'col11',
+            //                  `col12` DATE DEFAULT '2023-05-29' COMMENT 
'col12',
+            //                  `col13` DATETIME DEFAULT current_timestamp 
COMMENT 'col13'
+            //                )  ENGINE=hive
+            //                PROPERTIES (
+            //                  'file_format'='${file_format}'
+            //                )
+            //                """
+            //            // TODO: work on hive3
+            //            sql """ INSERT INTO all_default_values_${file_format}
+            //                    VALUES(null, null, null, null, null, null, 
null, null, null, null, null, null, null)
+            //                """
+            //            sql """ INSERT INTO 
all_default_values_${file_format} (col1, col3, col5, col7, col12)
+            //                    VALUES(false, null, 3.4, null, null)
+            //                """
+            //            sql """ INSERT INTO 
all_default_values_${file_format} (col2, col4, col6, col9, col11)
+            //                    VALUES(-128, null, 'A', null, '2024-07-30')
+            //                """
+            //            order_qt_default_val01 """ SELECT * FROM 
all_default_values_${file_format} """
+            //            test {
+            //                sql """ INSERT INTO 
all_default_values_${file_format} (col2, col4, col6, col9, col11)
+            //                    VALUES("123", "abcd", 'Ab', null, 
'2024-07-30')
+            //                """
+            //                exception "errCode = 2, detailMessage = errCode 
= 2, detailMessage = Invalid number format: abcd"
+            //            }
+            //
+            //            sql """DROP TABLE 
`all_default_values_${file_format}`"""
+        }
+
+        def test_loc_tbl = { String file_format, String externalEnvIp, String 
hdfs_port, String catalog_name ->
+            logger.info("Test create/drop table with location...")
+            sql """switch ${catalog_name}"""
+            def loc = "${externalEnvIp}:${hdfs_port}/tmp/hive/test_hive_loc_db"
+            sql  """ create database if not exists `test_hive_loc`
+                    properties('location'='hdfs://${loc}')
+                 """
+            sql """use `test_hive_loc`"""
+
+            // case1. the table default location is inherited from db
+            sql """DROP TABLE IF EXISTS `loc_tbl_${file_format}_default`"""
+            sql """
+                    CREATE TABLE loc_tbl_${file_format}_default (
+                      `col` STRING COMMENT 'col'
+                    )  ENGINE=hive 
+                    PROPERTIES (
+                      'file_format'='${file_format}'
+                    )
+                 """
+            def create_tbl_res = sql """ show create table 
loc_tbl_${file_format}_default """
+            logger.info("${create_tbl_res}")
+            
assertTrue(create_tbl_res.toString().containsIgnoreCase("${loc}/loc_tbl_${file_format}_default"))
+
+            sql """ INSERT INTO loc_tbl_${file_format}_default values(1)  """
+
+            def tvfRes = sql """ SELECT * FROM hdfs(
+                                  
'uri'='hdfs://${loc}/loc_tbl_${file_format}_default/*',
+                                  'format' = '${file_format}',
+                                  'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
+                                 )
+                             """
+            logger.info("${tvfRes}")
+            assertTrue(!tvfRes.isEmpty())
+            sql """DROP TABLE `loc_tbl_${file_format}_default`"""
+            def tvfDropRes = sql """ SELECT * FROM hdfs(
+                                  
'uri'='hdfs://${loc}/loc_tbl_${file_format}_default/*',
+                                  'format' = '${file_format}',
+                                  'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
+                                 )
+                             """
+            logger.info("${tvfDropRes}")
+            assertTrue(tvfDropRes.isEmpty())
+
+            // case2. use a custom location to create table
+            def tbl_loc = "hdfs://${loc}/custom_loc"
+            sql """ DROP TABLE IF EXISTS loc_tbl_${file_format}_customm"""
+            sql """
+                    CREATE TABLE loc_tbl_${file_format}_custom (
+                      `col` STRING COMMENT 'col'
+                    )  ENGINE=hive 
+                    PROPERTIES (
+                      'file_format'='${file_format}',
+                      'location'='${tbl_loc}'
+                    )
+                 """
+            def create_tbl_res2 = sql """ show create table 
loc_tbl_${file_format}_custom """
+            logger.info("${create_tbl_res2}")
+            
assertTrue(create_tbl_res2.toString().containsIgnoreCase("${tbl_loc}"))
+            sql """ INSERT INTO loc_tbl_${file_format}_custom values(1)  """
+            def tvfRes2 = sql """ SELECT * FROM hdfs(
+                                    'uri'='${tbl_loc}/*',
+                                    'format' = '${file_format}',
+                                    'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
+                                  )
+                              """
+            logger.info("${tvfRes2}")
+            assertTrue(!tvfRes2.isEmpty())
+            sql """DROP TABLE `loc_tbl_${file_format}_custom`"""
+            def tvfDropRes2 = sql """ SELECT * FROM hdfs(
+                                        'uri'='${tbl_loc}/*',
+                                        'format' = '${file_format}',
+                                        'fs.defaultFS' = 
'hdfs://${externalEnvIp}:${hdfs_port}'
+                                      )
+                                  """
+            logger.info("${tvfDropRes2}")
+            assertTrue(tvfDropRes2.isEmpty())
+
+            // case3. check some exceptions
             def comment_check = sql """ CREATE TABLE ex_tbl_${file_format}(
                                           `col1` INT COMMENT 'col1',
                                           `col2` STRING COMMENT 'col2',
@@ -659,6 +704,7 @@ suite("test_hive_ddl", 
"p0,external,hive,external_docker,external_docker_hive")
             for (String file_format in file_formats) {
                 logger.info("Process file format " + file_format)
                 test_loc_tbl(file_format, externalEnvIp, hdfs_port, 
catalog_name)
+                test_tbl_default_val(file_format, externalEnvIp, hms_port, 
hdfs_port, catalog_name)
                 test_db_tbl(file_format, externalEnvIp, hdfs_port, 
catalog_name)
 
                 for (String compression in compressions) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to