This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 3b25e69311c711904ae09079456c39b60347bece
Author: zhangstar333 <87313068+zhangstar...@users.noreply.github.com>
AuthorDate: Fri Jan 12 09:09:14 2024 +0800

    [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 968bad5fedb..62ef2bbdb64 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<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);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to