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 <59914473+mrya...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to