You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/05/22 14:51:35 UTC

[incubator-doris] 10/13: [fix] NullPredicate should implement evaluate_vec (#9689)

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

morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git

commit e52e27ba6636640931abf97b69cc3d646e642795
Author: Yongqiang YANG <98...@users.noreply.github.com>
AuthorDate: Sun May 22 21:29:53 2022 +0800

    [fix] NullPredicate should implement evaluate_vec (#9689)
    
    select column from table where column is null
---
 be/src/olap/column_predicate.h |  5 ++++-
 be/src/olap/null_predicate.cpp | 12 ++++++++++++
 be/src/olap/null_predicate.h   |  2 ++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/be/src/olap/column_predicate.h b/be/src/olap/column_predicate.h
index 56f817d9f3..bb5f468303 100644
--- a/be/src/olap/column_predicate.h
+++ b/be/src/olap/column_predicate.h
@@ -83,7 +83,10 @@ public:
     // 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 43cfbcaab3..631eb67a86 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<ColumnNullable>(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 7b90ffbf92..f7e92d9fe4 100644
--- a/be/src/olap/null_predicate.h
+++ b/be/src/olap/null_predicate.h
@@ -53,6 +53,8 @@ public:
     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
 };


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