This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 f1864d9fcf [fix](function) fix str_to_date with specific format #22981
f1864d9fcf is described below
commit f1864d9fcf7476b889c9587258ee4215d09bd3f1
Author: Mryange <[email protected]>
AuthorDate: Tue Aug 15 15:30:48 2023 +0800
[fix](function) fix str_to_date with specific format #22981
---
be/src/vec/functions/function_timestamp.cpp | 28 ++++++--
.../data/correctness/test_str_to_date.out | 29 ++++++++
.../suites/correctness/test_str_to_date.groovy | 78 ++++++++++++++++++++++
3 files changed, 130 insertions(+), 5 deletions(-)
diff --git a/be/src/vec/functions/function_timestamp.cpp
b/be/src/vec/functions/function_timestamp.cpp
index a71062c483..1bca282f2e 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -74,6 +74,21 @@ struct StrToDate {
return make_nullable(std::make_shared<DataTypeDateTime>());
}
+ static StringRef rewrite_specific_format(const char* raw_str, size_t
str_size) {
+ const static std::string specific_format_strs[3] = {"yyyyMMdd",
"yyyy-MM-dd",
+ "yyyy-MM-dd
HH:mm:ss"};
+ const static std::string specific_format_rewrite[3] = {"%Y%m%d",
"%Y-%m-%d",
+ "%Y-%m-%d
%H:%i:%s"};
+ for (int i = 0; i < 3; i++) {
+ const StringRef specific_format {specific_format_strs[i].data(),
+ specific_format_strs[i].size()};
+ if (specific_format == StringRef {raw_str, str_size}) {
+ return {specific_format_rewrite[i].data(),
specific_format_rewrite[i].size()};
+ }
+ }
+ return {raw_str, str_size};
+ }
+
static Status execute(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
size_t result, size_t input_rows_count) {
auto null_map = ColumnUInt8::create(input_rows_count, 0);
@@ -161,9 +176,10 @@ private:
const char* r_raw_str = reinterpret_cast<const
char*>(&rdata[roffsets[i - 1]]);
size_t r_str_size = roffsets[i] - roffsets[i - 1];
-
- _execute_inner_loop<DateValueType, NativeType>(l_raw_str,
l_str_size, r_raw_str,
- r_str_size,
context, res, null_map, i);
+ const StringRef format_str = rewrite_specific_format(r_raw_str,
r_str_size);
+ _execute_inner_loop<DateValueType, NativeType>(l_raw_str,
l_str_size, format_str.data,
+ format_str.size,
context, res, null_map,
+ i);
}
}
template <typename DateValueType, typename NativeType>
@@ -173,12 +189,14 @@ private:
NullMap& null_map) {
size_t size = loffsets.size();
res.resize(size);
+ const StringRef format_str = rewrite_specific_format(rdata.data,
rdata.size);
for (size_t i = 0; i < size; ++i) {
const char* l_raw_str = reinterpret_cast<const
char*>(&ldata[loffsets[i - 1]]);
size_t l_str_size = loffsets[i] - loffsets[i - 1];
- _execute_inner_loop<DateValueType, NativeType>(l_raw_str,
l_str_size, rdata.data,
- rdata.size,
context, res, null_map, i);
+ _execute_inner_loop<DateValueType, NativeType>(l_raw_str,
l_str_size, format_str.data,
+ format_str.size,
context, res, null_map,
+ i);
}
}
template <typename DateValueType, typename NativeType>
diff --git a/regression-test/data/correctness/test_str_to_date.out
b/regression-test/data/correctness/test_str_to_date.out
new file mode 100644
index 0000000000..af6342ecf6
--- /dev/null
+++ b/regression-test/data/correctness/test_str_to_date.out
@@ -0,0 +1,29 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select1 --
+2019-12-01 yyyy-MM-dd 2019-12-01T00:00
+20201203 yyyyMMdd 2020-12-03T00:00
+2020-12-03 11:45:14 yyyy-MM-dd HH:mm:ss 2020-12-03T11:45:14
+
+-- !select2 --
+2019-12-01
+
+-- !select3 --
+2020-12-03
+
+-- !select4 --
+2020-12-03T11:45:14
+
+-- !select5 --
+2019-12-01 yyyy-MM-dd 2019-12-01T00:00
+20201203 yyyyMMdd 2020-12-03T00:00
+2020-12-03 11:45:14 yyyy-MM-dd HH:mm:ss 2020-12-03T11:45:14
+
+-- !select6 --
+2019-12-01
+
+-- !select7 --
+2020-12-03
+
+-- !select8 --
+2020-12-03T11:45:14
+
diff --git a/regression-test/suites/correctness/test_str_to_date.groovy
b/regression-test/suites/correctness/test_str_to_date.groovy
new file mode 100644
index 0000000000..6c26a8db24
--- /dev/null
+++ b/regression-test/suites/correctness/test_str_to_date.groovy
@@ -0,0 +1,78 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_str_to_date") {
+ sql """ DROP TABLE IF EXISTS test_str_to_date_db """
+
+ sql """
+ CREATE TABLE IF NOT EXISTS test_str_to_date_db (
+ `id` INT NULL COMMENT "",
+ `s1` String NULL COMMENT "",
+ `s2` String NULL COMMENT ""
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`id`)
+ DISTRIBUTED BY HASH(`id`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "storage_format" = "V2"
+ );
+ """
+
+ sql """ INSERT INTO test_str_to_date_db VALUES(1,'2019-12-01',
'yyyy-MM-dd');"""
+ sql """ INSERT INTO test_str_to_date_db VALUES(2,'20201203',
'yyyyMMdd');"""
+ sql """ INSERT INTO test_str_to_date_db VALUES(3,'2020-12-03 11:45:14',
'yyyy-MM-dd HH:mm:ss');"""
+
+ sql """ set enable_nereids_planner=true ,
enable_fallback_to_original_planner=false;"""
+
+
+ qt_select1 """
+ select s1,s2,STR_TO_DATE(s1,s2) from test_str_to_date_db order by id;
+ """
+
+ qt_select2 """
+ SELECT STR_TO_DATE('2019-12-01', 'yyyy-MM-dd');
+ """
+
+ qt_select3 """
+ SELECT STR_TO_DATE('20201203', 'yyyyMMdd');
+ """
+
+ qt_select4 """
+ SELECT STR_TO_DATE('2020-12-03 11:45:14', 'yyyy-MM-dd HH:mm:ss');
+ """
+
+
+ sql """ set enable_nereids_planner=false;"""
+
+ qt_select5 """
+ select s1,s2,STR_TO_DATE(s1,s2) from test_str_to_date_db order by id;
+ """
+
+ qt_select6 """
+ SELECT STR_TO_DATE('2019-12-01', 'yyyy-MM-dd');
+ """
+
+ qt_select7 """
+ SELECT STR_TO_DATE('20201203', 'yyyyMMdd');
+ """
+
+ qt_select8 """
+ SELECT STR_TO_DATE('2020-12-03 11:45:14', 'yyyy-MM-dd HH:mm:ss');
+ """
+
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]