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 2b715924c51 [Chore](function) set normal function 
use_default_implementation_for_constants to default (#27891)
2b715924c51 is described below

commit 2b715924c515b9a8e2d430d487befacec7d3a598
Author: Pxl <pxl...@qq.com>
AuthorDate: Mon Dec 4 14:19:25 2023 +0800

    [Chore](function) set normal function 
use_default_implementation_for_constants to default (#27891)
    
    set normal function use_default_implementation_for_constants to default
---
 be/src/vec/functions/function.h                    | 11 -------
 be/src/vec/functions/function_agg_state.h          |  1 -
 be/src/vec/functions/function_cast.h               |  6 ----
 .../function_date_or_datetime_to_something.h       |  2 --
 be/src/vec/functions/function_fake.h               |  1 +
 be/src/vec/functions/function_json.cpp             |  1 -
 be/src/vec/functions/function_multi_same_args.h    |  2 --
 be/src/vec/functions/function_string.h             | 34 ++++++++--------------
 be/src/vec/functions/function_struct_element.cpp   |  2 --
 be/src/vec/functions/function_unary_arithmetic.h   |  2 --
 be/src/vec/functions/least_greast.cpp              | 18 +++++++-----
 .../functions/scalar/SubstringIndex.java           | 11 +++++++
 12 files changed, 34 insertions(+), 57 deletions(-)

diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h
index a768fa1ed13..63cf78c417c 100644
--- a/be/src/vec/functions/function.h
+++ b/be/src/vec/functions/function.h
@@ -238,13 +238,6 @@ public:
 
     virtual bool is_deterministic_in_scope_of_query() const = 0;
 
-    /** Lets you know if the function is monotonic in a range of values.
-      * This is used to work with the index in a sorted chunk of data.
-      * And allows to use the index not only when it is written, for example 
`date >= const`, but also, for example, `toMonth(date) >= 11`.
-      * All this is considered only for functions of one argument.
-      */
-    virtual bool has_information_about_monotonicity() const { return false; }
-
     virtual bool is_use_default_implementation_for_constants() const = 0;
 
     /// The property of monotonicity for a certain range.
@@ -583,10 +576,6 @@ public:
         return function->is_deterministic_in_scope_of_query();
     }
 
-    bool has_information_about_monotonicity() const override {
-        return function->has_information_about_monotonicity();
-    }
-
     IFunctionBase::Monotonicity get_monotonicity_for_range(const IDataType& 
type, const Field& left,
                                                            const Field& right) 
const override {
         return function->get_monotonicity_for_range(type, left, right);
diff --git a/be/src/vec/functions/function_agg_state.h 
b/be/src/vec/functions/function_agg_state.h
index 8d28e0da1e0..b17e8916d0e 100644
--- a/be/src/vec/functions/function_agg_state.h
+++ b/be/src/vec/functions/function_agg_state.h
@@ -52,7 +52,6 @@ public:
 
     size_t get_number_of_arguments() const override { return 
_argument_types.size(); }
 
-    bool use_default_implementation_for_constants() const override { return 
true; }
     bool use_default_implementation_for_nulls() const override { return false; 
}
 
     String get_name() const override { return fmt::format("{}_state", 
_agg_function->get_name()); }
diff --git a/be/src/vec/functions/function_cast.h 
b/be/src/vec/functions/function_cast.h
index 1a24595b2d0..562fd7a1f66 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -1291,8 +1291,6 @@ public:
         }
     }
 
-    bool has_information_about_monotonicity() const override { return 
Monotonic::has(); }
-
     Monotonicity get_monotonicity_for_range(const IDataType& type, const 
Field& left,
                                             const Field& right) const override 
{
         return Monotonic::get(type, left, right);
@@ -1699,10 +1697,6 @@ public:
     bool is_deterministic() const override { return true; }
     bool is_deterministic_in_scope_of_query() const override { return true; }
 
-    bool has_information_about_monotonicity() const override {
-        return static_cast<bool>(monotonicity_for_range);
-    }
-
     Monotonicity get_monotonicity_for_range(const IDataType& type, const 
Field& left,
                                             const Field& right) const override 
{
         return monotonicity_for_range(type, left, right);
diff --git a/be/src/vec/functions/function_date_or_datetime_to_something.h 
b/be/src/vec/functions/function_date_or_datetime_to_something.h
index 200cd606c23..e711ad7b005 100644
--- a/be/src/vec/functions/function_date_or_datetime_to_something.h
+++ b/be/src/vec/functions/function_date_or_datetime_to_something.h
@@ -97,8 +97,6 @@ public:
                                      Transform>::execute(block, arguments, 
result,
                                                          input_rows_count);
     }
-
-    bool has_information_about_monotonicity() const override { return true; }
 };
 
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/function_fake.h 
b/be/src/vec/functions/function_fake.h
index 2f32fd146b3..0dabdfb3c83 100644
--- a/be/src/vec/functions/function_fake.h
+++ b/be/src/vec/functions/function_fake.h
@@ -54,6 +54,7 @@ public:
     }
 
     bool use_default_implementation_for_nulls() const override { return true; }
