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]

Reply via email to