[bug](rf) fix invalid type for runtime filters when result column is const (#29851)

This commit is contained in:
zhangstar333
2024-01-12 09:09:14 +08:00
committed by yiguolei
parent 2a77858845
commit 3b25e69311

View File

@ -25,6 +25,7 @@
#include "util/simd/bits.h"
#include "vec/columns/column.h"
#include "vec/columns/column_const.h"
#include "vec/columns/column_nullable.h"
#include "vec/columns/column_vector.h"
#include "vec/core/block.h"
@ -82,20 +83,29 @@ Status VRuntimeFilterWrapper::execute(VExprContext* context, Block* block, int*
RETURN_IF_ERROR(_impl->execute(context, block, result_column_id));
uint8_t* data = nullptr;
const ColumnWithTypeAndName& result_column = block->get_by_position(*result_column_id);
if (auto* nullable = check_and_get_column<ColumnNullable>(*result_column.column)) {
if (is_column_const(*result_column.column)) {
auto* constant_val = const_cast<char*>(result_column.column->get_data_at(0).data);
if (constant_val == nullptr || !*reinterpret_cast<bool*>(constant_val)) {
_filtered_rows += block->rows();
}
} else if (const auto* nullable =
check_and_get_column<ColumnNullable>(*result_column.column)) {
data = ((ColumnVector<UInt8>*)nullable->get_nested_column_ptr().get())
->get_data()
.data();
_filtered_rows += doris::simd::count_zero_num(reinterpret_cast<const int8_t*>(data),
nullable->get_null_map_data().data(),
block->rows());
} else if (auto* res_col =
} else if (const auto* res_col =
check_and_get_column<ColumnVector<UInt8>>(*result_column.column)) {
data = const_cast<uint8_t*>(res_col->get_data().data());
_filtered_rows += doris::simd::count_zero_num(reinterpret_cast<const int8_t*>(data),
block->rows());
} else {
return Status::InternalError("Invalid type for runtime filters!");
return Status::InternalError(
"Invalid type for runtime filters!, and _expr_name is: {}. _data_type is: {}. "
"result_column_id is: {}. block structure: {}.",
_expr_name, _data_type->get_name(), *result_column_id, block->dump_structure());
}
calculate_filter(_filtered_rows, _scan_rows, _has_calculate_filter, _always_true);