Coverage Report

Created: 2026-06-05 10:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/vcondition_expr.cpp
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#include "exprs/vcondition_expr.h"
19
20
#include <glog/logging.h>
21
22
#include "core/column/column.h"
23
#include "core/column/column_const.h"
24
#include "exprs/function_context.h"
25
#include "util/simd/bits.h"
26
27
namespace doris {
28
29
Status VConditionExpr::prepare(RuntimeState* state, const RowDescriptor& desc,
30
5.67k
                               VExprContext* context) {
31
5.67k
    RETURN_IF_ERROR_OR_PREPARED(VExpr::prepare(state, desc, context));
32
5.67k
    _prepare_finished = true;
33
5.67k
    return Status::OK();
34
5.67k
}
35
36
Status VConditionExpr::open(RuntimeState* state, VExprContext* context,
37
18.0k
                            FunctionContext::FunctionStateScope scope) {
38
18.0k
    DCHECK(_prepare_finished);
39
18.0k
    RETURN_IF_ERROR(VExpr::open(state, context, scope));
40
18.0k
    _open_finished = true;
41
18.0k
    return Status::OK();
42
18.0k
}
43
44
18.0k
void VConditionExpr::close(VExprContext* context, FunctionContext::FunctionStateScope scope) {
45
18.0k
    DCHECK(_prepare_finished);
46
18.0k
    VExpr::close(context, scope);
47
18.0k
}
48
49
0
std::string VConditionExpr::debug_string() const {
50
0
    std::string result = expr_name() + "(";
51
0
    for (size_t i = 0; i < _children.size(); ++i) {
52
0
        if (i != 0) {
53
0
            result += ", ";
54
0
        }
55
0
        result += _children[i]->debug_string();
56
0
    }
57
0
    result += ")";
58
0
    return result;
59
0
}
60
61
11.3k
size_t VConditionExpr::count_true_with_notnull(const ColumnPtr& col) {
62
11.3k
    if (col->only_null()) {
63
33
        return 0;
64
33
    }
65
66
11.3k
    if (const auto* const_col = check_and_get_column<ColumnConst>(col.get())) {
67
        // if is null , get_bool will return false
68
        // bool get_bool(size_t n) const override {
69
        //     return is_null_at(n) ? false : _nested_column->get_bool(n);
70
        // }
71
2.05k
        bool is_true = const_col->get_bool(0);
72
2.05k
        return is_true ? col->size() : 0;
73
2.05k
    }
74
75
9.25k
    auto count = col->size();
76
9.25k
    if (col->is_nullable()) {
77
749
        const auto* nullable = assert_cast<const ColumnNullable*>(col.get());
78
749
        const auto* __restrict null_data = nullable->get_null_map_data().data();
79
749
        const auto* __restrict bool_data =
80
749
                ((const ColumnUInt8&)(nullable->get_nested_column())).get_data().data();
81
82
749
        size_t null_count = count - simd::count_zero_num((const int8_t*)null_data, count);
83
84
749
        if (null_count == count) {
85
0
            return 0;
86
749
        } else if (null_count == 0) {
87
706
            size_t true_count = count - simd::count_zero_num((const int8_t*)bool_data, count);
88
706
            return true_count;
89
706
        } else {
90
            // In fact, the null_count maybe is different with true_count, but it's no impact
91
43
            return null_count;
92
43
        }
93
8.50k
    } else {
94
8.50k
        const auto* bool_col = assert_cast<const ColumnUInt8*>(col.get());
95
8.50k
        const auto* __restrict bool_data = bool_col->get_data().data();
96
8.50k
        return count - simd::count_zero_num((const int8_t*)bool_data, count);
97
8.50k
    }
98
9.25k
}
99
100
4.36k
ColumnPtr materialize_column_if_const(const ColumnPtr& column) {
101
4.36k
    return column->convert_to_full_column_if_const();
102
4.36k
}
103
104
0
ColumnPtr make_nullable_column_if_not(const ColumnPtr& column) {
105
0
    if (is_column_nullable(*column)) return column;
106
107
0
    return ColumnNullable::create(materialize_column_if_const(column),
108
0
                                  ColumnUInt8::create(column->size(), 0));
109
0
}
110
111
488
ColumnPtr get_nested_column(const ColumnPtr& column) {
112
488
    if (auto* nullable = check_and_get_column<ColumnNullable>(*column))
113
281
        return nullable->get_nested_column_ptr();
114
207
    else if (const auto* column_const = check_and_get_column<ColumnConst>(*column))
115
58
        return ColumnConst::create(get_nested_column(column_const->get_data_column_ptr()),
116
58
                                   column->size());
117
118
149
    return column;
119
488
}
120
121
Status VectorizedIfExpr::execute_generic(Block& block, const ColumnUInt8* cond_col,
122
                                         const ColumnWithTypeAndName& then_col_type_name,
123
                                         const ColumnWithTypeAndName& else_col_type_name,
124
2.16k
                                         uint32_t result, size_t input_row_count) const {
125
2.16k
    MutableColumnPtr result_column = block.get_by_position(result).type->create_column();
126
2.16k
    result_column->reserve(input_row_count);
127
128
2.16k
    const IColumn& then_col = *then_col_type_name.column;
129
2.16k
    const IColumn& else_col = *else_col_type_name.column;
130
2.16k
    bool then_is_const = is_column_const(then_col);
131
2.16k
    bool else_is_const = is_column_const(else_col);
132
133
2.16k
    const auto& cond_array = cond_col->get_data();
134
135
2.16k
    if (then_is_const && else_is_const) {
136
35
        const IColumn& then_nested_column =
137
35
                assert_cast<const ColumnConst&>(then_col).get_data_column();
138
35
        const IColumn& else_nested_column =
139
35
                assert_cast<const ColumnConst&>(else_col).get_data_column();
140
168
        for (size_t i = 0; i < input_row_count; i++) {
141
133
            if (cond_array[i])
142
63
                result_column->insert_from(then_nested_column, 0);
143
70
            else
144
70
                result_column->insert_from(else_nested_column, 0);
145
133
        }
146
2.13k
    } else if (then_is_const) {
147
2.07k
        const IColumn& then_nested_column =
148
2.07k
                assert_cast<const ColumnConst&>(then_col).get_data_column();
149
150
4.24k
        for (size_t i = 0; i < input_row_count; i++) {
151
2.17k
            if (cond_array[i])
152
48
                result_column->insert_from(then_nested_column, 0);
153
2.12k
            else
154
2.12k
                result_column->insert_from(else_col, i);
155
2.17k
        }
156
2.07k
    } else if (else_is_const) {
157
0
        const IColumn& else_nested_column =
158
0
                assert_cast<const ColumnConst&>(else_col).get_data_column();
159
160
0
        for (size_t i = 0; i < input_row_count; i++) {
161
0
            if (cond_array[i])
162
0
                result_column->insert_from(then_col, i);
163
0
            else
164
0
                result_column->insert_from(else_nested_column, 0);
165
0
        }
166
60
    } else {
167
241
        for (size_t i = 0; i < input_row_count; i++) {
168
181
            result_column->insert_from(cond_array[i] ? then_col : else_col, i);
169
181
        }
170
60
    }
171
2.16k
    block.replace_by_position(result, std::move(result_column));
172
2.16k
    return Status::OK();
173
2.16k
}
174
175
Status VectorizedIfExpr::execute_for_null_then_else(Block& block,
176
                                                    const ColumnWithTypeAndName& arg_cond,
177
                                                    const ColumnWithTypeAndName& arg_then,
178
                                                    const ColumnWithTypeAndName& arg_else,
179
                                                    uint32_t result, size_t input_rows_count,
180
3.77k
                                                    bool& handled) const {
181
3.77k
    bool then_is_null = arg_then.column->only_null();
182
3.77k
    bool else_is_null = arg_else.column->only_null();
183
184
3.77k
    handled = false;
185
3.77k
    if (!then_is_null && !else_is_null) {
186
3.47k
        return Status::OK();
187
3.47k
    }
188
189
300
    if (then_is_null && else_is_null) {
190
0
        block.get_by_position(result).column =
191
0
                block.get_by_position(result).type->create_column_const_with_default_value(
192
0
                        input_rows_count);
193
0
        handled = true;
194
0
        return Status::OK();
195
0
    }
196
197
300
    const auto* cond_col = check_and_get_column<ColumnUInt8>(arg_cond.column.get());
198
300
    const ColumnConst* cond_const_col =
199
300
            check_and_get_column_const<ColumnUInt8>(arg_cond.column.get());
200
201
    /// If then is NULL, we create Nullable column with null mask OR-ed with condition.
202
300
    if (then_is_null) {
203
145
        if (cond_col) {
204
145
            if (is_column_nullable(*arg_else.column)) { // if(cond, null, nullable)
205
145
                auto arg_else_column = arg_else.column;
206
145
                auto result_column = (*std::move(arg_else_column)).mutate();
207
145
                assert_cast<ColumnNullable&>(*result_column)
208
145
                        .apply_null_map(assert_cast<const ColumnUInt8&>(*arg_cond.column));
209
145
                block.replace_by_position(result, std::move(result_column));
210
145
            } else { // if(cond, null, not_nullable)
211
0
                block.replace_by_position(
212
0
                        result, ColumnNullable::create(materialize_column_if_const(arg_else.column),
213
0
                                                       arg_cond.column));
214
0
            }
215
145
        } else if (cond_const_col) {
216
0
            if (cond_const_col->get_value<TYPE_BOOLEAN>()) { // if(true, null, else)
217
0
                block.get_by_position(result).column =
218
0
                        block.get_by_position(result).type->create_column()->clone_resized(
219
0
                                input_rows_count);
220
0
            } else { // if(false, null, else)
221
0
                block.get_by_position(result).column = make_nullable_column_if_not(arg_else.column);
222
0
            }
223
0
        } else {
224
0
            return Status::InternalError(
225
0
                    "Illegal column {} of first argument of function {}. Must be ColumnUInt8 "
226
0
                    "or ColumnConstUInt8.",
227
0
                    arg_cond.column->get_name(), expr_name());
228
0
        }
229
155
    } else { /// If else is NULL, we create Nullable column with null mask OR-ed with negated condition.
230
155
        if (cond_col) {
231
155
            size_t size = input_rows_count;
232
233
155
            if (is_column_nullable(*arg_then.column)) { // if(cond, nullable, NULL)
234
121
                auto arg_then_column = arg_then.column;
235
121
                auto result_column = (*std::move(arg_then_column)).mutate();
236
121
                assert_cast<ColumnNullable&>(*result_column)
237
121
                        .apply_negated_null_map(assert_cast<const ColumnUInt8&>(*arg_cond.column));
238
121
                block.replace_by_position(result, std::move(result_column));
239
121
            } else { // if(cond, not_nullable, NULL)
240
34
                const auto& null_map_data = cond_col->get_data();
241
34
                auto negated_null_map = ColumnUInt8::create();
242
34
                auto& negated_null_map_data = negated_null_map->get_data();
243
34
                negated_null_map_data.resize(size);
244
245
122
                for (size_t i = 0; i < size; ++i) {
246
88
                    negated_null_map_data[i] = !null_map_data[i];
247
88
                }
248
249
34
                block.replace_by_position(
250
34
                        result, ColumnNullable::create(materialize_column_if_const(arg_then.column),
251
34
                                                       std::move(negated_null_map)));
252
34
            }
253
155
        } else if (cond_const_col) {
254
0
            if (cond_const_col->get_value<TYPE_BOOLEAN>()) { // if(true, then, NULL)
255
0
                block.get_by_position(result).column = make_nullable_column_if_not(arg_then.column);
256
0
            } else { // if(false, then, NULL)
257
0
                block.get_by_position(result).column =
258
0
                        block.get_by_position(result).type->create_column()->clone_resized(
259
0
                                input_rows_count);
260
0
            }
261
0
        } else {
262
0
            return Status::InternalError(
263
0
                    "Illegal column {} of first argument of function {}. Must be ColumnUInt8 "
264
0
                    "or ColumnConstUInt8.",
265
0
                    arg_cond.column->get_name(), expr_name());
266
0
        }
267
155
    }
268
300
    handled = true;
269
300
    return Status::OK();
270
300
}
271
272
Status VectorizedIfExpr::execute_for_nullable_then_else(Block& block,
273
                                                        const ColumnWithTypeAndName& arg_cond,
274
                                                        const ColumnWithTypeAndName& arg_then,
275
                                                        const ColumnWithTypeAndName& arg_else,
276
                                                        uint32_t result, size_t input_rows_count,
277
3.47k
                                                        bool& handled) const {
278
3.47k
    auto then_type_is_nullable = arg_then.type->is_nullable();
279
3.47k
    auto else_type_is_nullable = arg_else.type->is_nullable();
280
3.47k
    handled = false;
281
3.47k
    if (!then_type_is_nullable && !else_type_is_nullable) {
282
3.25k
        return Status::OK();
283
3.25k
    }
284
285
215
    const auto* then_is_nullable = check_and_get_column<ColumnNullable>(*arg_then.column);
286
215
    const auto* else_is_nullable = check_and_get_column<ColumnNullable>(*arg_else.column);
287
215
    bool then_column_is_const_nullable = false;
288
215
    bool else_column_is_const_nullable = false;
289
215
    if (then_type_is_nullable && then_is_nullable == nullptr) {
290
        //this case is a const(nullable column)
291
0
        const auto& const_column = assert_cast<const ColumnConst&>(*arg_then.column);
292
0
        then_is_nullable =
293
0
                assert_cast<const ColumnNullable*>(const_column.get_data_column_ptr().get());
294
0
        then_column_is_const_nullable = true;
295
0
    }
296
297
215
    if (else_type_is_nullable && else_is_nullable == nullptr) {
298
        //this case is a const(nullable column)
299
0
        const auto& const_column = assert_cast<const ColumnConst&>(*arg_else.column);
300
0
        else_is_nullable =
301
0
                assert_cast<const ColumnNullable*>(const_column.get_data_column_ptr().get());
302
0
        else_column_is_const_nullable = true;
303
0
    }
304
305
    /** Calculate null mask of result and nested column separately.
306
      */
307
215
    ColumnPtr result_null_mask;
308
215
    {
309
        // get null map from column:
310
        // a. get_null_map_column_ptr() : it's a real nullable column, so could get it from nullable column
311
        // b. create a const_nullmap_column: it's a not nullable column or a const nullable column, contain a const value
312
215
        Block temporary_block;
313
215
        temporary_block.insert(arg_cond);
314
215
        ColumnPtr then_nested_null_map;
315
215
        if (then_type_is_nullable && !then_column_is_const_nullable) {
316
77
            then_nested_null_map = then_is_nullable->get_null_map_column_ptr();
317
138
        } else {
318
138
            then_nested_null_map =
319
138
                    DataTypeUInt8().create_column_const_with_default_value(input_rows_count);
320
138
        }
321
215
        temporary_block.insert(
322
215
                {then_nested_null_map, std::make_shared<DataTypeUInt8>(), "then_column_null_map"});
323
324
215
        ColumnPtr else_nested_null_map;
325
215
        if (else_type_is_nullable && !else_column_is_const_nullable) {
326
204
            else_nested_null_map = else_is_nullable->get_null_map_column_ptr();
327
204
        } else {
328
11
            else_nested_null_map =
329
11
                    DataTypeUInt8().create_column_const_with_default_value(input_rows_count);
330
11
        }
331
215
        temporary_block.insert(
332
215
                {else_nested_null_map, std::make_shared<DataTypeUInt8>(), "else_column_null_map"});
333
215
        temporary_block.insert(
334
215
                {nullptr, std::make_shared<DataTypeUInt8>(), "result_column_null_map"});
335
336
215
        RETURN_IF_ERROR(
337
215
                _execute_impl_internal(temporary_block, {0, 1, 2}, 3, temporary_block.rows()));
338
339
215
        result_null_mask = temporary_block.get_by_position(3).column;
340
215
    }
341
342
0
    ColumnPtr result_nested_column;
343
344
215
    {
345
215
        Block temporary_block(
346
215
                {arg_cond,
347
215
                 {get_nested_column(arg_then.column), remove_nullable(arg_then.type), ""},
348
215
                 {get_nested_column(arg_else.column), remove_nullable(arg_else.type), ""},
349
215
                 {nullptr, remove_nullable(block.get_by_position(result).type), ""}});
350
351
215
        RETURN_IF_ERROR(
352
215
                _execute_impl_internal(temporary_block, {0, 1, 2}, 3, temporary_block.rows()));
353
354
215
        result_nested_column = temporary_block.get_by_position(3).column;
355
215
    }
356
357
0
    auto column = ColumnNullable::create(materialize_column_if_const(result_nested_column),
358
215
                                         materialize_column_if_const(result_null_mask));
359
215
    block.replace_by_position(result, std::move(column));
360
215
    handled = true;
361
215
    return Status::OK();
362
215
}
363
364
Status VectorizedIfExpr::execute_for_null_condition(Block& block, const ColumnNumbers& arguments,
365
                                                    const ColumnWithTypeAndName& arg_cond,
366
                                                    const ColumnWithTypeAndName& arg_then,
367
                                                    const ColumnWithTypeAndName& arg_else,
368
3.90k
                                                    uint32_t result, bool& handled) const {
369
3.90k
    bool cond_is_null = arg_cond.column->only_null();
370
3.90k
    handled = false;
371
372
3.90k
    if (cond_is_null) {
373
0
        block.replace_by_position(result, arg_else.column->clone_resized(arg_cond.column->size()));
374
0
        handled = true;
375
0
        return Status::OK();
376
0
    }
377
378
3.90k
    if (const auto* nullable = check_and_get_column<ColumnNullable>(*arg_cond.column)) {
379
128
        DCHECK(remove_nullable(arg_cond.type)->get_primitive_type() == PrimitiveType::TYPE_BOOLEAN);
380
381
        // update nested column by null map
382
128
        const auto* __restrict null_map = nullable->get_null_map_data().data();
383
128
        auto* __restrict nested_bool_data =
384
128
                ((ColumnUInt8&)(nullable->get_nested_column())).get_data().data();
385
128
        auto rows = nullable->size();
386
1.29k
        for (size_t i = 0; i < rows; i++) {
387
1.16k
            nested_bool_data[i] &= !null_map[i];
388
1.16k
        }
389
128
        auto column_size = block.columns();
390
128
        block.insert(
391
128
                {nullable->get_nested_column_ptr(), remove_nullable(arg_cond.type), arg_cond.name});
392
393
128
        handled = true;
394
128
        return _execute_impl_internal(block, {column_size, arguments[1], arguments[2]}, result,
395
128
                                      rows);
396
128
    }
397
3.77k
    return Status::OK();
398
3.90k
}
399
400
Status VectorizedIfExpr::_execute_impl_internal(Block& block, const ColumnNumbers& arguments,
401
3.90k
                                                uint32_t result, size_t input_rows_count) const {
402
3.90k
    const ColumnWithTypeAndName& arg_then = block.get_by_position(arguments[1]);
403
3.90k
    const ColumnWithTypeAndName& arg_else = block.get_by_position(arguments[2]);
404
3.90k
    ColumnWithTypeAndName& cond_column = block.get_by_position(arguments[0]);
405
3.90k
    cond_column.column = materialize_column_if_const(cond_column.column);
406
3.90k
    const ColumnWithTypeAndName& arg_cond = block.get_by_position(arguments[0]);
407
408
3.90k
    Status ret = Status::OK();
409
3.90k
    bool handled = false;
410
3.90k
    RETURN_IF_ERROR(execute_for_null_condition(block, arguments, arg_cond, arg_then, arg_else,
411
3.90k
                                               result, handled));
412
413
3.90k
    if (!handled) {
414
3.77k
        RETURN_IF_ERROR(execute_for_null_then_else(block, arg_cond, arg_then, arg_else, result,
415
3.77k
                                                   input_rows_count, handled));
416
3.77k
    }
417
418
3.90k
    if (!handled) {
419
3.47k
        RETURN_IF_ERROR(execute_for_nullable_then_else(block, arg_cond, arg_then, arg_else, result,
420
3.47k
                                                       input_rows_count, handled));
421
3.47k
    }
422
423
3.90k
    if (handled) {
424
643
        return Status::OK();
425
643
    }
426
427
3.25k
    const auto* cond_col = assert_cast<const ColumnUInt8*>(arg_cond.column.get());
428
3.25k
    const ColumnConst* cond_const_col =
429
3.25k
            check_and_get_column_const<ColumnUInt8>(arg_cond.column.get());
430
431
3.25k
    if (cond_const_col) {
432
0
        block.get_by_position(result).column =
433
0
                cond_const_col->get_value<TYPE_BOOLEAN>() ? arg_then.column : arg_else.column;
434
0
        return Status::OK();
435
0
    }
436
437
3.25k
    Status vec_exec;
438
439
3.25k
    auto call = [&](const auto& type) -> bool {
440
1.09k
        using DataType = std::decay_t<decltype(type)>;
441
1.09k
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
1.09k
                                                       vec_exec);
443
1.09k
        return true;
444
1.09k
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE2EEEEEbRKT_
Line
Count
Source
439
259
    auto call = [&](const auto& type) -> bool {
440
259
        using DataType = std::decay_t<decltype(type)>;
441
259
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
259
                                                       vec_exec);
443
259
        return true;
444
259
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE3EEEEEbRKT_
Line
Count
Source
439
478
    auto call = [&](const auto& type) -> bool {
440
478
        using DataType = std::decay_t<decltype(type)>;
441
478
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
478
                                                       vec_exec);
443
478
        return true;
444
478
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE4EEEEEbRKT_
Line
Count
Source
439
4
    auto call = [&](const auto& type) -> bool {
440
4
        using DataType = std::decay_t<decltype(type)>;
441
4
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
4
                                                       vec_exec);
443
4
        return true;
444
4
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE5EEEEEbRKT_
Line
Count
Source
439
174
    auto call = [&](const auto& type) -> bool {
440
174
        using DataType = std::decay_t<decltype(type)>;
441
174
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
174
                                                       vec_exec);
443
174
        return true;
444
174
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE6EEEEEbRKT_
Line
Count
Source
439
105
    auto call = [&](const auto& type) -> bool {
440
105
        using DataType = std::decay_t<decltype(type)>;
441
105
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
105
                                                       vec_exec);
443
105
        return true;
444
105
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE7EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE8EEEEEbRKT_
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE9EEEEEbRKT_
Line
Count
Source
439
13
    auto call = [&](const auto& type) -> bool {
440
13
        using DataType = std::decay_t<decltype(type)>;
441
13
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
13
                                                       vec_exec);
443
13
        return true;
444
13
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE28EEEEEbRKT_
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE29EEEEEbRKT_
Line
Count
Source
439
3
    auto call = [&](const auto& type) -> bool {
440
3
        using DataType = std::decay_t<decltype(type)>;
441
3
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
3
                                                       vec_exec);
443
3
        return true;
444
3
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE20EEEEEbRKT_
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE30EEEEEbRKT_
Line
Count
Source
439
35
    auto call = [&](const auto& type) -> bool {
440
35
        using DataType = std::decay_t<decltype(type)>;
441
35
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
35
                                                       vec_exec);
443
35
        return true;
444
35
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE35EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE11EEEEEbRKT_
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE25EEEEEbRKT_
Line
Count
Source
439
20
    auto call = [&](const auto& type) -> bool {
440
20
        using DataType = std::decay_t<decltype(type)>;
441
20
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
20
                                                       vec_exec);
443
20
        return true;
444
20
    };
vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE26EEEEEbRKT_
Line
Count
Source
439
1
    auto call = [&](const auto& type) -> bool {
440
1
        using DataType = std::decay_t<decltype(type)>;
441
1
        vec_exec = execute_basic_type<DataType::PType>(block, cond_col, arg_then, arg_else, result,
442
1
                                                       vec_exec);
443
1
        return true;
444
1
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE12EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE27EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE42EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE36EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZNK5doris16VectorizedIfExpr22_execute_impl_internalERNS_5BlockERKSt6vectorIjSaIjEEjmENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE37EEEEEbRKT_
445
446
3.25k
    auto can_use_vec_exec = dispatch_switch_scalar(arg_then.type->get_primitive_type(), call);
447
3.25k
    if (can_use_vec_exec) {
448
1.09k
        return vec_exec;
449
2.16k
    } else {
450
2.16k
        return execute_generic(block, cond_col, arg_then, arg_else, result, input_rows_count);
451
2.16k
    }
452
3.25k
}
453
454
Status VectorizedIfExpr::execute_column_impl(VExprContext* context, const Block* block,
455
                                             const Selector* selector, size_t count,
456
11.3k
                                             ColumnPtr& result_column) const {
457
11.3k
    DCHECK(_open_finished || block == nullptr) << debug_string();
458
11.3k
    DCHECK_EQ(_children.size(), 3) << "IF expr must have three children";
459
460
11.3k
    ColumnPtr cond_column;
461
11.3k
    RETURN_IF_ERROR(_children[0]->execute_column(context, block, selector, count, cond_column));
462
463
11.3k
    ColumnPtr then_column;
464
11.3k
    ColumnPtr else_column;
465
466
11.3k
    auto true_count = count_true_with_notnull(cond_column);
467
11.3k
    auto item_count = cond_column->size();
468
11.3k
    if (true_count == item_count) {
469
2.12k
        RETURN_IF_ERROR(_children[1]->execute_column(context, block, selector, count, then_column));
470
2.12k
        result_column = _data_type->is_nullable() ? make_nullable(then_column) : then_column;
471
2.12k
        return Status::OK();
472
9.21k
    } else if (true_count == 0) {
473
8.13k
        RETURN_IF_ERROR(_children[2]->execute_column(context, block, selector, count, else_column));
474
8.13k
        result_column = _data_type->is_nullable() ? make_nullable(else_column) : else_column;
475
8.13k
        return Status::OK();
476
8.13k
    }
477
478
1.07k
    RETURN_IF_ERROR(_children[1]->execute_column(context, block, selector, count, then_column));
479
1.07k
    RETURN_IF_ERROR(_children[2]->execute_column(context, block, selector, count, else_column));
480
481
1.07k
    Block temp_block;
482
483
1.07k
    temp_block.insert({cond_column, _children[0]->execute_type(block), _children[0]->expr_name()});
484
1.07k
    temp_block.insert({then_column, _children[1]->execute_type(block), _children[1]->expr_name()});
485
1.07k
    temp_block.insert({else_column, _children[2]->execute_type(block), _children[2]->expr_name()});
486
487
    // prepare a column to save result
488
1.07k
    temp_block.insert({nullptr, _data_type, IF_NAME});
489
1.07k
    RETURN_IF_ERROR(_execute_impl_internal(temp_block, {0, 1, 2}, 3, temp_block.rows()));
490
1.07k
    result_column = temp_block.get_by_position(3).column;
491
1.07k
    DCHECK_EQ(result_column->size(), count);
492
1.07k
    return Status::OK();
493
1.07k
}
494
495
Status VectorizedIfNullExpr::execute_column_impl(VExprContext* context, const Block* block,
496
                                                 const Selector* selector, size_t count,
497
2.50k
                                                 ColumnPtr& result_column) const {
498
2.50k
    DCHECK(_open_finished || block == nullptr) << debug_string();
499
2.50k
    DCHECK_EQ(_children.size(), 2) << "IFNULL expr must have two children";
500
501
2.50k
    ColumnPtr first_column;
502
2.50k
    RETURN_IF_ERROR(_children[0]->execute_column(context, block, selector, count, first_column));
503
2.50k
    first_column = first_column->convert_to_full_column_if_const();
504
505
2.50k
    if (!first_column->is_nullable()) {
506
0
        result_column = first_column;
507
0
        DCHECK(_data_type->is_nullable() == false);
508
0
        return Status::OK();
509
0
    }
510
511
2.50k
    if (first_column->only_null()) {
512
239
        RETURN_IF_ERROR(
513
239
                _children[1]->execute_column(context, block, selector, count, result_column));
514
239
        return Status::OK();
515
239
    }
516
517
2.26k
    ColumnPtr second_column;
518
2.26k
    RETURN_IF_ERROR(_children[1]->execute_column(context, block, selector, count, second_column));
519
520
2.26k
    const auto& nullable_first_column = assert_cast<const ColumnNullable&>(*first_column);
521
522
2.26k
    ColumnPtr cond_column = nullable_first_column.get_null_map_column_ptr();
523
524
2.26k
    ColumnPtr then_column = second_column;
525
526
2.26k
    ColumnPtr else_column;
527
2.26k
    DataTypePtr else_type;
528
529
2.26k
    if (_data_type->is_nullable()) {
530
8
        else_column = first_column;
531
8
        else_type = _children[0]->execute_type(block);
532
2.25k
    } else {
533
2.25k
        else_column = nullable_first_column.get_nested_column_ptr();
534
2.25k
        else_type = remove_nullable(_children[0]->execute_type(block));
535
2.25k
    }
536
537
2.26k
    Block temp_block;
538
2.26k
    temp_block.insert({cond_column, std::make_shared<DataTypeUInt8>(), "cond column"});
539
2.26k
    temp_block.insert({then_column, _children[1]->execute_type(block), _children[1]->expr_name()});
540
2.26k
    temp_block.insert({else_column, else_type, _children[0]->expr_name()});
541
542
    // prepare a column to save result
543
2.26k
    temp_block.insert({nullptr, _data_type, IF_NULL_NAME});
544
2.26k
    RETURN_IF_ERROR(_execute_impl_internal(temp_block, {0, 1, 2}, 3, temp_block.rows()));
545
2.26k
    result_column = temp_block.get_by_position(3).column;
546
2.26k
    DCHECK_EQ(result_column->size(), count);
547
2.26k
    return Status::OK();
548
2.26k
}
549
550
template <typename ColumnType>
551
void insert_result_data(MutableColumnPtr& result_column, ColumnPtr& argument_column,
552
                        const UInt8* __restrict null_map_data, UInt8* __restrict filled_flag,
553
106
                        const size_t input_rows_count) {
554
106
    if (result_column->size() == 0 && input_rows_count) {
555
63
        result_column->resize(input_rows_count);
556
63
        auto* __restrict result_raw_data =
557
63
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
184
        for (int i = 0; i < input_rows_count; i++) {
559
121
            result_raw_data[i] = {};
560
121
        }
561
63
    }
562
106
    auto* __restrict result_raw_data =
563
106
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
106
    auto* __restrict column_raw_data =
565
106
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
345
    for (size_t row = 0; row < input_rows_count; ++row) {
571
239
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
14
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
14
                    result_raw_data[row].to_date_int_val() +
574
14
                    column_raw_data[row].to_date_int_val() *
575
14
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
14
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
13
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
13
                    result_raw_data[row].to_date_int_val() +
579
13
                    column_raw_data[row].to_date_int_val() *
580
13
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
13
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
0
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
0
                    result_raw_data[row].to_date_int_val() +
584
0
                    column_raw_data[row].to_date_int_val() *
585
0
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
0
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
0
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
0
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
0
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
0
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
51
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
51
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
51
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
51
                                            ? column_raw_data[row] * flag
597
51
                                            : (flag ? column_raw_data[row] : 0);
598
161
        } else {
599
161
            result_raw_data[row] +=
600
161
                    column_raw_data[row] *
601
161
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
161
        }
603
604
239
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
239
    }
606
106
}
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE3EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
4
                        const size_t input_rows_count) {
554
4
    if (result_column->size() == 0 && input_rows_count) {
555
3
        result_column->resize(input_rows_count);
556
3
        auto* __restrict result_raw_data =
557
3
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
6
        for (int i = 0; i < input_rows_count; i++) {
559
3
            result_raw_data[i] = {};
560
3
        }
561
3
    }
562
4
    auto* __restrict result_raw_data =
563
4
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
4
    auto* __restrict column_raw_data =
565
4
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
8
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
4
        } else {
599
4
            result_raw_data[row] +=
600
4
                    column_raw_data[row] *
601
4
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
4
        }
