From ce1b8a2287500eb31ca7d15e5f7c5edc2b61a814 Mon Sep 17 00:00:00 2001 From: Mryange Date: Mon, 10 Mar 2025 18:10:56 +0800 Subject: [PATCH 1/2] fix --- be/src/vec/runtime/vdatetime_value.cpp | 6 ---- be/test/vec/runtime/vdatetime_value_test.cpp | 30 +++++++++++++++++++ .../data/correctness/test_str_to_date.out | 3 ++ .../correctness/test_str_to_date.groovy | 5 ++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/be/src/vec/runtime/vdatetime_value.cpp b/be/src/vec/runtime/vdatetime_value.cpp index 07508ede5c01fb..bef4513d5ab3de 100644 --- a/be/src/vec/runtime/vdatetime_value.cpp +++ b/be/src/vec/runtime/vdatetime_value.cpp @@ -1248,9 +1248,6 @@ bool VecDateTimeValue::from_date_format_str(const char* format, int format_len, while (val < val_end && check_space(*val)) { val++; } - if (val >= val_end) { - break; - } // Check switch if (*ptr == '%' && ptr + 1 < end) { const char* tmp = nullptr; @@ -2277,9 +2274,6 @@ bool DateV2Value::from_date_format_str(const char* format, int format_len, co while (val < val_end && check_space(*val)) { val++; } - if (val >= val_end) { - break; - } // Check switch if (*ptr == '%' && ptr + 1 < end) { const char* tmp = nullptr; diff --git a/be/test/vec/runtime/vdatetime_value_test.cpp b/be/test/vec/runtime/vdatetime_value_test.cpp index fd0b3a1d2e5e74..7583104c725026 100644 --- a/be/test/vec/runtime/vdatetime_value_test.cpp +++ b/be/test/vec/runtime/vdatetime_value_test.cpp @@ -630,4 +630,34 @@ TEST(VDateTimeValueTest, date_v2_daynr_test) { } } +TEST(VDateTimeValueTest, date_v2_from_date_format_str_with_all_space) { + std::string format_str = "%Y-%m-%d %H:%i:%s.%f"; + std::string date_str = " "; + { + DateV2Value date; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + DateV2Value date; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + VecDateTimeValue date; + date._type = TIME_DATE; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + VecDateTimeValue date; + date._type = TIME_DATETIME; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } +} + } // namespace doris::vectorized diff --git a/regression-test/data/correctness/test_str_to_date.out b/regression-test/data/correctness/test_str_to_date.out index f145ff9e4bedc8..cf5b74fc8cc721 100644 --- a/regression-test/data/correctness/test_str_to_date.out +++ b/regression-test/data/correctness/test_str_to_date.out @@ -53,3 +53,6 @@ 6 \N 7 \N +-- !select_all_space -- +\N + diff --git a/regression-test/suites/correctness/test_str_to_date.groovy b/regression-test/suites/correctness/test_str_to_date.groovy index 75234b1f3b3afd..8829a2a03cadca 100644 --- a/regression-test/suites/correctness/test_str_to_date.groovy +++ b/regression-test/suites/correctness/test_str_to_date.groovy @@ -77,4 +77,9 @@ suite("test_str_to_date") { check_fold_consistency "STR_TO_DATE('2019-12-01', null)" check_fold_consistency "STR_TO_DATE(null, null)" check_fold_consistency "STR_TO_DATE('无效日期', 'yyyy-MM-dd')" + + + qt_select_all_space """ + SELECT STR_TO_DATE(' ', '%Y-%m-%d %H:%i:%s'); + """ } From d41865f10ecee288f6235aecfc16073f9f87a194 Mon Sep 17 00:00:00 2001 From: Mryange Date: Mon, 10 Mar 2025 21:22:47 +0800 Subject: [PATCH 2/2] be-ut --- be/test/vec/runtime/vdatetime_value_test.cpp | 67 ++++++++++++-------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/be/test/vec/runtime/vdatetime_value_test.cpp b/be/test/vec/runtime/vdatetime_value_test.cpp index 7583104c725026..0660345078a3c5 100644 --- a/be/test/vec/runtime/vdatetime_value_test.cpp +++ b/be/test/vec/runtime/vdatetime_value_test.cpp @@ -631,32 +631,47 @@ TEST(VDateTimeValueTest, date_v2_daynr_test) { } TEST(VDateTimeValueTest, date_v2_from_date_format_str_with_all_space) { - std::string format_str = "%Y-%m-%d %H:%i:%s.%f"; - std::string date_str = " "; - { - DateV2Value date; - EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), - date_str.data(), date_str.size())); - } - - { - DateV2Value date; - EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), - date_str.data(), date_str.size())); - } - - { - VecDateTimeValue date; - date._type = TIME_DATE; - EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), - date_str.data(), date_str.size())); - } - - { - VecDateTimeValue date; - date._type = TIME_DATETIME; - EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), - date_str.data(), date_str.size())); + auto test_all_space = [](const std::string& format_str) { + std::string date_str = " "; + { + DateV2Value date; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + DateV2Value date; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + VecDateTimeValue date; + date._type = TIME_DATE; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + + { + VecDateTimeValue date; + date._type = TIME_DATETIME; + EXPECT_FALSE(date.from_date_format_str(format_str.data(), format_str.size(), + date_str.data(), date_str.size())); + } + }; + + test_all_space("%Y-%m-%d %H:%i:%s.%f"); + test_all_space("%Y"); + test_all_space("%Y-%m-%d"); + test_all_space("%Y-%m-%d %H:%i:%s"); + test_all_space("%Y-%m-%d %H:%i:%s.%f %p"); + for (char ch = 'a'; ch <= 'z'; ch++) { + std::string fomat_str = "%" + std::string(1, ch); + test_all_space(fomat_str); + } + for (char ch = 'A'; ch <= 'Z'; ch++) { + std::string fomat_str = "%" + std::string(1, ch); + test_all_space(fomat_str); } }