From 0252ba6fb92c12d6778d2a0b31e2671f43d9eb33 Mon Sep 17 00:00:00 2001 From: Yi WU Date: Thu, 19 May 2022 19:19:37 +0800 Subject: [PATCH 1/3] NullPredicate should implement evaluate_vec select column from table where column is null --- be/src/olap/column_predicate.h | 5 ++++- be/src/olap/null_predicate.cpp | 13 +++++++++++++ be/src/olap/null_predicate.h | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) 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..e0646cc3b83111 100644 --- a/be/src/olap/null_predicate.cpp +++ b/be/src/olap/null_predicate.cpp @@ -165,4 +165,17 @@ 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); + } + return; + } + 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 }; From aacd320827acb07949fbe18e0d0b0b73820c50b5 Mon Sep 17 00:00:00 2001 From: Yi WU Date: Thu, 19 May 2022 19:31:21 +0800 Subject: [PATCH 2/3] clang format --- be/src/olap/null_predicate.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/be/src/olap/null_predicate.cpp b/be/src/olap/null_predicate.cpp index e0646cc3b83111..52a1b8ac0c2968 100644 --- a/be/src/olap/null_predicate.cpp +++ b/be/src/olap/null_predicate.cpp @@ -166,7 +166,6 @@ void NullPredicate::evaluate_and(IColumn& column, uint16_t* sel, uint16_t 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(); From 18c6696c3a226b38ef41187bad6ec340636a5a27 Mon Sep 17 00:00:00 2001 From: Yi WU Date: Fri, 20 May 2022 15:10:54 +0800 Subject: [PATCH 3/3] use eles rather if return --- be/src/olap/null_predicate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/src/olap/null_predicate.cpp b/be/src/olap/null_predicate.cpp index 52a1b8ac0c2968..160e49ebe8344c 100644 --- a/be/src/olap/null_predicate.cpp +++ b/be/src/olap/null_predicate.cpp @@ -172,9 +172,9 @@ void NullPredicate::evaluate_vec(vectorized::IColumn& column, uint16_t size, boo for (uint16_t i = 0; i < size; ++i) { flags[i] = (null_map[i] == _is_null); } - return; + } else { + if (_is_null) memset(flags, false, size); } - if (_is_null) memset(flags, false, size); } } //namespace doris