You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by pa...@apache.org on 2025/05/23 05:53:52 UTC

(doris) branch master updated: [Improvement](function) optimize case_when branch (#51132)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 516d27bf6bf [Improvement](function) optimize case_when<then_null> branch (#51132)
516d27bf6bf is described below

commit 516d27bf6bfcfa890a9846505132b3faef2ba82a
Author: Pxl <xl...@selectdb.com>
AuthorDate: Fri May 23 13:53:44 2025 +0800

    [Improvement](function) optimize case_when<then_null> branch (#51132)
    
    
    optimize case_when<then_null> branch
    
    ```sql
    select    count(isnull(x))    from    (select    case    i1    when    -128    then    -128    when    -127    then    -127    when    -126    then    -126    when    -125    then    -125    when    -124    then    -124    when    -123    then    -123    when    -122    then    -122    when    -121    then    -121    when    -120    then    -120    when    -119    then    -119    when    -118    then    -118    when    -117    then    -117    when    -116    then    -116    when    -1 [...]
    before:1sec788ms
    after:648ms
    ```
---
 be/src/vec/functions/function_case.h | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/be/src/vec/functions/function_case.h b/be/src/vec/functions/function_case.h
index d7521552d0b..c1a18c83414 100644
--- a/be/src/vec/functions/function_case.h
+++ b/be/src/vec/functions/function_case.h
@@ -217,11 +217,24 @@ public:
                 }
             } else {
                 if constexpr (when_null) {
-                    // TODO: need simd
+                    const auto* column_nullable_ptr =
+                            assert_cast<const ColumnNullable*>(when_column_ptr.get());
+                    const auto* __restrict cond_raw_data =
+                            assert_cast<const ColumnUInt8*>(
+                                    column_nullable_ptr->get_nested_column_ptr().get())
+                                    ->get_data()
+                                    .data();
+                    const auto* __restrict cond_raw_nullmap =
+                            assert_cast<const ColumnUInt8*>(
+                                    column_nullable_ptr->get_null_map_column_ptr().get())
+                                    ->get_data()
+                                    .data();
+
+                    // simd automatically
                     for (int row_idx = 0; row_idx < rows_count; row_idx++) {
-                        if (!then_idx_ptr[row_idx] && when_column_ptr->get_bool(row_idx)) {
-                            then_idx_ptr[row_idx] = i;
-                        }
+                        then_idx_ptr[row_idx] |= (!then_idx_ptr[row_idx] * cond_raw_data[row_idx] *
+                                                  !cond_raw_nullmap[row_idx]) *
+                                                 i;
                     }
                 } else {
                     const auto* __restrict cond_raw_data =


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