This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new 3bfc2b1c091 [refine](type)use new type dispatch (#56990) (#66762)
3bfc2b1c091 is described below
commit 3bfc2b1c0912715789bc2c6e5692dc9316617aa5
Author: Mryange <[email protected]>
AuthorDate: Sun Aug 16 07:52:35 2026 +0800
[refine](type)use new type dispatch (#56990) (#66762)
before
```
case TYPE_DATE:
case TYPE_DATETIME:
case TYPE_DATEV2:
case TYPE_DATETIMEV2:
case TYPE_BOOLEAN:
case TYPE_TINYINT:
```
now
```
dispatch_switch_scalar(left_element_type->get_primitive_type(), call));
```
(cherry picked from commit af9fb9d82e4c63cbaaa5cba6a6b5315fad02c568)
### What problem does this PR solve?
Issue Number: close #xxx
Related PR: #xxx
Problem Summary:
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [ ] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
---
.../function/array/function_array_contains_all.cpp | 130 ++-----------
.../exprs/function/array/function_array_distinct.h | 75 +-------
.../exprs/function/array/function_array_element.h | 103 +----------
.../array/function_array_enumerate_uniq.cpp | 77 ++------
.../exprs/function/array/function_array_remove.h | 75 +-------
.../exprs/function/array/function_arrays_overlap.h | 120 ++----------
be/src/exprs/function/function_map.cpp | 1 -
be/src/exprs/function/functions_comparison.h | 19 +-
be/src/exprs/function/if.cpp | 18 +-
be/src/exprs/function/least_greast.cpp | 204 ++-------------------
10 files changed, 106 insertions(+), 716 deletions(-)
diff --git a/be/src/exprs/function/array/function_array_contains_all.cpp
b/be/src/exprs/function/array/function_array_contains_all.cpp
index 8063aa1cab5..cd675d1296c 100644
--- a/be/src/exprs/function/array/function_array_contains_all.cpp
+++ b/be/src/exprs/function/array/function_array_contains_all.cpp
@@ -68,7 +68,6 @@ public:
unpack_if_const(block.get_by_position(arguments[1]).column);
ColumnArrayExecutionData left_exec_data;
ColumnArrayExecutionData right_exec_data;
- Status ret = Status::OK();
// extract array column
if (!extract_column_array_info(*left_column, left_exec_data) ||
@@ -87,120 +86,29 @@ public:
auto array_type =
remove_nullable(block.get_by_position(arguments[0]).type);
auto left_element_type = remove_nullable(
assert_cast<const
DataTypeArray*>(array_type.get())->get_nested_type());
- switch (left_element_type->get_primitive_type()) {
- case TYPE_STRING:
- case TYPE_CHAR:
- case TYPE_VARCHAR:
- ret = _execute_internal<ColumnString>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_DATE:
- ret = _execute_internal<ColumnDate>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(), input_rows_count,
- left_is_const, right_is_const);
- break;
- case TYPE_DATETIME:
- ret = _execute_internal<ColumnDateTime>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_DATEV2:
- ret = _execute_internal<ColumnDateV2>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_DATETIMEV2:
- ret = _execute_internal<ColumnDateTimeV2>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_BOOLEAN:
- ret = _execute_internal<ColumnUInt8>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_TINYINT:
- ret = _execute_internal<ColumnInt8>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(), input_rows_count,
- left_is_const, right_is_const);
- break;
- case TYPE_SMALLINT:
- ret = _execute_internal<ColumnInt16>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_INT:
- ret = _execute_internal<ColumnInt32>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_BIGINT:
- ret = _execute_internal<ColumnInt64>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_LARGEINT:
- ret = _execute_internal<ColumnInt128>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_FLOAT:
- ret = _execute_internal<ColumnFloat32>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_DOUBLE:
- ret = _execute_internal<ColumnFloat64>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data(),
- input_rows_count,
left_is_const, right_is_const);
- break;
- case TYPE_DECIMAL32:
- ret = _execute_internal<ColumnDecimal32>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_DECIMAL64:
- ret = _execute_internal<ColumnDecimal64>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_DECIMAL128I:
- ret = _execute_internal<ColumnDecimal128V3>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_DECIMALV2:
- ret = _execute_internal<ColumnDecimal128V2>(
- left_exec_data, right_exec_data, dst_null_map_data,
- dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
- right_is_const);
- break;
- case TYPE_DECIMAL256:
- ret = _execute_internal<ColumnDecimal256>(
+
+ Status status = Status::OK();
+ auto call = [&](const auto& type) -> bool {
+ using DataType = std::decay_t<decltype(type)>;
+ status = _execute_internal<typename DataType::ColumnType>(
left_exec_data, right_exec_data, dst_null_map_data,
dst_nested_col->get_data().data(), input_rows_count,
left_is_const,
right_is_const);
- break;
- default:
- ret = Status::RuntimeError(
- fmt::format("execute failed about function {}, the
argument not support {} ",
- get_name(),
block.get_by_position(arguments[0]).type->get_name()));
- }
- if (ret.ok()) {
- block.replace_by_position(result, std::move(dst_nested_col));
+ return true;
+ };
+
+ if (!dispatch_switch_all(left_element_type->get_primitive_type(),
call)) {
+ return Status::InternalError(
+ "execute failed, unsupported types for function {}({},
{})", get_name(),
+ block.get_by_position(arguments[0]).type->get_name(),
+ block.get_by_position(arguments[1]).type->get_name());
}
- return ret;
+
+ RETURN_IF_ERROR(status);
+
+ block.replace_by_position(result, std::move(dst_nested_col));
+
+ return Status::OK();
}
private:
diff --git a/be/src/exprs/function/array/function_array_distinct.h
b/be/src/exprs/function/array/function_array_distinct.h
index 8961b638827..edd0d82a45b 100644
--- a/be/src/exprs/function/array/function_array_distinct.h
+++ b/be/src/exprs/function/array/function_array_distinct.h
@@ -255,75 +255,18 @@ private:
IColumn& dest_column, ColumnArray::Offsets64&
dest_offsets,
const NullMapType* src_null_map, NullMapType*
dest_null_map,
DataTypePtr& nested_type) const {
- switch (nested_type->get_primitive_type()) {
- case TYPE_BOOLEAN:
- return _execute_number<ColumnUInt8>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_TINYINT:
- return _execute_number<ColumnInt8>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_SMALLINT:
- return _execute_number<ColumnInt16>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_INT:
- return _execute_number<ColumnInt32>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_BIGINT:
- return _execute_number<ColumnInt64>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_LARGEINT:
- return _execute_number<ColumnInt128>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_FLOAT:
- return _execute_number<ColumnFloat32>(src_column, src_offsets,
dest_column,
- dest_offsets, src_null_map,
dest_null_map);
- case TYPE_DOUBLE:
- return _execute_number<ColumnFloat64>(src_column, src_offsets,
dest_column,
- dest_offsets, src_null_map,
dest_null_map);
- case TYPE_DATE:
- return _execute_number<ColumnDate>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_DATETIME:
- return _execute_number<ColumnDateTime>(src_column, src_offsets,
dest_column,
- dest_offsets, src_null_map,
dest_null_map);
- case TYPE_DATEV2:
- return _execute_number<ColumnDateV2>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_DATETIMEV2:
- return _execute_number<ColumnDateTimeV2>(src_column, src_offsets,
dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_DECIMAL32:
- return _execute_number<ColumnDecimal32>(src_column, src_offsets,
dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_DECIMAL64:
- return _execute_number<ColumnDecimal64>(src_column, src_offsets,
dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_DECIMAL128I:
- return _execute_number<ColumnDecimal128V3>(src_column,
src_offsets, dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_DECIMALV2:
- return _execute_number<ColumnDecimal128V2>(src_column,
src_offsets, dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_DECIMAL256:
- return _execute_number<ColumnDecimal256>(src_column, src_offsets,
dest_column,
- dest_offsets,
src_null_map, dest_null_map);
- case TYPE_STRING:
- case TYPE_CHAR:
- case TYPE_VARCHAR:
+ if (is_string_type(nested_type->get_primitive_type())) {
return _execute_string(src_column, src_offsets, dest_column,
dest_offsets, src_null_map,
dest_null_map);
- case TYPE_IPV4:
- return _execute_number<ColumnIPv4>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- case TYPE_IPV6:
- return _execute_number<ColumnIPv6>(src_column, src_offsets,
dest_column, dest_offsets,
- src_null_map, dest_null_map);
- default:
- LOG(ERROR) << "Unsupported array's element type: "
- << remove_nullable(nested_type)->get_name() << " for
function "
- << this->get_name();
- return false;
}
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ return _execute_number<typename
DispatchType::ColumnType>(src_column, src_offsets,
+
dest_column, dest_offsets,
+
src_null_map, dest_null_map);
+ };
+
+ return dispatch_switch_scalar(nested_type->get_primitive_type(), call);
}
};
diff --git a/be/src/exprs/function/array/function_array_element.h
b/be/src/exprs/function/array/function_array_element.h
index c55c7182c13..9d10034bb28 100644
--- a/be/src/exprs/function/array/function_array_element.h
+++ b/be/src/exprs/function/array/function_array_element.h
@@ -472,104 +472,21 @@ private:
// we should handle array index column by-self, and array index should
not be nullable.
auto idx_col = remove_nullable(arguments[1].column);
// we should dispatch branch according to data type rather than column
type
- switch (left_element_type->get_primitive_type()) {
- case TYPE_DATE: {
- res = _execute_number<ColumnDate>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_DATETIME: {
- res = _execute_number<ColumnDateTime>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DATEV2: {
- res = _execute_number<ColumnDateV2>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_DATETIMEV2: {
- res = _execute_number<ColumnDateTimeV2>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_BOOLEAN: {
- res = _execute_number<ColumnUInt8>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_TINYINT: {
- res = _execute_number<ColumnInt8>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_SMALLINT: {
- res = _execute_number<ColumnInt16>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_INT: {
- res = _execute_number<ColumnInt32>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_BIGINT: {
- res = _execute_number<ColumnInt64>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_LARGEINT: {
- res = _execute_number<ColumnInt128>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map, dst_null_map);
- break;
- }
- case TYPE_FLOAT: {
- res = _execute_number<ColumnFloat32>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DOUBLE: {
- res = _execute_number<ColumnFloat64>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DECIMAL32: {
- res = _execute_number<ColumnDecimal32>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DECIMAL64: {
- res = _execute_number<ColumnDecimal64>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DECIMAL256: {
- res = _execute_number<ColumnDecimal256>(offsets, *nested_column,
src_null_map, *idx_col,
- nested_null_map,
dst_null_map);
- break;
- }
- case TYPE_DECIMALV2: {
- res = _execute_number<ColumnDecimal128V2>(offsets, *nested_column,
src_null_map,
- *idx_col,
nested_null_map, dst_null_map);
- break;
- }
- case TYPE_DECIMAL128I: {
- res = _execute_number<ColumnDecimal128V3>(offsets, *nested_column,
src_null_map,
- *idx_col,
nested_null_map, dst_null_map);
- break;
- }
- case TYPE_CHAR:
- case TYPE_VARCHAR:
- case TYPE_STRING: {
+
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ res = _execute_number<typename DispatchType::ColumnType>(
+ offsets, *nested_column, src_null_map, *idx_col,
nested_null_map, dst_null_map);
+ return true;
+ };
+
+ if (is_string_type(left_element_type->get_primitive_type())) {
res = _execute_string(offsets, *nested_column, src_null_map,
*idx_col, nested_null_map,
dst_null_map);
- break;
- }
- default: {
+ } else if
(!dispatch_switch_scalar(left_element_type->get_primitive_type(), call)) {
res = _execute_common(offsets, *nested_column, src_null_map,
*idx_col, nested_null_map,
dst_null_map);
}
- }
return res;
}
};
diff --git a/be/src/exprs/function/array/function_array_enumerate_uniq.cpp
b/be/src/exprs/function/array/function_array_enumerate_uniq.cpp
index 3463868bbd8..71beccd28f5 100644
--- a/be/src/exprs/function/array/function_array_enumerate_uniq.cpp
+++ b/be/src/exprs/function/array/function_array_enumerate_uniq.cpp
@@ -168,71 +168,20 @@ public:
}
auto nested_type =
assert_cast<const
DataTypeArray&>(*src_column_type).get_nested_type();
- switch (nested_type->get_primitive_type()) {
- case TYPE_BOOLEAN:
- _execute_number<ColumnUInt8>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_TINYINT:
- _execute_number<ColumnInt8>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_SMALLINT:
- _execute_number<ColumnInt16>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_INT:
- _execute_number<ColumnInt32>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_BIGINT:
- _execute_number<ColumnInt64>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_LARGEINT:
- _execute_number<ColumnInt128>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_FLOAT:
- _execute_number<ColumnFloat32>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DOUBLE:
- _execute_number<ColumnFloat64>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DATE:
- _execute_number<ColumnDate>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_DATEV2:
- _execute_number<ColumnDateV2>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DATETIME:
- _execute_number<ColumnDateTime>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DATETIMEV2:
- _execute_number<ColumnDateTimeV2>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DECIMAL32:
- _execute_number<ColumnDecimal32>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DECIMAL64:
- _execute_number<ColumnDecimal64>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DECIMAL128I:
- _execute_number<ColumnDecimal128V3>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DECIMALV2:
- _execute_number<ColumnDecimal128V2>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_DECIMAL256:
- _execute_number<ColumnDecimal256>(data_columns, *offsets,
null_map, dst_values);
- break;
- case TYPE_IPV4:
- _execute_number<ColumnIPv4>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_IPV6:
- _execute_number<ColumnIPv6>(data_columns, *offsets, null_map,
dst_values);
- break;
- case TYPE_CHAR:
- case TYPE_VARCHAR:
- case TYPE_STRING:
+
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ _execute_number<typename
DispatchType::ColumnType>(data_columns, *offsets, null_map,
+ dst_values);
+ return true;
+ };
+
+ if (is_string_type(nested_type->get_primitive_type())) {
_execute_string(data_columns, *offsets, null_map, dst_values);
- break;
- default:
- break;
+ } else if
(!dispatch_switch_scalar(nested_type->get_primitive_type(), call)) {
+ return Status::RuntimeError(fmt::format(
+ "execute failed or unsupported types for function
{}({})", get_name(),
+ block.get_by_position(arguments[0]).type->get_name()));
}
} else {
_execute_by_hash<MethodSerialized<PHHashMap<StringRef, Int64>>,
false>(
diff --git a/be/src/exprs/function/array/function_array_remove.h
b/be/src/exprs/function/array/function_array_remove.h
index 6f63af62058..09a43e7651c 100644
--- a/be/src/exprs/function/array/function_array_remove.h
+++ b/be/src/exprs/function/array/function_array_remove.h
@@ -375,74 +375,17 @@ private:
right_nested_null_map, array_null_map);
} else if (is_number(right_type->get_primitive_type()) &&
is_number(left_element_type->get_primitive_type())) {
- switch (left_element_type->get_primitive_type()) {
- case TYPE_BOOLEAN:
- res = _execute_number_expanded<ColumnUInt8>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_TINYINT:
- res = _execute_number_expanded<ColumnInt8>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_SMALLINT:
- res = _execute_number_expanded<ColumnInt16>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_INT:
- res = _execute_number_expanded<ColumnInt32>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_BIGINT:
- res = _execute_number_expanded<ColumnInt64>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_LARGEINT:
- res = _execute_number_expanded<ColumnInt128>(offsets,
*nested_column, *right_column,
- nested_null_map,
right_nested_null_map,
- array_null_map);
- break;
- case TYPE_FLOAT:
- res = _execute_number_expanded<ColumnFloat32>(
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ res = _execute_number_expanded<typename
DispatchType::ColumnType>(
offsets, *nested_column, *right_column,
nested_null_map,
right_nested_null_map, array_null_map);
- break;
- case TYPE_DOUBLE:
- res = _execute_number_expanded<ColumnFloat64>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- case TYPE_DECIMAL32:
- res = _execute_number_expanded<ColumnDecimal32>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- case TYPE_DECIMAL64:
- res = _execute_number_expanded<ColumnDecimal64>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- case TYPE_DECIMAL128I:
- res = _execute_number_expanded<ColumnDecimal128V3>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- case TYPE_DECIMALV2:
- res = _execute_number_expanded<ColumnDecimal128V2>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- case TYPE_DECIMAL256:
- res = _execute_number_expanded<ColumnDecimal256>(
- offsets, *nested_column, *right_column,
nested_null_map,
- right_nested_null_map, array_null_map);
- break;
- default:
- break;
+ return true;
+ };
+
+ if
(!dispatch_switch_number(left_element_type->get_primitive_type(), call)) {
+ throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR,
+ "not support left type " +
left_element_type->get_name());
}
} else if (is_date_v2_or_datetime_v2(right_type->get_primitive_type())
&&
is_date_v2_or_datetime_v2(left_element_type->get_primitive_type())) {
diff --git a/be/src/exprs/function/array/function_arrays_overlap.h
b/be/src/exprs/function/array/function_arrays_overlap.h
index b1eb8e22047..d71643945ca 100644
--- a/be/src/exprs/function/array/function_arrays_overlap.h
+++ b/be/src/exprs/function/array/function_arrays_overlap.h
@@ -308,112 +308,26 @@ public:
auto array_type =
remove_nullable(block.get_by_position(arguments[0]).type);
auto left_element_type = remove_nullable(
assert_cast<const
DataTypeArray*>(array_type.get())->get_nested_type());
- switch (left_element_type->get_primitive_type()) {
- case TYPE_STRING:
- case TYPE_CHAR:
- case TYPE_VARCHAR:
- ret = _execute_internal<ColumnString>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DATE:
- ret = _execute_internal<ColumnDate>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DATETIME:
- ret = _execute_internal<ColumnDateTime>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DATEV2:
- ret = _execute_internal<ColumnDateV2>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DATETIMEV2:
- ret = _execute_internal<ColumnDateTimeV2>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_BOOLEAN:
- ret = _execute_internal<ColumnUInt8>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_TINYINT:
- ret = _execute_internal<ColumnInt8>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_SMALLINT:
- ret = _execute_internal<ColumnInt16>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_INT:
- ret = _execute_internal<ColumnInt32>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_BIGINT:
- ret = _execute_internal<ColumnInt64>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_LARGEINT:
- ret = _execute_internal<ColumnInt128>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_FLOAT:
- ret = _execute_internal<ColumnFloat32>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DOUBLE:
- ret = _execute_internal<ColumnFloat64>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DECIMAL32:
- ret = _execute_internal<ColumnDecimal32>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DECIMAL64:
- ret = _execute_internal<ColumnDecimal64>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DECIMAL128I:
- ret = _execute_internal<ColumnDecimal128V3>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DECIMALV2:
- ret = _execute_internal<ColumnDecimal128V2>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_DECIMAL256:
- ret = _execute_internal<ColumnDecimal256>(left_exec_data,
right_exec_data,
- dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
-
- case TYPE_IPV4:
- ret = _execute_internal<ColumnIPv4>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- case TYPE_IPV6:
- ret = _execute_internal<ColumnIPv6>(left_exec_data,
right_exec_data, dst_null_map_data,
-
dst_nested_col->get_data().data());
- break;
- default:
- break;
- }
- if (ret.ok()) {
- block.replace_by_position(result,
ColumnNullable::create(std::move(dst_nested_col),
-
std::move(dst_null_map)));
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ ret = _execute_internal<typename DispatchType::ColumnType>(
+ left_exec_data, right_exec_data, dst_null_map_data,
+ dst_nested_col->get_data().data());
+ return true;
+ };
+
+ if (!dispatch_switch_all(left_element_type->get_primitive_type(),
call)) {
+ ret = Status::InvalidArgument("execute failed, not support type {}
in function {}",
+ left_element_type->get_name(),
get_name());
}
- return ret;
+ RETURN_IF_ERROR(ret);
+
+ block.replace_by_position(
+ result, ColumnNullable::create(std::move(dst_nested_col),
std::move(dst_null_map)));
+
+ return Status::OK();
}
private:
diff --git a/be/src/exprs/function/function_map.cpp
b/be/src/exprs/function/function_map.cpp
index 54d01931b10..242a2d62c6b 100644
--- a/be/src/exprs/function/function_map.cpp
+++ b/be/src/exprs/function/function_map.cpp
@@ -55,7 +55,6 @@
#include "exprs/function/function.h"
#include "exprs/function/simple_function_factory.h"
#include "util/simd/vstring_function.h"
-
namespace doris {
class FunctionContext;
} // namespace doris
diff --git a/be/src/exprs/function/functions_comparison.h
b/be/src/exprs/function/functions_comparison.h
index 0e5b6678ed7..96ff5f10664 100644
--- a/be/src/exprs/function/functions_comparison.h
+++ b/be/src/exprs/function/functions_comparison.h
@@ -528,19 +528,20 @@ private:
Status execute_decimal(Block& block, uint32_t result, const
ColumnWithTypeAndName& col_left,
const ColumnWithTypeAndName& col_right) const {
- auto call = [&](const auto& types) -> bool {
- using Types = std::decay_t<decltype(types)>;
- using LeftDataType = typename Types::LeftType;
- using RightDataType = typename Types::RightType;
-
- DecimalComparison<LeftDataType::PType, RightDataType::PType, Op,
false>(
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
+ DecimalComparison<DispatchType::PType, DispatchType::PType, Op,
false>(
block, result, col_left, col_right);
return true;
};
- if (!call_on_basic_types<true, false, true,
false>(col_left.type->get_primitive_type(),
-
col_right.type->get_primitive_type(),
- call)) {
+ if (col_left.type->get_primitive_type() !=
col_right.type->get_primitive_type()) {
+ return Status::RuntimeError(
+ "type of left column {} is not equal to type of right
column {}",
+ col_left.type->get_name(), col_right.type->get_name());
+ }
+
+ if (!dispatch_switch_decimal(col_right.type->get_primitive_type(),
call)) {
return Status::RuntimeError("Wrong call for {} with {} and {}",
get_name(),
col_left.type->get_name(),
col_right.type->get_name());
}
diff --git a/be/src/exprs/function/if.cpp b/be/src/exprs/function/if.cpp
index aaa37057968..7e543499ada 100644
--- a/be/src/exprs/function/if.cpp
+++ b/be/src/exprs/function/if.cpp
@@ -529,23 +529,15 @@ public:
}
Status vec_exec;
- auto can_use_vec_exec = cast_type_to_either<
- // int
- DataTypeInt8, DataTypeInt16, DataTypeInt32, DataTypeInt64,
DataTypeInt128,
- DataTypeBool,
- // flaot
- DataTypeFloat32, DataTypeFloat64,
- // date time
- DataTypeDateTimeV2, DataTypeDateV2, DataTypeTimeV2,
- // decimal
- DataTypeDecimal32, DataTypeDecimal64, DataTypeDecimal128,
DataTypeDecimal256,
- // ip
- DataTypeIPv4, DataTypeIPv6>(arg_then.type.get(), [&](const
auto& type) -> bool {
+
+ auto call = [&](const auto& type) -> bool {
using DataType = std::decay_t<decltype(type)>;
vec_exec = execute_basic_type<DataType::PType>(block, cond_col,
arg_then, arg_else,
result, vec_exec);
return true;
- });
+ };
+
+ auto can_use_vec_exec =
dispatch_switch_scalar(arg_then.type->get_primitive_type(), call);
if (can_use_vec_exec) {
return vec_exec;
} else {
diff --git a/be/src/exprs/function/least_greast.cpp
b/be/src/exprs/function/least_greast.cpp
index ec6f561db41..13558035636 100644
--- a/be/src/exprs/function/least_greast.cpp
+++ b/be/src/exprs/function/least_greast.cpp
@@ -97,201 +97,25 @@ struct CompareMultiImpl {
} else {
result_column->insert_range_from(*(cols[0]), 0,
input_rows_count);
}
- switch (data_type->get_primitive_type()) {
- case PrimitiveType::TYPE_TINYINT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_TINYINT, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_TINYINT, false>(result_column,
cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_SMALLINT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_SMALLINT, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_SMALLINT,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_INT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_INT, true>(result_column,
cols[i],
- input_rows_count);
- } else {
- insert_result_data<TYPE_INT, false>(result_column,
cols[i],
- input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_BIGINT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_BIGINT, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_BIGINT, false>(result_column,
cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_LARGEINT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_LARGEINT, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_LARGEINT,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_FLOAT: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_FLOAT, true>(result_column,
cols[i],
- input_rows_count);
- } else {
- insert_result_data<TYPE_FLOAT, false>(result_column,
cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DOUBLE: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DOUBLE, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DOUBLE, false>(result_column,
cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DECIMAL32: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DECIMAL32,
true>(result_column, cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DECIMAL32,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DECIMAL64: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DECIMAL64,
true>(result_column, cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DECIMAL64,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DECIMALV2: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DECIMALV2,
true>(result_column, cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DECIMALV2,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DECIMAL128I: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DECIMAL128I,
true>(result_column, cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DECIMAL128I,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DECIMAL256: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DECIMAL256,
true>(result_column, cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DECIMAL256,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DATETIME: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DATETIME, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DATETIME,
false>(result_column, cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DATE: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DATE, true>(result_column,
cols[i],
- input_rows_count);
- } else {
- insert_result_data<TYPE_DATE, false>(result_column,
cols[i],
- input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DATEV2: {
- for (int i = 1; i < arguments.size(); ++i) {
- if (col_const[i]) {
- insert_result_data<TYPE_DATEV2, true>(result_column,
cols[i],
-
input_rows_count);
- } else {
- insert_result_data<TYPE_DATEV2, false>(result_column,
cols[i],
-
input_rows_count);
- }
- }
- break;
- }
- case PrimitiveType::TYPE_DATETIMEV2: {
+
+ auto call = [&](const auto& type) -> bool {
+ using DispatchType = std::decay_t<decltype(type)>;
for (int i = 1; i < arguments.size(); ++i) {
if (col_const[i]) {
- insert_result_data<TYPE_DATETIMEV2,
true>(result_column, cols[i],
-
input_rows_count);
+ insert_result_data<DispatchType::PType,
true>(result_column, cols[i],
+
input_rows_count);
} else {
- insert_result_data<TYPE_DATETIMEV2,
false>(result_column, cols[i],
-
input_rows_count);
+ insert_result_data<DispatchType::PType,
false>(result_column, cols[i],
+
input_rows_count);
}
}
- break;
- }
- default:
- break;
+
+ return true;
+ };
+
+ if (!dispatch_switch_scalar(data_type->get_primitive_type(),
call)) {
+ throw doris::Exception(ErrorCode::INTERNAL_ERROR, "not support
type {}",
+ data_type->get_name());
}
}
return result_column;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]