From 3b25e69311c711904ae09079456c39b60347bece Mon Sep 17 00:00:00 2001 From: zhangstar333 <87313068+zhangstar333@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:09:14 +0800 Subject: [PATCH] [bug](rf) fix invalid type for runtime filters when result column is const (#29851) --- be/src/vec/exprs/vruntimefilter_wrapper.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.cpp b/be/src/vec/exprs/vruntimefilter_wrapper.cpp index 968bad5fed..62ef2bbdb6 100644 --- a/be/src/vec/exprs/vruntimefilter_wrapper.cpp +++ b/be/src/vec/exprs/vruntimefilter_wrapper.cpp @@ -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(*result_column.column)) { + if (is_column_const(*result_column.column)) { + auto* constant_val = const_cast(result_column.column->get_data_at(0).data); + if (constant_val == nullptr || !*reinterpret_cast(constant_val)) { + _filtered_rows += block->rows(); + } + } else if (const auto* nullable = + check_and_get_column(*result_column.column)) { data = ((ColumnVector*)nullable->get_nested_column_ptr().get()) ->get_data() .data(); _filtered_rows += doris::simd::count_zero_num(reinterpret_cast(data), nullable->get_null_map_data().data(), block->rows()); - } else if (auto* res_col = + } else if (const auto* res_col = check_and_get_column>(*result_column.column)) { data = const_cast(res_col->get_data().data()); _filtered_rows += doris::simd::count_zero_num(reinterpret_cast(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);