Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 19 additions & 111 deletions be/src/exprs/function/array/function_array_contains_all.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ class FunctionArrayContainsAll : public IFunction {
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) ||
Expand All @@ -87,120 +86,29 @@ class FunctionArrayContainsAll : public IFunction {
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:
Expand Down
75 changes: 9 additions & 66 deletions be/src/exprs/function/array/function_array_distinct.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,75 +255,18 @@ class FunctionArrayDistinct : public IFunction {
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);
}
};

Expand Down
103 changes: 10 additions & 93 deletions be/src/exprs/function/array/function_array_element.h
Original file line number Diff line number Diff line change
Expand Up @@ -472,104 +472,21 @@ class FunctionArrayElement : public IFunction {
// 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;
}
};
Expand Down
Loading
Loading