603
604
4
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
4
    }
606
4
}
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE4EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
4
                        const size_t input_rows_count) {
554
4
    if (result_column->size() == 0 && input_rows_count) {
555
2
        result_column->resize(input_rows_count);
556
2
        auto* __restrict result_raw_data =
557
2
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
4
        for (int i = 0; i < input_rows_count; i++) {
559
2
            result_raw_data[i] = {};
560
2
        }
561
2
    }
562
4
    auto* __restrict result_raw_data =
563
4
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
4
    auto* __restrict column_raw_data =
565
4
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
8
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
4
        } else {
599
4
            result_raw_data[row] +=
600
4
                    column_raw_data[row] *
601
4
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
4
        }
603
604
4
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
4
    }
606
4
}
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE5EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
50
                        const size_t input_rows_count) {
554
50
    if (result_column->size() == 0 && input_rows_count) {
555
30
        result_column->resize(input_rows_count);
556
30
        auto* __restrict result_raw_data =
557
30
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
97
        for (int i = 0; i < input_rows_count; i++) {
559
67
            result_raw_data[i] = {};
560
67
        }
561
30
    }
562
50
    auto* __restrict result_raw_data =
563
50
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
50
    auto* __restrict column_raw_data =
565
50
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
185
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
135
        } else {
599
135
            result_raw_data[row] +=
600
135
                    column_raw_data[row] *
601
135
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
135
        }
