diff --git a/be/src/olap/column_predicate.h b/be/src/olap/column_predicate.h index 7aa321831426ca..7de6d1b6eb839f 100644 --- a/be/src/olap/column_predicate.h +++ b/be/src/olap/column_predicate.h @@ -82,7 +82,10 @@ class ColumnPredicate { // used to evaluate pre read column in lazy matertialization // now only support integer/float // a vectorized eval way - virtual void evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) const {}; + virtual void evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) const { + DCHECK(false) << "should not reach here"; + } + uint32_t column_id() const { return _column_id; } protected: diff --git a/be/src/olap/null_predicate.cpp b/be/src/olap/null_predicate.cpp index 1210e1f4396730..160e49ebe8344c 100644 --- a/be/src/olap/null_predicate.cpp +++ b/be/src/olap/null_predicate.cpp @@ -165,4 +165,16 @@ void NullPredicate::evaluate_and(IColumn& column, uint16_t* sel, uint16_t size, if (_is_null) memset(flags, false, size); } } + +void NullPredicate::evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) const { + if (auto* nullable = check_and_get_column(column)) { + auto& null_map = nullable->get_null_map_data(); + for (uint16_t i = 0; i < size; ++i) { + flags[i] = (null_map[i] == _is_null); + } + } else { + if (_is_null) memset(flags, false, size); + } +} + } //namespace doris diff --git a/be/src/olap/null_predicate.h b/be/src/olap/null_predicate.h index ed78066941c906..4632b6055fa863 100644 --- a/be/src/olap/null_predicate.h +++ b/be/src/olap/null_predicate.h @@ -52,6 +52,8 @@ class NullPredicate : public ColumnPredicate { void evaluate_and(vectorized::IColumn& column, uint16_t* sel, uint16_t size, bool* flags) const override; + void evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) const override; + private: bool _is_null; //true for null, false for not null };