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

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


The following commit(s) were added to refs/heads/master by this push:
     new 00719db3a2 [bugfix]handle ComlumnDictionary in evaluate_and and 
evaluate_or (#9818)
00719db3a2 is described below

commit 00719db3a22f603345b00be9c21219a46b467078
Author: Yongqiang YANG <[email protected]>
AuthorDate: Wed Jun 1 08:10:43 2022 +0800

    [bugfix]handle ComlumnDictionary in evaluate_and and evaluate_or (#9818)
    
    * handle ColumnDictory in evaluate_or
    
    We need to handle ComlumnDictory in evaluate_or, otherwise delete handler
    would triger a core dump.
    
    * handle ComlumnDictionary in evaluate_and
    
    Because there is only one difference between evaluate_and and
    evaluate_or, that is or and delete, I merge two macros into one.
    
    Delete handlers also trigger evaluate_and, i am not sure if column
    dictionary would be used in evaluate_and.
    
    * clang format
    
    * fix short circut for evaluate_and and evaluate_or
    
    * clang format
---
 be/src/olap/comparison_predicate.cpp | 214 ++++++++++++++++-------------------
 1 file changed, 96 insertions(+), 118 deletions(-)

diff --git a/be/src/olap/comparison_predicate.cpp 
b/be/src/olap/comparison_predicate.cpp
index 44eaa4ba23..2223d1fe19 100644
--- a/be/src/olap/comparison_predicate.cpp
+++ b/be/src/olap/comparison_predicate.cpp
@@ -261,17 +261,17 @@ COMPARISON_PRED_COLUMN_EVALUATE_VEC(LessEqualPredicate, 
<=)
 COMPARISON_PRED_COLUMN_EVALUATE_VEC(GreaterPredicate, >)
 COMPARISON_PRED_COLUMN_EVALUATE_VEC(GreaterEqualPredicate, >=)
 
-#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(CLASS, OP)                    
                \
+#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(CLASS, OP, BOOL_NAME, 
BOOL_OP, SHORT_OP)    \
     template <class T>                                                         
                \
-    void CLASS<T>::evaluate_or(ColumnBlock* block, uint16_t* sel, uint16_t 
size, bool* flags)  \
-            const {                                                            
                \
+    void CLASS<T>::evaluate_##BOOL_NAME(ColumnBlock* block, uint16_t* sel, 
uint16_t size,      \
+                                        bool* flags) const {                   
                \
         if (block->is_nullable()) {                                            
                \
             for (uint16_t i = 0; i < size; ++i) {                              
                \
-                if (flags[i]) continue;                                        
                \
+                if (SHORT_OP(flags[i])) continue;                              
                \
                 uint16_t idx = sel[i];                                         
                \
                 const T* cell_value = reinterpret_cast<const 
T*>(block->cell(idx).cell_ptr()); \
                 auto result = (!block->cell(idx).is_null() && (*cell_value OP 
_value));        \
-                flags[i] |= _opposite ? !result : result;                      
                \
+                flags[i] = flags[i] BOOL_OP(_opposite ? !result : result);     
                \
             }                                                                  
                \
         } else {                                                               
                \
             for (uint16_t i = 0; i < size; ++i) {                              
                \
@@ -279,125 +279,103 @@ 
COMPARISON_PRED_COLUMN_EVALUATE_VEC(GreaterEqualPredicate, >=)
                 uint16_t idx = sel[i];                                         
                \
                 const T* cell_value = reinterpret_cast<const 
T*>(block->cell(idx).cell_ptr()); \
                 auto result = (*cell_value OP _value);                         
                \
-                flags[i] |= _opposite ? !result : result;                      
                \
+                flags[i] = flags[i] BOOL_OP(_opposite ? !result : result);     
                \
             }                                                                  
                \
         }                                                                      
                \
     }
 
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(LessPredicate, <)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_EVALUATE_OR(CLASS, OP)                          
             \
-    template <class T>                                                         
             \
-    void CLASS<T>::evaluate_or(vectorized::IColumn& column, uint16_t* sel, 
uint16_t size,   \
-                               bool* flags) const {                            
             \
-        if (column.is_nullable()) {                                            
             \
-            auto* nullable_column =                                            
             \
-                    
vectorized::check_and_get_column<vectorized::ColumnNullable>(column);   \
-            auto& data_array = reinterpret_cast<const 
vectorized::PredicateColumnType<T>&>( \
-                                       nullable_column->get_nested_column())   
             \
-                                       .get_data();                            
             \
-            auto& null_bitmap = reinterpret_cast<const 
vectorized::ColumnVector<uint8_t>&>( \
-                                        
*(nullable_column->get_null_map_column_ptr()))      \
-                                        .get_data();                           
             \
-            for (uint16_t i = 0; i < size; i++) {                              
             \
-                if (flags[i]) continue;                                        
             \
-                uint16_t idx = sel[i];                                         
             \
-                bool ret = !null_bitmap[idx] && (data_array[idx] OP _value);   
             \
-                flags[i] |= _opposite ? !ret : ret;                            
             \
-            }                                                                  
             \
-        } else {                                                               
             \
-            auto& predicate_column =                                           
             \
-                    
reinterpret_cast<vectorized::PredicateColumnType<T>&>(column);          \
-            auto& data_array = predicate_column.get_data();                    
             \
-            for (uint16_t i = 0; i < size; ++i) {                              
             \
-                if (flags[i]) continue;                                        
             \
-                uint16_t idx = sel[i];                                         
             \
-                bool ret = data_array[idx] OP _value;                          
             \
-                flags[i] |= _opposite ? !ret : ret;                            
             \
-            }                                                                  
             \
-        }                                                                      
             \
-    }
-
-COMPARISON_PRED_COLUMN_EVALUATE_OR(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(LessPredicate, <)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(CLASS, OP)                   
                \
-    template <class T>                                                         
                \
-    void CLASS<T>::evaluate_and(ColumnBlock* block, uint16_t* sel, uint16_t 
size, bool* flags) \
-            const {                                                            
                \
-        if (block->is_nullable()) {                                            
                \
-            for (uint16_t i = 0; i < size; ++i) {                              
                \
-                if (!flags[i]) continue;                                       
                \
-                uint16_t idx = sel[i];                                         
                \
-                const T* cell_value = reinterpret_cast<const 
T*>(block->cell(idx).cell_ptr()); \
-                auto result = (!block->cell(idx).is_null() && (*cell_value OP 
_value));        \
-                flags[i] &= _opposite ? !result : result;                      
                \
-            }                                                                  
                \
-        } else {                                                               
                \
-            for (uint16_t i = 0; i < size; ++i) {                              
                \
-                if (!flags[i]) continue;                                       
                \
-                uint16_t idx = sel[i];                                         
                \
-                const T* cell_value = reinterpret_cast<const 
T*>(block->cell(idx).cell_ptr()); \
-                auto result = (*cell_value OP _value);                         
                \
-                flags[i] &= _opposite ? !result : result;                      
                \
-            }                                                                  
                \
-        }                                                                      
                \
+#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(BOOL_NAME, BOOL_OP, 
SHORT_OP)                 \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(EqualPredicate, ==, BOOL_NAME, 
BOOL_OP, SHORT_OP)  \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(NotEqualPredicate, !=, 
BOOL_NAME, BOOL_OP,         \
+                                               SHORT_OP)                       
                   \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(LessPredicate, <, BOOL_NAME, 
BOOL_OP, SHORT_OP)    \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(LessEqualPredicate, <=, 
BOOL_NAME, BOOL_OP,        \
+                                               SHORT_OP)                       
                   \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(GreaterPredicate, >, BOOL_NAME, 
BOOL_OP, SHORT_OP) \
+    COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(GreaterEqualPredicate, >=, 
BOOL_NAME, BOOL_OP,     \
+                                               SHORT_OP)
+
+COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(or, |, )
+COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(and, &, !)
+
+#define COMPARISON_PRED_COLUMN_EVALUATE_BOOL(CLASS, OP, IS_RANGE, BOOL_NAME, 
BOOL_OP, SHORT_OP)    \
+    template <class T>                                                         
                    \
+    void CLASS<T>::evaluate_##BOOL_NAME(vectorized::IColumn& column, uint16_t* 
sel, uint16_t size, \
+                                        bool* flags) const {                   
                    \
+        if (column.is_nullable()) {                                            
                    \
+            auto* nullable_column =                                            
                    \
+                    
vectorized::check_and_get_column<vectorized::ColumnNullable>(column);          \
+            auto& nested_col = nullable_column->get_nested_column();           
                    \
+            auto& null_bitmap = reinterpret_cast<const 
vectorized::ColumnVector<uint8_t>&>(        \
+                                        
*(nullable_column->get_null_map_column_ptr()))             \
+                                        .get_data();                           
                    \
+            if (nested_col.is_column_dictionary()) {                           
                    \
+                if constexpr (std::is_same_v<T, StringValue>) {                
                    \
+                    auto* nested_col_ptr = vectorized::check_and_get_column<   
                    \
+                            
vectorized::ColumnDictionary<vectorized::Int32>>(nested_col);          \
+                    auto& data_array = nested_col_ptr->get_data();             
                    \
+                    auto dict_code =                                           
                    \
+                            IS_RANGE ? 
nested_col_ptr->find_code_by_bound(_value, 1 OP 0, 1 OP 1)  \
+                                     : nested_col_ptr->find_code(_value);      
                    \
+                    for (uint16_t i = 0; i < size; i++) {                      
                    \
+                        if (SHORT_OP(flags[i])) continue;                      
                    \
+                        uint16_t idx = sel[i];                                 
                    \
+                        bool ret = !null_bitmap[idx] && (data_array[idx] OP 
dict_code);            \
+                        flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret);   
                    \
+                    }                                                          
                    \
+                }                                                              
                    \
+            } else {                                                           
                    \
+                auto& data_array =                                             
                    \
+                        reinterpret_cast<const 
vectorized::PredicateColumnType<T>&>(nested_col)    \
+                                .get_data();                                   
                    \
+                for (uint16_t i = 0; i < size; i++) {                          
                    \
+                    if (SHORT_OP(flags[i])) continue;                          
                    \
+                    uint16_t idx = sel[i];                                     
                    \
+                    bool ret = !null_bitmap[idx] && (data_array[idx] OP 
_value);                   \
+                    flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret);       
                    \
+                }                                                              
                    \
+            }                                                                  
                    \
