This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch branch-1.2-lts in repository https://gitbox.apache.org/repos/asf/doris.git
commit 2a40112018e60cc3e48f848bd46a2ada580b0d80 Author: Gabriel <[email protected]> AuthorDate: Wed Mar 15 12:08:23 2023 +0800 [Bug](datetimev2) Fix BE crash if scale is invalid (#17763) --- be/src/io/hdfs_builder.cpp | 4 ++-- be/src/vec/data_types/data_type_factory.cpp | 4 ++-- be/src/vec/data_types/data_type_time_v2.cpp | 9 +++++++++ be/src/vec/data_types/data_type_time_v2.h | 2 ++ .../sql_functions/datetime_functions/test_date_function.groovy | 9 +++++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/be/src/io/hdfs_builder.cpp b/be/src/io/hdfs_builder.cpp index b08b973860..4db04eb681 100644 --- a/be/src/io/hdfs_builder.cpp +++ b/be/src/io/hdfs_builder.cpp @@ -31,9 +31,9 @@ namespace doris { Status HDFSCommonBuilder::init_hdfs_builder() { hdfs_builder = hdfsNewBuilder(); if (hdfs_builder == nullptr) { - LOG(INFO) << "failed to init HDFSCommonBuilder, please check check be/conf/hdfs-site.xml"; + LOG(INFO) << "failed to init HDFSCommonBuilder, please check be/conf/hdfs-site.xml and be.out"; return Status::InternalError( - "failed to init HDFSCommonBuilder, please check check be/conf/hdfs-site.xml"); + "failed to init HDFSCommonBuilder, please check be/conf/hdfs-site.xml and be.out"); } return Status::OK(); } diff --git a/be/src/vec/data_types/data_type_factory.cpp b/be/src/vec/data_types/data_type_factory.cpp index e622d979d5..e8728a251b 100644 --- a/be/src/vec/data_types/data_type_factory.cpp +++ b/be/src/vec/data_types/data_type_factory.cpp @@ -87,7 +87,7 @@ DataTypePtr DataTypeFactory::create_data_type(const TypeDescriptor& col_desc, bo nested = std::make_shared<vectorized::DataTypeDateV2>(); break; case TYPE_DATETIMEV2: - nested = std::make_shared<vectorized::DataTypeDateTimeV2>(col_desc.scale); + nested = vectorized::create_datetimev2(col_desc.scale); break; case TYPE_DATETIME: nested = std::make_shared<vectorized::DataTypeDateTime>(); @@ -175,7 +175,7 @@ DataTypePtr DataTypeFactory::_create_primitive_data_type(const FieldType& type, result = std::make_shared<vectorized::DataTypeDateV2>(); break; case OLAP_FIELD_TYPE_DATETIMEV2: - result = std::make_shared<vectorized::DataTypeDateTimeV2>(scale); + result = vectorized::create_datetimev2(scale); break; case OLAP_FIELD_TYPE_DATETIME: result = std::make_shared<vectorized::DataTypeDateTime>(); diff --git a/be/src/vec/data_types/data_type_time_v2.cpp b/be/src/vec/data_types/data_type_time_v2.cpp index ed52721ee7..9562be9277 100644 --- a/be/src/vec/data_types/data_type_time_v2.cpp +++ b/be/src/vec/data_types/data_type_time_v2.cpp @@ -143,4 +143,13 @@ void DataTypeDateTimeV2::cast_from_date_time(const Int64 from, UInt64& to) { void DataTypeDateTimeV2::cast_to_date_v2(const UInt64 from, UInt32& to) { to = from >> TIME_PART_LENGTH; } + +DataTypePtr create_datetimev2(UInt64 scale_value) { + if (scale_value > 6) { + LOG(WARNING) << "Wrong scale " << scale_value; + return nullptr; + } + return std::make_shared<DataTypeDateTimeV2>(scale_value); +} + } // namespace doris::vectorized diff --git a/be/src/vec/data_types/data_type_time_v2.h b/be/src/vec/data_types/data_type_time_v2.h index 75c8c9b142..2bae4d26f6 100644 --- a/be/src/vec/data_types/data_type_time_v2.h +++ b/be/src/vec/data_types/data_type_time_v2.h @@ -89,6 +89,8 @@ private: UInt32 _scale; }; +DataTypePtr create_datetimev2(UInt64 scale); + template <typename DataType> constexpr bool IsDataTypeDateTimeV2 = false; template <> diff --git a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy index 5995bb53a1..38e8e41030 100644 --- a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy +++ b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy @@ -628,4 +628,13 @@ suite("test_date_function") { from ${tableName}; """ sql """ DROP TABLE IF EXISTS ${tableName}; """ + test { + sql"""select current_timestamp(7);""" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + sql """ DROP TABLE IF EXISTS ${tableName}; """ + } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
