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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]