+
     bool use_default_implementation_for_constants() const override { return 
false; }
 
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
diff --git a/be/src/vec/functions/function_json.cpp 
b/be/src/vec/functions/function_json.cpp
index 9eb50ec7759..03bd03c52e6 100644
--- a/be/src/vec/functions/function_json.cpp
+++ b/be/src/vec/functions/function_json.cpp
@@ -892,7 +892,6 @@ public:
     String get_name() const override { return name; }
     size_t get_number_of_arguments() const override { return 0; }
     bool is_variadic() const override { return true; }
-    bool use_default_implementation_for_constants() const override { return 
true; }
     DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
         return make_nullable(std::make_shared<DataTypeString>());
     }
diff --git a/be/src/vec/functions/function_multi_same_args.h 
b/be/src/vec/functions/function_multi_same_args.h
index a0cd4e01edf..0c45c7cd446 100644
--- a/be/src/vec/functions/function_multi_same_args.h
+++ b/be/src/vec/functions/function_multi_same_args.h
@@ -36,8 +36,6 @@ public:
 
     bool use_default_implementation_for_nulls() const override { return true; }
 
-    bool use_default_implementation_for_constants() const override { return 
false; }
-
     bool is_variadic() const override { return true; }
 
     size_t get_number_of_arguments() const override { return 0; }
diff --git a/be/src/vec/functions/function_string.h 
b/be/src/vec/functions/function_string.h
index b2508decf72..0c67d835614 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -1562,8 +1562,6 @@ public:
 
     bool use_default_implementation_for_nulls() const override { return true; }
 