+        } else if (column.is_column_dictionary()) {                            
                    \
+            if constexpr (std::is_same_v<T, StringValue>) {                    
                    \
+                auto& dict_col =                                               
                    \
+                        
reinterpret_cast<vectorized::ColumnDictionary<vectorized::Int32>&>(        \
+                                column);                                       
                    \
+                auto& data_array = dict_col.get_data();                        
                    \
+                auto dict_code = IS_RANGE ? 
dict_col.find_code_by_bound(_value, 1 OP 0, 1 OP 1)    \
+                                          : dict_col.find_code(_value);        
                    \
+                for (uint16_t i = 0; i < size; i++) {                          
                    \
+                    if (SHORT_OP(flags[i])) continue;                          
                    \
+                    uint16_t idx = sel[i];                                     
                    \
+                    bool ret = data_array[idx] OP dict_code;                   
                    \
+                    flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret);       
                    \
+                }                                                              
                    \
+            }                                                                  
                    \
+        } else {                                                               
                    \
+            auto& predicate_column =                                           
                    \
+                    
reinterpret_cast<vectorized::PredicateColumnType<T>&>(column);                 \
+            auto& data_array = predicate_column.get_data();                    
                    \
+            for (uint16_t i = 0; i < size; ++i) {                              
                    \
+                if (SHORT_OP(flags[i])) continue;                              
                    \
+                uint16_t idx = sel[i];                                         
                    \
+                bool ret = data_array[idx] OP _value;                          
                    \
+                flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret);           
                    \
+            }                                                                  
                    \
