[bug](rf) fix invalid type for runtime filters when result column is const (#29851)
This commit is contained in:
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user