603
604
135
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
135
    }
606
50
}
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE6EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
6
                        const size_t input_rows_count) {
554
6
    if (result_column->size() == 0 && input_rows_count) {
555
5
        result_column->resize(input_rows_count);
556
5
        auto* __restrict result_raw_data =
557
5
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
10
        for (int i = 0; i < input_rows_count; i++) {
559
5
            result_raw_data[i] = {};
560
5
        }
561
5
    }
562
6
    auto* __restrict result_raw_data =
563
6
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
6
    auto* __restrict column_raw_data =
565
6
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
12
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
6
        } else {
599
6
            result_raw_data[row] +=
600
6
                    column_raw_data[row] *
601
6
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
6
        }
603
604
6
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
6
    }
606
6
}
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE7EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE8EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
4
                        const size_t input_rows_count) {
554
4
    if (result_column->size() == 0 && input_rows_count) {
555
2
        result_column->resize(input_rows_count);
556
2
        auto* __restrict result_raw_data =
557
2
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
5
        for (int i = 0; i < input_rows_count; i++) {
559
3
            result_raw_data[i] = {};
560
3
        }
561
2
    }
562
4
    auto* __restrict result_raw_data =
563
4
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
4
    auto* __restrict column_raw_data =
565
4
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
10
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
6
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
6
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
6
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
6
                                            ? column_raw_data[row] * flag
597
6
                                            : (flag ? column_raw_data[row] : 0);
598
        } else {
599
            result_raw_data[row] +=
600
                    column_raw_data[row] *
601
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
        }
