diff --git a/be/src/vec/columns/column_nullable.cpp b/be/src/vec/columns/column_nullable.cpp index 69634effb4d221..a05479ef8762cf 100644 --- a/be/src/vec/columns/column_nullable.cpp +++ b/be/src/vec/columns/column_nullable.cpp @@ -189,7 +189,8 @@ ColumnPtr ColumnNullable::filter(const Filter& filt, ssize_t result_size_hint) c } Status ColumnNullable::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) { - const ColumnNullable* nullable_col_ptr = reinterpret_cast(col_ptr); + const ColumnNullable* nullable_col_ptr = check_and_get_column(col_ptr); + DCHECK(nullable_col_ptr != nullptr); ColumnPtr nest_col_ptr = nullable_col_ptr->nested_column; ColumnPtr null_map_ptr = nullable_col_ptr->null_map; RETURN_IF_ERROR(get_nested_column().filter_by_selector(sel, sel_size, const_cast(nest_col_ptr.get()))); diff --git a/be/src/vec/core/block.h b/be/src/vec/core/block.h index 94dd5ec8e9fd0e..19a20e8bb20055 100644 --- a/be/src/vec/core/block.h +++ b/be/src/vec/core/block.h @@ -121,14 +121,17 @@ class Block { raw_res_ptr->reserve(batch_size); // adapt for outer join change column to nullable - if (raw_res_ptr->is_nullable()) { + if (raw_res_ptr->is_nullable() && input_col_ptr->is_nullable()) { + return input_col_ptr->filter_by_selector(sel_rowid_idx, select_size, raw_res_ptr); + } else if (raw_res_ptr->is_nullable()) { auto col_ptr_nullable = reinterpret_cast(raw_res_ptr.get()); col_ptr_nullable->get_null_map_column().insert_many_defaults(select_size); raw_res_ptr = col_ptr_nullable->get_nested_column_ptr(); + return input_col_ptr->filter_by_selector(sel_rowid_idx, select_size, raw_res_ptr); + } else { + return Status::InternalError("unexpected input/output type in block.copy_column_data_to_block"); } - - return input_col_ptr->filter_by_selector(sel_rowid_idx, select_size, raw_res_ptr); } void replace_by_position(size_t position, ColumnPtr&& res) {