-    bool use_default_implementation_for_constants() const override { return 
false; }
-
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
                         size_t result, size_t input_rows_count) const override 
{
         DCHECK_EQ(arguments.size(), 3);
@@ -1576,9 +1574,10 @@ public:
         auto& res_offsets = res->get_offsets();
         auto& res_chars = res->get_chars();
         res_offsets.resize(input_rows_count);
-
-        ColumnPtr content_column =
-                
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
+        ColumnPtr content_column;
+        bool content_const = false;
+        std::tie(content_column, content_const) =
+                unpack_if_const(block.get_by_position(arguments[0]).column);
 
         if (auto* nullable = check_and_get_column<const 
ColumnNullable>(*content_column)) {
             // Danger: Here must dispose the null map data first! Because
@@ -1588,25 +1587,16 @@ public:
             content_column = nullable->get_nested_column_ptr();
         }
 
-        for (size_t i = 1; i <= 2; i++) {
-            ColumnPtr columnPtr = 
remove_nullable(block.get_by_position(arguments[i]).column);
-
-            if (!is_column_const(*columnPtr)) {
-                return Status::RuntimeError("Argument at index {} for function 
{} must be constant",
-                                            i + 1, get_name());
-            }
-        }
-
         auto str_col = assert_cast<const ColumnString*>(content_column.get());
 
-        const IColumn& delimiter_col = 
*block.get_by_position(arguments[1]).column;
-        const auto* delimiter_const = typeid_cast<const 
ColumnConst*>(&delimiter_col);
-        auto delimiter = delimiter_const->get_field().get<String>();
-        int32_t delimiter_size = delimiter.size();
+        [[maybe_unused]] const auto& [delimiter_col, delimiter_const] =
+                unpack_if_const(block.get_by_position(arguments[1]).column);
+        auto delimiter = delimiter_col->get_data_at(0);
+        int32_t delimiter_size = delimiter.size;
 
-        const IColumn& part_num_col = 
*block.get_by_position(arguments[2]).column;
-        const auto* part_num_col_const = typeid_cast<const 
ColumnConst*>(&part_num_col);
-        auto part_number = part_num_col_const->get_field().get<Int32>();
+        [[maybe_unused]] const auto& [part_num_col, part_const] =
+                unpack_if_const(block.get_by_position(arguments[2]).column);
+        auto part_number = *((int*)part_num_col->get_data_at(0).data);
 
         if (part_number == 0 || delimiter_size == 0) {
             for (size_t i = 0; i < input_rows_count; ++i) {
@@ -1622,7 +1612,7 @@ public:
                     while (num < part_number) {
                         size_t n = str.size - offset - 1;
                         const char* pos = reinterpret_cast<const char*>(
-                                memchr(str.data + offset + 1, delimiter[0], 
n));
+                                memchr(str.data + offset + 1, 
delimiter.data[0], n));
                         if (pos != nullptr) {
                             offset = pos - str.data;
                             num++;
diff --git a/be/src/vec/functions/function_struct_element.cpp 
b/be/src/vec/functions/function_struct_element.cpp
index 0a9e71a348d..8c66386cd90 100644
--- a/be/src/vec/functions/function_struct_element.cpp
+++ b/be/src/vec/functions/function_struct_element.cpp
@@ -49,8 +49,6 @@ public:
 
     bool use_default_implementation_for_nulls() const override { return true; }
 
-    bool use_default_implementation_for_constants() const override { return 
true; }
-
     size_t get_number_of_arguments() const override { return 2; }
 
     ColumnNumbers get_arguments_that_are_always_constant() const override { 
return {1}; }
diff --git a/be/src/vec/functions/function_unary_arithmetic.h 
b/be/src/vec/functions/function_unary_arithmetic.h
index 51aabb9a803..8d18129a048 100644
--- a/be/src/vec/functions/function_unary_arithmetic.h
+++ b/be/src/vec/functions/function_unary_arithmetic.h
@@ -146,8 +146,6 @@ public:
         }
         return Status::OK();
     }
-
-    bool has_information_about_monotonicity() const override { return false; }
 };
 
 struct PositiveMonotonicity {
diff --git a/be/src/vec/functions/least_greast.cpp 
b/be/src/vec/functions/least_greast.cpp
index be35504d838..4c008da67f9 100644
--- a/be/src/vec/functions/least_greast.cpp
+++ b/be/src/vec/functions/least_greast.cpp
@@ -186,13 +186,14 @@ struct FunctionFieldImpl {
         WhichDataType which(data_type);
         //TODO: maybe could use hashmap to save column data, not use for loop 
ervey time to test equals.
         if (which.is_string_or_fixed_string()) {
-            const auto& column_string = reinterpret_cast<const 
ColumnString&>(*argument_columns[0]);
+            const auto& column_string = assert_cast<const 
ColumnString&>(*argument_columns[0]);
             for (int row = 0; row < input_rows_count; ++row) {
                 const auto& str_data = 
column_string.get_data_at(index_check_const(row, arg_const));
                 for (int col = 1; col < column_size; ++col) {
-                    const auto& temp_data =
-                            reinterpret_cast<const 
ColumnConst&>(*argument_columns[col])
-                                    .get_data_at(0);
+                    auto [column, is_const] =
+                            
unpack_if_const(block.safe_get_by_position(col).column);
+                    const auto& temp_data = assert_cast<const 
ColumnString&>(*column).get_data_at(
+                            index_check_const(row, is_const));
                     if (EqualsOp<StringRef, StringRef>::apply(temp_data, 
str_data)) {
                         res_data[row] = col;
                         break;
@@ -229,12 +230,13 @@ private:
     static void insert_result_data(PaddedPODArray<Int32>& __restrict res_data,
                                    ColumnPtr first_column, ColumnPtr 
argument_column,
                                    const size_t input_rows_count, const int 
col) {
+        auto [first_column_raw, first_column_is_const] = 
unpack_if_const(first_column);
         auto* __restrict first_raw_data =
-                reinterpret_cast<const 
ColumnType*>(first_column.get())->get_data().data();
-        const auto& column_raw_data =
-                reinterpret_cast<const 
ColumnConst&>(*argument_column).get_data_column();
+                assert_cast<const 
ColumnType*>(first_column_raw.get())->get_data().data();
+
+        auto [argument_column_raw, argument_column_is_const] = 
unpack_if_const(argument_column);
         const auto& arg_data =
-                reinterpret_cast<const 
ColumnType&>(column_raw_data).get_data().data()[0];
+                assert_cast<const 
ColumnType&>(*argument_column_raw).get_data().data()[0];
         if constexpr (std::is_same_v<ColumnType, ColumnDecimal128>) {
             for (size_t i = 0; i < input_rows_count; ++i) {
                 res_data[i] |= (!res_data[i] *
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SubstringIndex.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SubstringIndex.java
index 22f59905f30..5374950135c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SubstringIndex.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SubstringIndex.java
@@ -18,6 +18,7 @@
 package org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
@@ -52,6 +53,16 @@ public class SubstringIndex extends ScalarFunction
         super("substring_index", arg0, arg1, arg2);
     }
 
+    @Override
+    public void checkLegalityBeforeTypeCoercion() {
+        for (int i = 1; i < children.size(); ++i) {
+            if (!getArgument(i).isConstant()) {
+                throw new AnalysisException(getName()
+                        + " function except for the first argument, other 
parameter must be a constant.");
+            }
+        }
+    }
+
     /**
      * withChildren.
      */


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to