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