603
604
6
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
6
    }
606
4
}
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE9EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
17
                        const size_t input_rows_count) {
554
17
    if (result_column->size() == 0 && input_rows_count) {
555
8
        result_column->resize(input_rows_count);
556
8
        auto* __restrict result_raw_data =
557
8
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
27
        for (int i = 0; i < input_rows_count; i++) {
559
19
            result_raw_data[i] = {};
560
19
        }
561
8
    }
562
17
    auto* __restrict result_raw_data =
563
17
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
17
    auto* __restrict column_raw_data =
565
17
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
62
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
45
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
45
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
45
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
45
                                            ? column_raw_data[row] * flag
597
45
                                            : (flag ? column_raw_data[row] : 0);
598
        } else {
599
            result_raw_data[row] +=
600
                    column_raw_data[row] *
601
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
        }
603
604
45
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
45
    }
606
17
}
_ZN5doris18insert_result_dataINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
2
                        const size_t input_rows_count) {
554
2
    if (result_column->size() == 0 && input_rows_count) {
555
1
        result_column->resize(input_rows_count);
556
1
        auto* __restrict result_raw_data =
557
1
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
2
        for (int i = 0; i < input_rows_count; i++) {
559
1
            result_raw_data[i] = {};
560
1
        }
561
1
    }
562
2
    auto* __restrict result_raw_data =
563
2
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
2
    auto* __restrict column_raw_data =
565
2
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
4
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
2
        } else {
599
2
            result_raw_data[row] +=
600
2
                    column_raw_data[row] *
601
2
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
2
        }
