This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 7535702f32 [feature](cast) remove some unused in functioncast and
support some function in nereids (#22729) (#22825)
7535702f32 is described below
commit 7535702f322be6de2b7d617dc3f6ab05108e79ce
Author: Mryange <[email protected]>
AuthorDate: Tue Aug 15 13:17:14 2023 +0800
[feature](cast) remove some unused in functioncast and support some
function in nereids (#22729) (#22825)
1 ConvertImplGenericFromString do not need a template StringColumnType
2 remove timev1 in function cast
3 support time_to_sec , sec_to_time in nereids
---
be/src/vec/core/call_on_type_index.h | 2 +-
be/src/vec/functions/function_cast.h | 26 +++------
.../doris/catalog/BuiltinScalarFunctions.java | 7 ++-
.../expressions/functions/scalar/SecToTime.java | 68 ++++++++++++++++++++++
.../expressions/functions/scalar/TimeToSec.java | 68 ++++++++++++++++++++++
.../suites/correctness/test_time_function.groovy | 2 +-
6 files changed, 152 insertions(+), 21 deletions(-)
diff --git a/be/src/vec/core/call_on_type_index.h
b/be/src/vec/core/call_on_type_index.h
index 7e6ea4118c..283f7aeb07 100644
--- a/be/src/vec/core/call_on_type_index.h
+++ b/be/src/vec/core/call_on_type_index.h
@@ -204,7 +204,7 @@ bool call_on_index_and_data_type(TypeIndex number, F&& f) {
case TypeIndex::Float64:
return f(TypePair<DataTypeNumber<Float64>, T>());
case TypeIndex::Time:
- return f(TypePair<DataTypeTime, T>());
+ return f(TypePair<DataTypeTimeV2, T>());
case TypeIndex::TimeV2:
return f(TypePair<DataTypeTimeV2, T>());
case TypeIndex::Decimal32:
diff --git a/be/src/vec/functions/function_cast.h
b/be/src/vec/functions/function_cast.h
index 4debe7c188..7f6a2ebec4 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -541,19 +541,15 @@ struct ConvertImplGenericToString {
}
};
//this is for data in compound type
-template <typename StringColumnType>
struct ConvertImplGenericFromString {
static Status execute(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
const size_t result, size_t input_rows_count) {
- static_assert(std::is_same_v<StringColumnType, ColumnString>,
- "Can be used only to parse from ColumnString");
const auto& col_with_type_and_name =
block.get_by_position(arguments[0]);
const IColumn& col_from = *col_with_type_and_name.column;
// result column must set type
DCHECK(block.get_by_position(result).type != nullptr);
auto data_type_to = block.get_by_position(result).type;
- if (const StringColumnType* col_from_string =
- check_and_get_column<StringColumnType>(&col_from)) {
+ if (const ColumnString* col_from_string =
check_and_get_column<ColumnString>(&col_from)) {
auto col_to = data_type_to->create_column();
size_t size = col_from.size();
@@ -561,14 +557,14 @@ struct ConvertImplGenericFromString {
ColumnUInt8::MutablePtr col_null_map_to =
ColumnUInt8::create(size);
ColumnUInt8::Container* vec_null_map_to =
&col_null_map_to->get_data();
-
+ const bool is_complex = is_complex_type(data_type_to);
for (size_t i = 0; i < size; ++i) {
const auto& val = col_from_string->get_data_at(i);
// Note: here we should handle the null element
if (val.size == 0) {
col_to->insert_default();
// empty string('') is an invalid format for complex type,
set null_map to 1
- if (is_complex_type(data_type_to)) {
+ if (is_complex) {
(*vec_null_map_to)[i] = 1;
}
continue;
@@ -1168,7 +1164,6 @@ using FunctionToFloat32 =
using FunctionToFloat64 =
FunctionConvert<DataTypeFloat64, NameToFloat64,
ToNumberMonotonicity<Float64>>;
-using FunctionToTime = FunctionConvert<DataTypeTime, NameToFloat64,
ToNumberMonotonicity<Float64>>;
using FunctionToTimeV2 =
FunctionConvert<DataTypeTimeV2, NameToFloat64,
ToNumberMonotonicity<Float64>>;
using FunctionToString = FunctionConvert<DataTypeString, NameToString,
ToStringMonotonicity>;
@@ -1266,10 +1261,6 @@ struct FunctionTo<DataTypeDateTimeV2> {
using Type = FunctionToDateTimeV2;
};
template <>
-struct FunctionTo<DataTypeTime> {
- using Type = FunctionToTime;
-};
-template <>
struct FunctionTo<DataTypeTimeV2> {
using Type = FunctionToTimeV2;
};
@@ -1706,7 +1697,7 @@ private:
const DataTypeHLL& to_type) const {
/// Conversion from String through parsing.
if (check_and_get_data_type<DataTypeString>(from_type_untyped.get())) {
- return &ConvertImplGenericFromString<ColumnString>::execute;
+ return &ConvertImplGenericFromString::execute;
}
//TODO if from is not string, it must be HLL?
@@ -1725,7 +1716,7 @@ private:
const DataTypeArray& to_type) const {
/// Conversion from String through parsing.
if (check_and_get_data_type<DataTypeString>(from_type_untyped.get())) {
- return &ConvertImplGenericFromString<ColumnString>::execute;
+ return &ConvertImplGenericFromString::execute;
}
const auto* from_type =
check_and_get_data_type<DataTypeArray>(from_type_untyped.get());
@@ -1833,7 +1824,7 @@ private:
case TypeIndex::Float64:
return &ConvertImplNumberToJsonb<ColumnFloat64>::execute;
case TypeIndex::String:
- return &ConvertImplGenericFromString<ColumnString>::execute;
+ return &ConvertImplGenericFromString::execute;
default:
return &ConvertImplGenericToJsonb::execute;
}
@@ -1843,7 +1834,7 @@ private:
WrapperType create_map_wrapper(const DataTypePtr& from_type, const
DataTypeMap& to_type) const {
switch (from_type->get_type_id()) {
case TypeIndex::String:
- return &ConvertImplGenericFromString<ColumnString>::execute;
+ return &ConvertImplGenericFromString::execute;
default:
return create_unsupport_wrapper(from_type->get_name(),
to_type.get_name());
}
@@ -1870,7 +1861,7 @@ private:
const DataTypeStruct& to_type) const {
// support CAST AS Struct from string
if (from_type->get_type_id() == TypeIndex::String) {
- return &ConvertImplGenericFromString<ColumnString>::execute;
+ return &ConvertImplGenericFromString::execute;
}
// only support CAST AS Struct from struct or string types
@@ -2072,7 +2063,6 @@ private:
std::is_same_v<ToDataType, DataTypeDateTime> ||
std::is_same_v<ToDataType, DataTypeDateV2> ||
std::is_same_v<ToDataType, DataTypeDateTimeV2> ||
- std::is_same_v<ToDataType, DataTypeTime> ||
std::is_same_v<ToDataType, DataTypeTimeV2>) {
ret = create_wrapper(from_type,
check_and_get_data_type<ToDataType>(to_type.get()),
requested_result_is_nullable);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
index bbc9b7d892..9e2733f08f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
@@ -250,6 +250,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.RoundBankers;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Rpad;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Rtrim;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.RunningDifference;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.SecToTime;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Second;
import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondFloor;
@@ -304,6 +305,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Substring;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.SubstringIndex;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Tan;
import org.apache.doris.nereids.trees.expressions.functions.scalar.TimeDiff;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.TimeToSec;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Timestamp;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToBase64;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToBitmap;
@@ -591,12 +593,14 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(SecondsAdd.class, "seconds_add"),
scalar(SecondsDiff.class, "seconds_diff"),
scalar(SecondsSub.class, "seconds_sub"),
+ scalar(SecToTime.class, "sec_to_time"),
scalar(Sign.class, "sign"),
scalar(Sin.class, "sin"),
scalar(Size.class, "size"),
scalar(Sleep.class, "sleep"),
scalar(Sm3.class, "sm3"),
- scalar(Sm3sum.class, "sm3sum"),
+ scalar(Sm3sum.class,
+ "sm3sum"),
scalar(Sm4Decrypt.class, "sm4_decrypt"),
scalar(Sm4DecryptV2.class, "sm4_decrypt_v2"),
scalar(Sm4Encrypt.class, "sm4_encrypt"),
@@ -639,6 +643,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(SubstringIndex.class, "substring_index"),
scalar(Tan.class, "tan"),
scalar(TimeDiff.class, "timediff"),
+ scalar(TimeToSec.class, "time_to_sec"),
scalar(Timestamp.class, "timestamp"),
scalar(ToBase64.class, "to_base64"),
scalar(ToBitmap.class, "to_bitmap"),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecToTime.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecToTime.java
new file mode 100644
index 0000000000..b13dd62f49
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecToTime.java
@@ -0,0 +1,68 @@
+// 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.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
+import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.TimeType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'sec_to_time'.
+ */
+public class SecToTime extends ScalarFunction
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(TimeType.INSTANCE).args(IntegerType.INSTANCE));
+
+ /**
+ * constructor with 1 argument.
+ */
+ public SecToTime(Expression arg) {
+ super("sec_to_time", arg);
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public SecToTime withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new SecToTime(children.get(0));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitScalarFunction(this, context);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/TimeToSec.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/TimeToSec.java
new file mode 100644
index 0000000000..26fb544e20
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/TimeToSec.java
@@ -0,0 +1,68 @@
+// 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.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
+import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.TimeType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'time_to_sec'.
+ */
+public class TimeToSec extends ScalarFunction
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(IntegerType.INSTANCE).args(TimeType.INSTANCE));
+
+ /**
+ * constructor with 1 argument.
+ */
+ public TimeToSec(Expression arg) {
+ super("time_to_sec", arg);
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public TimeToSec withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new TimeToSec(children.get(0));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitScalarFunction(this, context);
+ }
+}
diff --git a/regression-test/suites/correctness/test_time_function.groovy
b/regression-test/suites/correctness/test_time_function.groovy
index 77a4f9be8a..c8e88af585 100644
--- a/regression-test/suites/correctness/test_time_function.groovy
+++ b/regression-test/suites/correctness/test_time_function.groovy
@@ -17,7 +17,7 @@
suite("test_time_function") {
sql """
- set enable_nereids_planner=true,enable_fold_constant_by_be = false
+ set
enable_nereids_planner=true,enable_fallback_to_original_planner=false
"""
qt_select1 """
select sec_to_time(time_to_sec(cast('16:32:18' as time)));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]