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