+        }                                                                      
                    \
     }
 
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(LessPredicate, <)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_EVALUATE_AND(CLASS, OP)                         
             \
-    template <class T>                                                         
             \
-    void CLASS<T>::evaluate_and(vectorized::IColumn& column, uint16_t* sel, 
uint16_t size,  \
-                                bool* flags) const {                           
             \
-        if (column.is_nullable()) {                                            
             \
-            auto* nullable_column =                                            
             \
-                    
vectorized::check_and_get_column<vectorized::ColumnNullable>(column);   \
-            auto& data_array = reinterpret_cast<const 
vectorized::PredicateColumnType<T>&>( \
-                                       nullable_column->get_nested_column())   
             \
-                                       .get_data();                            
             \
-            auto& null_bitmap = reinterpret_cast<const 
vectorized::ColumnVector<uint8_t>&>( \
-                                        
*(nullable_column->get_null_map_column_ptr()))      \
-                                        .get_data();                           
             \
-            for (uint16_t i = 0; i < size; i++) {                              
             \
-                if (!flags[i]) continue;                                       
             \
-                uint16_t idx = sel[i];                                         
             \
-                bool ret = !null_bitmap[idx] && (data_array[idx] OP _value);   
             \
-                flags[i] &= _opposite ? !ret : ret;                            
             \
-            }                                                                  
             \
-        } else {                                                               
             \
-            auto& predicate_column =                                           
             \
-                    
reinterpret_cast<vectorized::PredicateColumnType<T>&>(column);          \
-            auto& data_array = predicate_column.get_data();                    
             \
-            for (uint16_t i = 0; i < size; ++i) {                              
             \
-                if (!flags[i]) continue;                                       
             \
-                uint16_t idx = sel[i];                                         
             \
-                bool ret = data_array[idx] OP _value;                          
             \
-                flags[i] &= _opposite ? !ret : ret;                            
             \
-            }                                                                  
             \
-        }                                                                      
             \
-    }
+#define COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(BOOL_NAME, BOOL_OP, SHORT_OP)    
                   \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(EqualPredicate, ==, false, BOOL_NAME, 
BOOL_OP, SHORT_OP) \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(NotEqualPredicate, !=, false, 
BOOL_NAME, BOOL_OP,        \
+                                         SHORT_OP)                             
                   \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(LessPredicate, <, true, BOOL_NAME, 
BOOL_OP, SHORT_OP)    \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(LessEqualPredicate, <=, true, 
BOOL_NAME, BOOL_OP,        \
+                                         SHORT_OP)                             
                   \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(GreaterPredicate, >, true, BOOL_NAME, 
BOOL_OP, SHORT_OP) \
+    COMPARISON_PRED_COLUMN_EVALUATE_BOOL(GreaterEqualPredicate, >=, true, 
BOOL_NAME, BOOL_OP,     \
+                                         SHORT_OP)
 
-COMPARISON_PRED_COLUMN_EVALUATE_AND(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(LessPredicate, <)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(GreaterEqualPredicate, >=)
+COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(or, |, )
+COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(and, &, !)
 
 #define BITMAP_COMPARE_EqualPredicate(s, exact_match, seeked_ordinal, 
iterator, bitmap, roaring) \
     do {                                                                       
                  \
@@ -697,4 +675,4 @@ 
COMPARISON_PRED_COLUMN_EVALUATE_VEC_DECLARATION(LessEqualPredicate)
 COMPARISON_PRED_COLUMN_EVALUATE_VEC_DECLARATION(GreaterPredicate)
 COMPARISON_PRED_COLUMN_EVALUATE_VEC_DECLARATION(GreaterEqualPredicate)
 
-} //namespace doris
\ No newline at end of file
+} //namespace doris


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to