603
604
2
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
2
    }
606
2
}
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_13ColumnDecimalILNS_13PrimitiveTypeE20EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
_ZN5doris18insert_result_dataINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
2
                        const size_t input_rows_count) {
554
2
    if (result_column->size() == 0 && input_rows_count) {
555
1
        result_column->resize(input_rows_count);
556
1
        auto* __restrict result_raw_data =
557
1
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
3
        for (int i = 0; i < input_rows_count; i++) {
559
2
            result_raw_data[i] = {};
560
2
        }
561
1
    }
562
2
    auto* __restrict result_raw_data =
563
2
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
2
    auto* __restrict column_raw_data =
565
2
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
6
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
4
        } else {
599
4
            result_raw_data[row] +=
600
4
                    column_raw_data[row] *
601
4
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
4
        }
603
604
4
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
4
    }
606
2
}
_ZN5doris18insert_result_dataINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
2
                        const size_t input_rows_count) {
554
2
    if (result_column->size() == 0 && input_rows_count) {
555
1
        result_column->resize(input_rows_count);
556
1
        auto* __restrict result_raw_data =
557
1
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
4
        for (int i = 0; i < input_rows_count; i++) {
559
3
            result_raw_data[i] = {};
560
3
        }
561
1
    }
562
2
    auto* __restrict result_raw_data =
563
2
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
2
    auto* __restrict column_raw_data =
565
2
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
8
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
6
        } else {
599
6
            result_raw_data[row] +=
600
6
                    column_raw_data[row] *
601
6
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
6
        }
