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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]