This is an automated email from the ASF dual-hosted git repository.
panxiaolei 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 dc470875603 [fix](function) fix str_to_date default return type scale
for nereids (#24932)
dc470875603 is described below
commit dc4708756036a48bda1f0c2159f64a50de8eb1e2
Author: zclllyybb <[email protected]>
AuthorDate: Fri Oct 20 12:55:49 2023 +0800
[fix](function) fix str_to_date default return type scale for nereids
(#24932)
fix str_to_date default return type scale for nereids
---
be/src/vec/functions/function_timestamp.cpp | 3 +++
be/src/vec/runtime/vdatetime_value.cpp | 24 +++++++++++++++++-----
.../expressions/functions/scalar/StrToDate.java | 10 ++++++---
gensrc/script/doris_builtins_functions.py | 4 ++--
.../datetime_functions/test_date_function.out | 5 ++++-
.../datetime_functions/test_date_function.out | 3 +++
.../datetime_functions/test_date_function.groovy | 1 +
.../datetime_functions/test_date_function.groovy | 1 +
8 files changed, 40 insertions(+), 11 deletions(-)
diff --git a/be/src/vec/functions/function_timestamp.cpp
b/be/src/vec/functions/function_timestamp.cpp
index 7d36c7c5040..927d0d81035 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -72,6 +72,7 @@ struct StrToDate {
static DataTypes get_variadic_argument_types() { return {}; }
static DataTypePtr get_return_type_impl(const DataTypes& arguments) {
+ //TODO: it doesn't matter now. maybe sometime we should find the
function signature with return_type together
return make_nullable(std::make_shared<DataTypeDateTime>());
}
@@ -115,6 +116,8 @@ struct StrToDate {
auto& rdata = specific_char_column->get_chars();
auto& roffsets = specific_char_column->get_offsets();
+ // Because of we cant distinguish by return_type when we find
function. so the return_type may NOT be same with real return type
+ // which decided by FE. that's found by which.
ColumnPtr res = nullptr;
WhichDataType
which(remove_nullable(block.get_by_position(result).type));
if (which.is_date_time_v2()) {
diff --git a/be/src/vec/runtime/vdatetime_value.cpp
b/be/src/vec/runtime/vdatetime_value.cpp
index 44e2cc0a69e..b7f30d6e024 100644
--- a/be/src/vec/runtime/vdatetime_value.cpp
+++ b/be/src/vec/runtime/vdatetime_value.cpp
@@ -2300,14 +2300,28 @@ bool DateV2Value<T>::from_date_format_str(const char*
format, int format_len, co
break;
// Micro second
case 'f':
- tmp = val + min(6, val_end - val);
- if (!str_to_int64(val, &tmp, &int_value)) {
- return false;
+ tmp = val;
+ // when there's still something to the end, fix the scale of
ms.
+ while (tmp < val_end && isdigit(*tmp)) {
+ tmp++;
+ }
+
+ if (tmp - val > 6) {
+ const char* tmp2 = val + 6;
+ if (!str_to_int64(val, &tmp2, &int_value)) {
+ return false;
+ }
+ } else {
+ if (!str_to_int64(val, &tmp, &int_value)) {
+ return false;
+ }
+ }
+ if constexpr (is_datetime) {
+ microsecond = int_value * int_exp10(6 - min(6, tmp - val));
+ frac_part_used = true;
}
- microsecond = int_value * int_exp10(6 - min(6, val_end - val));
val = tmp;
time_part_used = true;
- frac_part_used = true;
break;
// AM/PM
case 'p':
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StrToDate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StrToDate.java
index eb17439df8e..4f512ec09fe 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StrToDate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StrToDate.java
@@ -28,7 +28,7 @@ import
org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
-import org.apache.doris.nereids.types.DateTimeType;
+import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.types.StringType;
import org.apache.doris.nereids.types.VarcharType;
@@ -44,8 +44,9 @@ public class StrToDate extends ScalarFunction
implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNullable {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-
FunctionSignature.ret(DateTimeType.INSTANCE).args(VarcharType.SYSTEM_DEFAULT,
VarcharType.SYSTEM_DEFAULT),
-
FunctionSignature.ret(DateTimeType.INSTANCE).args(StringType.INSTANCE,
StringType.INSTANCE)
+
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(VarcharType.SYSTEM_DEFAULT,
+ VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(StringType.INSTANCE,
StringType.INSTANCE)
);
/**
@@ -86,6 +87,9 @@ public class StrToDate extends ScalarFunction
if (getArgument(1) instanceof StringLikeLiteral) {
if (DateLiteral.hasTimePart(((StringLikeLiteral)
getArgument(1)).getStringValue())) {
returnType =
DataType.fromCatalogType(ScalarType.getDefaultDateType(Type.DATETIME));
+ if (returnType.isDateTimeV2Type()) {
+ returnType =
DataType.fromCatalogType(Type.DATETIMEV2_WITH_MAX_SCALAR);
+ }
} else {
returnType =
DataType.fromCatalogType(ScalarType.getDefaultDateType(Type.DATE));
}
diff --git a/gensrc/script/doris_builtins_functions.py
b/gensrc/script/doris_builtins_functions.py
index bdddde58036..d8bab55de02 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -939,8 +939,6 @@ visible_functions = {
[['datediff'], 'INT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
[['timediff'], 'TIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
- [['str_to_date'], 'DATETIME', ['VARCHAR', 'VARCHAR'],
'ALWAYS_NULLABLE'],
- [['str_to_date'], 'DATETIME', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATETIME', 'VARCHAR'],
'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATE', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['date', 'to_date'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],
@@ -1104,6 +1102,8 @@ visible_functions = {
[['datediff'], 'INT', ['DATEV2', 'DATEV2'], ''],
[['timediff'], 'TIMEV2', ['DATEV2', 'DATEV2'], ''],
+ [['str_to_date'], 'DATETIMEV2', ['VARCHAR', 'VARCHAR'],
'ALWAYS_NULLABLE'],
+ [['str_to_date'], 'DATETIMEV2', ['STRING', 'STRING'],
'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATETIMEV2', 'VARCHAR'],
'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['date', 'to_date', 'datev2', 'to_datev2'], 'DATEV2', ['DATETIMEV2'],
'ALWAYS_NULLABLE'],
diff --git
a/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
b/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
index 43eff1b302c..34c466cb71b 100644
---
a/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
+++
b/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
@@ -235,7 +235,10 @@ February
2014-12-21T12:34:56
-- !sql --
-2014-12-21T12:34:56
+2014-12-21T12:34:56.789
+
+-- !sql --
+2023-07-05T02:09:55.880
-- !sql --
2004-10-18
diff --git
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
index 6e9ca29f3f9..5c61bfc31d2 100644
---
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
+++
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
@@ -275,6 +275,9 @@ February
-- !sql --
2014-12-21T12:34:56
+-- !sql --
+2023-07-05T02:09:55
+
-- !sql --
2004-10-18
diff --git
a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
index 073c5dc725d..13add305b65 100644
---
a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
+++
b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
@@ -304,6 +304,7 @@ suite("test_date_function") {
qt_sql """ select str_to_date(test_datetime, '%Y-%m-%d %H:%i:%s') from
${tableName}; """
qt_sql """ select str_to_date("2014-12-21 12:34%3A56", '%Y-%m-%d
%H:%i%%3A%s'); """
qt_sql """ select str_to_date("2014-12-21 12:34:56.789 PM", '%Y-%m-%d
%h:%i:%s.%f %p'); """
+ qt_sql """ select
str_to_date('2023-07-05T02:09:55.880Z','%Y-%m-%dT%H:%i:%s.%fZ') """
qt_sql """ select str_to_date('200442 Monday', '%X%V %W') """
sql """ truncate table ${tableName} """
sql """ insert into ${tableName} values ("2020-09-01") """
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 ae031a97fa9..2dc1834c717 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
@@ -333,6 +333,7 @@ suite("test_date_function") {
qt_sql """ select str_to_date(test_datetime, '%Y-%m-%d %H:%i:%s') from
${tableName}; """
qt_sql """ select str_to_date("2014-12-21 12:34%3A56", '%Y-%m-%d
%H:%i%%3A%s'); """
qt_sql """ select str_to_date("2014-12-21 12:34:56.789 PM", '%Y-%m-%d
%h:%i:%s.%f %p'); """
+ qt_sql """ select
str_to_date('2023-07-05T02:09:55.880Z','%Y-%m-%dT%H:%i:%s.%fZ') """
qt_sql """ select str_to_date('200442 Monday', '%X%V %W') """
sql """ truncate table ${tableName} """
sql """ insert into ${tableName} values ("2020-09-01") """
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]