603
604
6
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
6
    }
606
2
}
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE11EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE25EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
6
                        const size_t input_rows_count) {
554
6
    if (result_column->size() == 0 && input_rows_count) {
555
3
        result_column->resize(input_rows_count);
556
3
        auto* __restrict result_raw_data =
557
3
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
10
        for (int i = 0; i < input_rows_count; i++) {
559
7
            result_raw_data[i] = {};
560
7
        }
561
3
    }
562
6
    auto* __restrict result_raw_data =
563
6
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
6
    auto* __restrict column_raw_data =
565
6
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
20
    for (size_t row = 0; row < input_rows_count; ++row) {
571
14
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
14
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
14
                    result_raw_data[row].to_date_int_val() +
574
14
                    column_raw_data[row].to_date_int_val() *
575
14
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
                    result_raw_data[row].to_date_int_val() +
579
                    column_raw_data[row].to_date_int_val() *
580
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
        } else {
599
            result_raw_data[row] +=
600
                    column_raw_data[row] *
601
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
        }
603
604
14
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
14
    }
606
6
}
_ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE26EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Line
Count
Source
553
9
                        const size_t input_rows_count) {
554
9
    if (result_column->size() == 0 && input_rows_count) {
555
7
        result_column->resize(input_rows_count);
556
7
        auto* __restrict result_raw_data =
557
7
                assert_cast<ColumnType*>(result_column.get())->get_data().data();
558
16
        for (int i = 0; i < input_rows_count; i++) {
559
9
            result_raw_data[i] = {};
560
9
        }
561
7
    }
562
9
    auto* __restrict result_raw_data =
563
9
            assert_cast<ColumnType*>(result_column.get())->get_data().data();
564
9
    auto* __restrict column_raw_data =
565
9
            assert_cast<const ColumnType*>(argument_column.get())->get_data().data();
566
567
    // Here it's SIMD thought the compiler automatically also
568
    // true: null_map_data[row]==0 && filled_idx[row]==0
569
    // if true, could filled current row data into result column
570
22
    for (size_t row = 0; row < input_rows_count; ++row) {
571
        if constexpr (std::is_same_v<ColumnType, ColumnDateV2>) {
572
            result_raw_data[row] = binary_cast<uint32_t, DateV2Value<DateV2ValueType>>(
573
                    result_raw_data[row].to_date_int_val() +
574
                    column_raw_data[row].to_date_int_val() *
575
                            uint32_t(!(null_map_data[row] | filled_flag[row])));
576
13
        } else if constexpr (std::is_same_v<ColumnType, ColumnDateTimeV2>) {
577
13
            result_raw_data[row] = binary_cast<uint64_t, DateV2Value<DateTimeV2ValueType>>(
578
13
                    result_raw_data[row].to_date_int_val() +
579
13
                    column_raw_data[row].to_date_int_val() *
580
13
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
581
        } else if constexpr (std::is_same_v<ColumnType, ColumnTimeStampTz>) {
582
            result_raw_data[row] = binary_cast<uint64_t, TimestampTzValue>(
583
                    result_raw_data[row].to_date_int_val() +
584
                    column_raw_data[row].to_date_int_val() *
585
                            uint64_t(!(null_map_data[row] | filled_flag[row])));
586
        } else if constexpr (std::is_same_v<ColumnType, ColumnDate> ||
587
                             std::is_same_v<ColumnType, ColumnDateTime>) {
588
            result_raw_data[row] = binary_cast<int64_t, VecDateTimeValue>(
589
                    binary_cast<VecDateTimeValue, int64_t>(result_raw_data[row]) +
590
                    binary_cast<VecDateTimeValue, int64_t>(column_raw_data[row]) *
591
                            int64_t(!(null_map_data[row] | filled_flag[row])));
592
        } else if constexpr (std::is_same_v<ColumnType, ColumnFloat32> ||
593
                             std::is_same_v<ColumnType, ColumnFloat64>) {
594
            auto flag = (!(null_map_data[row] | filled_flag[row]));
595
            result_raw_data[row] += std::isfinite(column_raw_data[row])
596
                                            ? column_raw_data[row] * flag
597
                                            : (flag ? column_raw_data[row] : 0);
598
        } else {
599
            result_raw_data[row] +=
600
                    column_raw_data[row] *
601
                    typename ColumnType::value_type(!(null_map_data[row] | filled_flag[row]));
602
        }
603
604
13
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
605
13
    }
606
9
}
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE12EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE27EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE42EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE36EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
Unexecuted instantiation: _ZN5doris18insert_result_dataINS_12ColumnVectorILNS_13PrimitiveTypeE37EEEEEvRNS_3COWINS_7IColumnEE11mutable_ptrIS5_EERNS6_13immutable_ptrIS5_EEPKhPhm
607
608
Status insert_result_data_bitmap(MutableColumnPtr& result_column, ColumnPtr& argument_column,
609
                                 const UInt8* __restrict null_map_data,
610
0
                                 UInt8* __restrict filled_flag, const size_t input_rows_count) {
611
0
    if (result_column->size() == 0 && input_rows_count) {
612
0
        result_column->resize(input_rows_count);
613
0
    }
614
615
0
    auto* __restrict result_raw_data =
616
0
            reinterpret_cast<ColumnBitmap*>(result_column.get())->get_data().data();
617
0
    auto* __restrict column_raw_data =
618
0
            reinterpret_cast<const ColumnBitmap*>(argument_column.get())->get_data().data();
619
620
    // Here it's SIMD thought the compiler automatically also
621
    // true: null_map_data[row]==0 && filled_idx[row]==0
622
    // if true, could filled current row data into result column
623
0
    for (size_t row = 0; row < input_rows_count; ++row) {
624
0
        if (!(null_map_data[row] | filled_flag[row])) {
625
0
            result_raw_data[row] = column_raw_data[row];
626
0
        }
627
0
        filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
628
0
    }
629
0
    return Status::OK();
630
0
}
631
632
Status filled_result_column(const DataTypePtr& data_type, MutableColumnPtr& result_column,
633
                            ColumnPtr& argument_column, UInt8* __restrict null_map_data,
634
106
                            UInt8* __restrict filled_flag, const size_t input_rows_count) {
635
106
    if (data_type->get_primitive_type() == TYPE_BITMAP) {
636
0
        return insert_result_data_bitmap(result_column, argument_column, null_map_data, filled_flag,
637
0
                                         input_rows_count);
638
0
    }
639
640
106
    auto call = [&](const auto& type) -> bool {
641
106
        using DispatchType = std::decay_t<decltype(type)>;
642
106
        insert_result_data<typename DispatchType::ColumnType>(
643
106
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
106
        return true;
645
106
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE2EEEEEbRKT_
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE3EEEEEbRKT_
Line
Count
Source
640
4
    auto call = [&](const auto& type) -> bool {
641
4
        using DispatchType = std::decay_t<decltype(type)>;
642
4
        insert_result_data<typename DispatchType::ColumnType>(
643
4
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
4
        return true;
645
4
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE4EEEEEbRKT_
Line
Count
Source
640
4
    auto call = [&](const auto& type) -> bool {
641
4
        using DispatchType = std::decay_t<decltype(type)>;
642
4
        insert_result_data<typename DispatchType::ColumnType>(
643
4
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
4
        return true;
645
4
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE5EEEEEbRKT_
Line
Count
Source
640
50
    auto call = [&](const auto& type) -> bool {
641
50
        using DispatchType = std::decay_t<decltype(type)>;
642
50
        insert_result_data<typename DispatchType::ColumnType>(
643
50
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
50
        return true;
645
50
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE6EEEEEbRKT_
Line
Count
Source
640
6
    auto call = [&](const auto& type) -> bool {
641
6
        using DispatchType = std::decay_t<decltype(type)>;
642
6
        insert_result_data<typename DispatchType::ColumnType>(
643
6
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
6
        return true;
645
6
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE7EEEEEbRKT_
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE8EEEEEbRKT_
Line
Count
Source
640
4
    auto call = [&](const auto& type) -> bool {
641
4
        using DispatchType = std::decay_t<decltype(type)>;
642
4
        insert_result_data<typename DispatchType::ColumnType>(
643
4
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
4
        return true;
645
4
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE9EEEEEbRKT_
Line
Count
Source
640
17
    auto call = [&](const auto& type) -> bool {
641
17
        using DispatchType = std::decay_t<decltype(type)>;
642
17
        insert_result_data<typename DispatchType::ColumnType>(
643
17
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
17
        return true;
645
17
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE28EEEEEbRKT_
Line
Count
Source
640
2
    auto call = [&](const auto& type) -> bool {
641
2
        using DispatchType = std::decay_t<decltype(type)>;
642
2
        insert_result_data<typename DispatchType::ColumnType>(
643
2
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
2
        return true;
645
2
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE29EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE20EEEEEbRKT_
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE30EEEEEbRKT_
Line
Count
Source
640
2
    auto call = [&](const auto& type) -> bool {
641
2
        using DispatchType = std::decay_t<decltype(type)>;
642
2
        insert_result_data<typename DispatchType::ColumnType>(
643
2
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
2
        return true;
645
2
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE35EEEEEbRKT_
Line
Count
Source
640
2
    auto call = [&](const auto& type) -> bool {
641
2
        using DispatchType = std::decay_t<decltype(type)>;
642
2
        insert_result_data<typename DispatchType::ColumnType>(
643
2
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
2
        return true;
645
2
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE11EEEEEbRKT_
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE25EEEEEbRKT_
Line
Count
Source
640
6
    auto call = [&](const auto& type) -> bool {
641
6
        using DispatchType = std::decay_t<decltype(type)>;
642
6
        insert_result_data<typename DispatchType::ColumnType>(
643
6
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
6
        return true;
645
6
    };
vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE26EEEEEbRKT_
Line
Count
Source
640
9
    auto call = [&](const auto& type) -> bool {
641
9
        using DispatchType = std::decay_t<decltype(type)>;
642
9
        insert_result_data<typename DispatchType::ColumnType>(
643
9
                result_column, argument_column, null_map_data, filled_flag, input_rows_count);
644
9
        return true;
645
9
    };
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE12EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE27EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE42EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE36EEEEEbRKT_
Unexecuted instantiation: vcondition_expr.cpp:_ZZN5doris20filled_result_columnERKSt10shared_ptrIKNS_9IDataTypeEERNS_3COWINS_7IColumnEE11mutable_ptrIS7_EERNS8_13immutable_ptrIS7_EEPhSF_mENK3$_0clINS_16DispatchDataTypeILNS_13PrimitiveTypeE37EEEEEbRKT_
646
647
106
    if (!dispatch_switch_scalar(data_type->get_primitive_type(), call)) {
648
0
        return Status::InternalError("not support type {} in coalesce", data_type->get_name());
649
0
    }
650
106
    return Status::OK();
651
106
}
652
653
Status VectorizedCoalesceExpr::execute_column_impl(VExprContext* context, const Block* block,
654
                                                   const Selector* selector, size_t count,
655
221
                                                   ColumnPtr& return_column) const {
656
221
    DataTypePtr result_type = _data_type;
657
221
    const auto input_rows_count = count;
658
659
221
    size_t remaining_rows = input_rows_count;
660
221
    std::vector<uint32_t> record_idx(
661
221
            input_rows_count,
662
221
            0); //used to save column idx, record the result data of each row from which column
663
221
    std::vector<uint8_t> filled_flags(
664
221
            input_rows_count,
665
221
            0); //used to save filled flag, in order to check current row whether have filled data
666
667
221
    MutableColumnPtr result_column;
668
221
    if (!result_type->is_nullable()) {
669
117
        result_column = result_type->create_column();
670
117
    } else {
671
104
        result_column = remove_nullable(result_type)->create_column();
672
104
    }
673
674
    // because now follow below types does not support random position writing,
675
    // so insert into result data have two methods, one is for these types, one is for others type remaining
676
221
    bool cannot_random_write = result_column->is_column_string() ||
677
221
                               result_type->get_primitive_type() == PrimitiveType::TYPE_MAP ||
678
221
                               result_type->get_primitive_type() == PrimitiveType::TYPE_STRUCT ||
679
221
                               result_type->get_primitive_type() == PrimitiveType::TYPE_ARRAY ||
680
221
                               result_type->get_primitive_type() == PrimitiveType::TYPE_JSONB;
681
221
    if (cannot_random_write) {
682
72
        result_column->reserve(input_rows_count);
683
72
    }
684
685
221
    auto return_type = std::make_shared<DataTypeUInt8>();
686
221
    auto null_map = ColumnUInt8::create(input_rows_count,
687
221
                                        1); //if null_map_data==1, the current row should be null
688
221
    auto* __restrict null_map_data = null_map->get_data().data();
689
690
331
    auto is_not_null = [](const ColumnPtr& column, size_t size) -> ColumnUInt8::MutablePtr {
691
331
        if (const auto* nullable = check_and_get_column<ColumnNullable>(*column)) {
692
            /// Return the negated null map.
693
272
            auto res_column = ColumnUInt8::create(size);
694
272
            const auto* __restrict src_data = nullable->get_null_map_data().data();
695
272
            auto* __restrict res_data = res_column->get_data().data();
696
697
900
            for (size_t i = 0; i < size; ++i) {
698
628
                res_data[i] = !src_data[i];
699
628
            }
700
272
            return res_column;
701
272
        } else {
702
            /// Since no element is nullable, return a constant one.
703
59
            return ColumnUInt8::create(size, 1);
704
59
        }
705
331
    };
706
707
221
    std::vector<ColumnPtr> original_columns(_children.size());
708
221
    std::vector<ColumnPtr> argument_not_null_columns(_children.size());
709
710
389
    for (size_t i = 0; i < _children.size() && remaining_rows; ++i) {
711
        // Execute child expression to get the argument column.
712
331
        RETURN_IF_ERROR(
713
331
                _children[i]->execute_column(context, block, selector, count, original_columns[i]));
714
331
        original_columns[i] = original_columns[i]->convert_to_full_column_if_const();
715
331
        argument_not_null_columns[i] = original_columns[i];
716
331
        if (const auto* nullable =
717
331
                    check_and_get_column<const ColumnNullable>(*argument_not_null_columns[i])) {
718
272
            argument_not_null_columns[i] = nullable->get_nested_column_ptr();
719
272
        }
720
721
331
        auto res_column = is_not_null(original_columns[i], input_rows_count);
722
723
331
        auto& res_map = res_column->get_data();
724
331
        auto* __restrict res = res_map.data();
725
726
        // Here it's SIMD thought the compiler automatically
727
        // true: res[j]==1 && null_map_data[j]==1, false: others
728
        // if true: remaining_rows--; record_idx[j]=column_idx; null_map_data[j]=0, so the current row could fill result
729
1.09k
        for (size_t j = 0; j < input_rows_count; ++j) {
730
764
            remaining_rows -= (res[j] & null_map_data[j]);
731
764
            record_idx[j] += (res[j] & null_map_data[j]) * i;
732
764
            null_map_data[j] -= (res[j] & null_map_data[j]);
733
764
        }
734
735
331
        if (remaining_rows == 0) {
736
            //check whether all result data from the same column
737
207
            size_t is_same_column_count = 0;
738
207
            const auto data = record_idx[0];
739
702
            for (size_t row = 0; row < input_rows_count; ++row) {
740
495
                is_same_column_count += (record_idx[row] == data);
741
495
            }
742
743
207
            if (is_same_column_count == input_rows_count) {
744
163
                if (result_type->is_nullable()) {
745
78
                    return_column = make_nullable(argument_not_null_columns[i]);
746
85
                } else {
747
85
                    return_column = argument_not_null_columns[i];
748
85
                }
749
163
                return Status::OK();
750
163
            }
751
207
        }
752
753
168
        if (!cannot_random_write) {
754
            //if not string type, could check one column firstly,
755
            //and then fill the not null value in result column,
756
            //this method may result in higher CPU cache
757
106
            RETURN_IF_ERROR(filled_result_column(result_type, result_column,
758
106
                                                 argument_not_null_columns[i], null_map_data,
759
106
                                                 filled_flags.data(), input_rows_count));
760
106
        }
761
168
    }
762
763
58
    if (cannot_random_write) {
764
        //if string type,  should according to the record results, fill in result one by one,
765
96
        for (size_t row = 0; row < input_rows_count; ++row) {
766
73
            if (null_map_data[row]) { //should be null
767
3
                result_column->insert_default();
768
70
            } else {
769
70
                result_column->insert_from(*argument_not_null_columns[record_idx[row]].get(), row);
770
70
            }
771
73
        }
772
23
    }
773
774
58
    if (result_type->is_nullable()) {
775
26
        return_column = ColumnNullable::create(std::move(result_column), std::move(null_map));
776
32
    } else {
777
32
        return_column = std::move(result_column);
778
32
    }
779
780
    DCHECK_EQ(return_column->size(), count);
781
58
    return Status::OK();
782
221
}
783
784
} // namespace doris