Coverage Report

Created: 2026-06-04 15:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/function_bitmap_variadic.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 <stddef.h>
19
20
#include <algorithm>
21
#include <functional>
22
#include <memory>
23
#include <type_traits>
24
#include <utility>
25
#include <vector>
26
27
#include "common/status.h"
28
#include "core/assert_cast.h"
29
#include "core/block/block.h"
30
#include "core/block/column_numbers.h"
31
#include "core/block/column_with_type_and_name.h"
32
#include "core/column/column.h"
33
#include "core/column/column_complex.h"
34
#include "core/column/column_nullable.h"
35
#include "core/column/column_vector.h"
36
#include "core/data_type/data_type.h"
37
#include "core/data_type/data_type_bitmap.h"
38
#include "core/data_type/data_type_nullable.h"
39
#include "core/data_type/data_type_number.h"
40
#include "core/types.h"
41
#include "core/value/bitmap_value.h"
42
#include "exprs/aggregate/aggregate_function.h"
43
#include "exprs/function/function.h"
44
#include "exprs/function/simple_function_factory.h"
45
46
namespace doris {
47
class FunctionContext;
48
} // namespace doris
49
50
namespace doris {
51
52
// currently only bitmap_or and bitmap_or_count will call this function,
53
// other bitmap functions will use default implementation for nulls
54
#define BITMAP_OR_NULLABLE(nullable, input_rows_count, res, op)                                \
55
59
    const auto& nested_col_ptr = nullable->get_nested_column_ptr();                            \
56
59
    const auto* __restrict null_map_data = nullable->get_null_map_data().data();               \
57
59
    const auto& mid_data = assert_cast<const ColumnBitmap*>(nested_col_ptr.get())->get_data(); \
58
155
    for (size_t row = 0; row < input_rows_count; ++row) {                                      \
59
96
        if (!null_map_data[row]) {                                                             \
60
54
            res[row] op mid_data[row];                                                         \
61
54
        }                                                                                      \
62
96
    }
63
64
#define BITMAP_FUNCTION_VARIADIC(CLASS, FUNCTION_NAME, OP)                                        \
65
    struct CLASS {                                                                                \
66
        static constexpr auto name = #FUNCTION_NAME;                                              \
67
        using ResultDataType = DataTypeBitMap;                                                    \
68
        static Status vector_vector(ColumnPtr argument_columns[], size_t col_size,                \
69
                                    size_t input_rows_count, std::vector<BitmapValue>& res,       \
70
2.22k
                                    IColumn* res_nulls) {                                         \
71
2.22k
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
2.22k
            int nullable_cols_count = 0;                                                          \
73
2.22k
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
2.22k
            if (res_nulls) {                                                                      \
75
25
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
25
            }                                                                                     \
77
2.22k
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
13
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
13
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
2.20k
            } else {                                                                              \
81
2.20k
                const auto& mid_data =                                                            \
82
2.20k
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
14.2k
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
12.0k
                    res[row] = mid_data[row];                                                     \
85
12.0k
                }                                                                                 \
86
2.20k
            }                                                                                     \
87
4.46k
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
2.24k
                if (auto* nullable =                                                              \
89
2.24k
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
23
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
23
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
2.21k
                } else {                                                                          \
93
2.21k
                    const auto& col_data =                                                        \
94
2.21k
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
2.21k
                                    ->get_data();                                                 \
96
14.3k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
12.0k
                        res[row] OP col_data[row];                                                \
98
12.0k
                    }                                                                             \
99
2.21k
                }                                                                                 \
100
2.24k
            }                                                                                     \
101
2.22k
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
10
                const auto* null_map_data = null_map_datas[0];                                    \
103
24
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
14
                    res_nulls_data[row] = null_map_data[row];                                     \
105
14
                }                                                                                 \
106
20
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
10
                    null_map_data = null_map_datas[i];                                            \
108
24
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
14
                        res_nulls_data[row] &= null_map_data[row];                                \
110
14
                    }                                                                             \
111
10
                }                                                                                 \
112
10
            }                                                                                     \
113
2.22k
            return Status::OK();                                                                  \
114
2.22k
        }                                                                                         \
_ZN5doris8BitmapOr13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
54
                                    IColumn* res_nulls) {                                         \
71
54
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
54
            int nullable_cols_count = 0;                                                          \
73
54
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
54
            if (res_nulls) {                                                                      \
75
25
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
25
            }                                                                                     \
77
54
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
13
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
13
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
41
            } else {                                                                              \
81
41
                const auto& mid_data =                                                            \
82
41
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
117
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
76
                    res[row] = mid_data[row];                                                     \
85
76
                }                                                                                 \
86
41
            }                                                                                     \
87
118
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
64
                if (auto* nullable =                                                              \
89
64
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
23
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
23
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
41
                } else {                                                                          \
93
41
                    const auto& col_data =                                                        \
94
41
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
41
                                    ->get_data();                                                 \
96
107
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
66
                        res[row] OP col_data[row];                                                \
98
66
                    }                                                                             \
99
41
                }                                                                                 \
100
64
            }                                                                                     \
101
54
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
10
                const auto* null_map_data = null_map_datas[0];                                    \
103
24
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
14
                    res_nulls_data[row] = null_map_data[row];                                     \
105
14
                }                                                                                 \
106
20
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
10
                    null_map_data = null_map_datas[i];                                            \
108
24
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
14
                        res_nulls_data[row] &= null_map_data[row];                                \
110
14
                    }                                                                             \
111
10
                }                                                                                 \
112
10
            }                                                                                     \
113
54
            return Status::OK();                                                                  \
114
54
        }                                                                                         \
_ZN5doris9BitmapXor13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
2.14k
                                    IColumn* res_nulls) {                                         \
71
2.14k
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
2.14k
            int nullable_cols_count = 0;                                                          \
73
2.14k
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
2.14k
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
2.14k
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
0
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
0
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
2.14k
            } else {                                                                              \
81
2.14k
                const auto& mid_data =                                                            \
82
2.14k
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
14.1k
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
11.9k
                    res[row] = mid_data[row];                                                     \
85
11.9k
                }                                                                                 \
86
2.14k
            }                                                                                     \
87
4.30k
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
2.15k
                if (auto* nullable =                                                              \
89
2.15k
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
0
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
0
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
2.15k
                } else {                                                                          \
93
2.15k
                    const auto& col_data =                                                        \
94
2.15k
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
2.15k
                                    ->get_data();                                                 \
96
14.1k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
11.9k
                        res[row] OP col_data[row];                                                \
98
11.9k
                    }                                                                             \
99
2.15k
                }                                                                                 \
100
2.15k
            }                                                                                     \
101
2.14k
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
0
                const auto* null_map_data = null_map_datas[0];                                    \
103
0
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
0
                    res_nulls_data[row] = null_map_data[row];                                     \
105
0
                }                                                                                 \
106
0
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
0
                    null_map_data = null_map_datas[i];                                            \
108
0
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
0
                        res_nulls_data[row] &= null_map_data[row];                                \
110
0
                    }                                                                             \
111
0
                }                                                                                 \
112
0
            }                                                                                     \
113
2.14k
            return Status::OK();                                                                  \
114
2.14k
        }                                                                                         \
_ZN5doris9BitmapAnd13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
19
                                    IColumn* res_nulls) {                                         \
71
19
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
19
            int nullable_cols_count = 0;                                                          \
73
19
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
19
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
19
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
0
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
0
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
19
            } else {                                                                              \
81
19
                const auto& mid_data =                                                            \
82
19
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
56
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
37
                    res[row] = mid_data[row];                                                     \
85
37
                }                                                                                 \
86
19
            }                                                                                     \
87
42
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
23
                if (auto* nullable =                                                              \
89
23
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
0
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
0
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
23
                } else {                                                                          \
93
23
                    const auto& col_data =                                                        \
94
23
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
23
                                    ->get_data();                                                 \
96
61
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
38
                        res[row] OP col_data[row];                                                \
98
38
                    }                                                                             \
99
23
                }                                                                                 \
100
23
            }                                                                                     \
101
19
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
0
                const auto* null_map_data = null_map_datas[0];                                    \
103
0
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
0
                    res_nulls_data[row] = null_map_data[row];                                     \
105
0
                }                                                                                 \
106
0
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
0
                    null_map_data = null_map_datas[i];                                            \
108
0
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
0
                        res_nulls_data[row] &= null_map_data[row];                                \
110
0
                    }                                                                             \
111
0
                }                                                                                 \
112
0
            }                                                                                     \
113
19
            return Status::OK();                                                                  \
114
19
        }                                                                                         \
115
    }
116
117
#define BITMAP_FUNCTION_COUNT_VARIADIC(CLASS, FUNCTION_NAME, OP)                                  \
118
    struct CLASS {                                                                                \
119
        static constexpr auto name = #FUNCTION_NAME;                                              \
120
        using ResultDataType = DataTypeInt64;                                                     \
121
        using TData = std::vector<BitmapValue>;                                                   \
122
        using ResTData = typename ColumnInt64::Container;                                         \
123
        static Status vector_vector(ColumnPtr argument_columns[], size_t col_size,                \
124
69
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
125
69
            TData vals;                                                                           \
126
69
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
127
9
                vals.resize(input_rows_count);                                                    \
128
9
                BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =);                          \
129
60
            } else {                                                                              \
130
60
                vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();   \
131
60
            }                                                                                     \
132
155
            for (size_t col = 1; col < col_size; ++col) {                                         \
133
86
                if (auto* nullable =                                                              \
134
86
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
135
14
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP);                     \
136
72
                } else {                                                                          \
137
72
                    const auto& col_data =                                                        \
138
72
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
139
72
                                    ->get_data();                                                 \
140
227
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
141
155
                        vals[row] OP col_data[row];                                               \
142
155
                    }                                                                             \
143
72
                }                                                                                 \
144
86
            }                                                                                     \
145
225
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
146
156
                res[row] = vals[row].cardinality();                                               \
147
156
            }                                                                                     \
148
69
            return Status::OK();                                                                  \
149
69
        }                                                                                         \
_ZN5doris13BitmapOrCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_
Line
Count
Source
124
23
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
125
23
            TData vals;                                                                           \
126
23
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
127
9
                vals.resize(input_rows_count);                                                    \
128
9
                BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =);                          \
129
14
            } else {                                                                              \
130
14
                vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();   \
131
14
            }                                                                                     \
132
51
            for (size_t col = 1; col < col_size; ++col) {                                         \
133
28
                if (auto* nullable =                                                              \
134
28
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
135
14
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP);                     \
136
14
                } else {                                                                          \
137
14
                    const auto& col_data =                                                        \
138
14
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
139
14
                                    ->get_data();                                                 \
140
47
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
141
33
                        vals[row] OP col_data[row];                                               \
142
33
                    }                                                                             \
143
14
                }                                                                                 \
144
28
            }                                                                                     \
145
75
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
146
52
                res[row] = vals[row].cardinality();                                               \
147
52
            }                                                                                     \
148
23
            return Status::OK();                                                                  \
149
23
        }                                                                                         \
_ZN5doris14BitmapAndCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_
Line
Count
Source
124
23
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
125
23
            TData vals;                                                                           \
126
23
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
127
0
                vals.resize(input_rows_count);                                                    \
128
0
                BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =);                          \
129
23
            } else {                                                                              \
130
23
                vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();   \
131
23
            }                                                                                     \
132
52
            for (size_t col = 1; col < col_size; ++col) {                                         \
133
29
                if (auto* nullable =                                                              \
134
29
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
135
0
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP);                     \
136
29
                } else {                                                                          \
137
29
                    const auto& col_data =                                                        \
138
29
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
139
29
                                    ->get_data();                                                 \
140
90
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
141
61
                        vals[row] OP col_data[row];                                               \
142
61
                    }                                                                             \
143
29
                }                                                                                 \
144
29
            }                                                                                     \
145
75
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
146
52
                res[row] = vals[row].cardinality();                                               \
147
52
            }                                                                                     \
148
23
            return Status::OK();                                                                  \
149
23
        }                                                                                         \
_ZN5doris14BitmapXorCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_
Line
Count
Source
124
23
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
125
23
            TData vals;                                                                           \
126
23
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
127
0
                vals.resize(input_rows_count);                                                    \
128
0
                BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =);                          \
129
23
            } else {                                                                              \
130
23
                vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();   \
131
23
            }                                                                                     \
132
52
            for (size_t col = 1; col < col_size; ++col) {                                         \
133
29
                if (auto* nullable =                                                              \
134
29
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
135
0
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP);                     \
136
29
                } else {                                                                          \
137
29
                    const auto& col_data =                                                        \
138
29
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
139
29
                                    ->get_data();                                                 \
140
90
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
141
61
                        vals[row] OP col_data[row];                                               \
142
61
                    }                                                                             \
143
29
                }                                                                                 \
144
29
            }                                                                                     \
145
75
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
146
52
                res[row] = vals[row].cardinality();                                               \
147
52
            }                                                                                     \
148
23
            return Status::OK();                                                                  \
149
23
        }                                                                                         \
150
    }
151
152
BITMAP_FUNCTION_VARIADIC(BitmapOr, bitmap_or, |=);
153
BITMAP_FUNCTION_VARIADIC(BitmapAnd, bitmap_and, &=);
154
BITMAP_FUNCTION_VARIADIC(BitmapXor, bitmap_xor, ^=);
155
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapOrCount, bitmap_or_count, |=);
156
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapAndCount, bitmap_and_count, &=);
157
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapXorCount, bitmap_xor_count, ^=);
158
159
Status execute_bitmap_op_count_null_to_zero(
160
        FunctionContext* context, Block& block, const ColumnNumbers& arguments, uint32_t result,
161
        size_t input_rows_count,
162
        const std::function<Status(FunctionContext*, Block&, const ColumnNumbers&, size_t, size_t)>&
163
                exec_impl_func);
164
165
template <typename Impl>
166
class FunctionBitMapVariadic : public IFunction {
167
public:
168
    static constexpr auto name = Impl::name;
169
170
188
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrEE6createEv
Line
Count
Source
170
46
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorEE6createEv
Line
Count
Source
170
60
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndEE6createEv
Line
Count
Source
170
19
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE6createEv
Line
Count
Source
170
21
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE6createEv
Line
Count
Source
170
21
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE6createEv
Line
Count
Source
170
21
    static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }
171
172
0
    String get_name() const override { return name; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE8get_nameB5cxx11Ev
173
174
0
    size_t get_number_of_arguments() const override { return 0; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE23get_number_of_argumentsEv
175
176
158
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE11is_variadicEv
Line
Count
Source
176
41
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE11is_variadicEv
Line
Count
Source
176
55
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE11is_variadicEv
Line
Count
Source
176
14
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE11is_variadicEv
Line
Count
Source
176
16
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE11is_variadicEv
Line
Count
Source
176
16
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE11is_variadicEv
Line
Count
Source
176
16
    bool is_variadic() const override { return true; }
177
178
152
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
152
        using ResultDataType = typename Impl::ResultDataType;
180
152
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
85
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
178
            for (size_t i = 0; i < arguments.size(); ++i) {
184
143
                if (arguments[i]->is_nullable()) {
185
50
                    return_nullable = true;
186
50
                    break;
187
50
                }
188
143
            }
189
85
            auto result_type = std::make_shared<ResultDataType>();
190
85
            return return_nullable ? make_nullable(result_type) : result_type;
191
85
        } else {
192
67
            return std::make_shared<ResultDataType>();
193
67
        }
194
152
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
40
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
40
        using ResultDataType = typename Impl::ResultDataType;
180
40
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
40
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
99
            for (size_t i = 0; i < arguments.size(); ++i) {
184
78
                if (arguments[i]->is_nullable()) {
185
19
                    return_nullable = true;
186
19
                    break;
187
19
                }
188
78
            }
189
40
            auto result_type = std::make_shared<ResultDataType>();
190
40
            return return_nullable ? make_nullable(result_type) : result_type;
191
40
        } else {
192
0
            return std::make_shared<ResultDataType>();
193
0
        }
194
40
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
54
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
54
        using ResultDataType = typename Impl::ResultDataType;
180
54
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
0
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
0
            for (size_t i = 0; i < arguments.size(); ++i) {
184
0
                if (arguments[i]->is_nullable()) {
185
0
                    return_nullable = true;
186
0
                    break;
187
0
                }
188
0
            }
189
0
            auto result_type = std::make_shared<ResultDataType>();
190
0
            return return_nullable ? make_nullable(result_type) : result_type;
191
54
        } else {
192
54
            return std::make_shared<ResultDataType>();
193
54
        }
194
54
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
13
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
13
        using ResultDataType = typename Impl::ResultDataType;
180
13
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
0
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
0
            for (size_t i = 0; i < arguments.size(); ++i) {
184
0
                if (arguments[i]->is_nullable()) {
185
0
                    return_nullable = true;
186
0
                    break;
187
0
                }
188
0
            }
189
0
            auto result_type = std::make_shared<ResultDataType>();
190
0
            return return_nullable ? make_nullable(result_type) : result_type;
191
13
        } else {
192
13
            return std::make_shared<ResultDataType>();
193
13
        }
194
13
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
15
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
15
        using ResultDataType = typename Impl::ResultDataType;
180
15
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
15
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
25
            for (size_t i = 0; i < arguments.size(); ++i) {
184
21
                if (arguments[i]->is_nullable()) {
185
11
                    return_nullable = true;
186
11
                    break;
187
11
                }
188
21
            }
189
15
            auto result_type = std::make_shared<ResultDataType>();
190
15
            return return_nullable ? make_nullable(result_type) : result_type;
191
15
        } else {
192
0
            return std::make_shared<ResultDataType>();
193
0
        }
194
15
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
15
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
15
        using ResultDataType = typename Impl::ResultDataType;
180
15
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
15
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
27
            for (size_t i = 0; i < arguments.size(); ++i) {
184
22
                if (arguments[i]->is_nullable()) {
185
10
                    return_nullable = true;
186
10
                    break;
187
10
                }
188
22
            }
189
15
            auto result_type = std::make_shared<ResultDataType>();
190
15
            return return_nullable ? make_nullable(result_type) : result_type;
191
15
        } else {
192
0
            return std::make_shared<ResultDataType>();
193
0
        }
194
15
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
178
15
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
179
15
        using ResultDataType = typename Impl::ResultDataType;
180
15
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
181
15
            bool return_nullable = false;
182
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
183
27
            for (size_t i = 0; i < arguments.size(); ++i) {
184
22
                if (arguments[i]->is_nullable()) {
185
10
                    return_nullable = true;
186
10
                    break;
187
10
                }
188
22
            }
189
15
            auto result_type = std::make_shared<ResultDataType>();
190
15
            return return_nullable ? make_nullable(result_type) : result_type;
191
15
        } else {
192
0
            return std::make_shared<ResultDataType>();
193
0
        }
194
15
    }
195
196
7.03k
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
7.03k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
7.03k
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
202
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
202
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
202
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
6.50k
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
6.50k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
6.50k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
79
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
79
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
79
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
83
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
83
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
83
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
82
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
83
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
82
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE36use_default_implementation_for_nullsEv
Line
Count
Source
196
82
    bool use_default_implementation_for_nulls() const override {
197
        // result is null only when all columns is null for bitmap_or.
198
        // for count functions, result is always not null, and if the bitmap op result is null,
199
        // the count is 0
200
83
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
201
82
    }
202
203
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
204
2.28k
                        uint32_t result, size_t input_rows_count) const override {
205
2.28k
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
44
            auto impl_func = [&](FunctionContext* context, Block& block,
207
44
                                 const ColumnNumbers& arguments, uint32_t result,
208
44
                                 size_t input_rows_count) {
209
44
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
44
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
208
22
                                 size_t input_rows_count) {
209
22
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
22
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
208
22
                                 size_t input_rows_count) {
209
22
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
22
            };
211
44
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
44
                                                        input_rows_count, impl_func);
213
2.24k
        } else {
214
2.24k
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
2.24k
        }
216
2.28k
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
54
                        uint32_t result, size_t input_rows_count) const override {
205
54
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
0
            auto impl_func = [&](FunctionContext* context, Block& block,
207
0
                                 const ColumnNumbers& arguments, uint32_t result,
208
0
                                 size_t input_rows_count) {
209
0
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
0
            };
211
0
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
0
                                                        input_rows_count, impl_func);
213
54
        } else {
214
54
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
54
        }
216
54
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
2.14k
                        uint32_t result, size_t input_rows_count) const override {
205
2.14k
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
0
            auto impl_func = [&](FunctionContext* context, Block& block,
207
0
                                 const ColumnNumbers& arguments, uint32_t result,
208
0
                                 size_t input_rows_count) {
209
0
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
0
            };
211
0
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
0
                                                        input_rows_count, impl_func);
213
2.14k
        } else {
214
2.14k
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
2.14k
        }
216
2.14k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
17
                        uint32_t result, size_t input_rows_count) const override {
205
17
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
0
            auto impl_func = [&](FunctionContext* context, Block& block,
207
0
                                 const ColumnNumbers& arguments, uint32_t result,
208
0
                                 size_t input_rows_count) {
209
0
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
0
            };
211
0
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
0
                                                        input_rows_count, impl_func);
213
17
        } else {
214
17
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
17
        }
216
17
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
23
                        uint32_t result, size_t input_rows_count) const override {
205
23
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
0
            auto impl_func = [&](FunctionContext* context, Block& block,
207
0
                                 const ColumnNumbers& arguments, uint32_t result,
208
0
                                 size_t input_rows_count) {
209
0
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
0
            };
211
0
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
0
                                                        input_rows_count, impl_func);
213
23
        } else {
214
23
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
23
        }
216
23
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
21
                        uint32_t result, size_t input_rows_count) const override {
205
21
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
21
            auto impl_func = [&](FunctionContext* context, Block& block,
207
21
                                 const ColumnNumbers& arguments, uint32_t result,
208
21
                                 size_t input_rows_count) {
209
21
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
21
            };
211
21
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
21
                                                        input_rows_count, impl_func);
213
21
        } else {
214
0
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
0
        }
216
21
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
204
22
                        uint32_t result, size_t input_rows_count) const override {
205
23
        if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) {
206
23
            auto impl_func = [&](FunctionContext* context, Block& block,
207
23
                                 const ColumnNumbers& arguments, uint32_t result,
208
23
                                 size_t input_rows_count) {
209
23
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
210
23
            };
211
23
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
212
23
                                                        input_rows_count, impl_func);
213
18.4E
        } else {
214
18.4E
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
215
18.4E
        }
216
22
    }
217
218
    Status execute_impl_internal(FunctionContext* context, Block& block,
219
                                 const ColumnNumbers& arguments, uint32_t result,
220
2.28k
                                 size_t input_rows_count) const {
221
2.28k
        size_t argument_size = arguments.size();
222
2.28k
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
6.89k
        for (size_t i = 0; i < argument_size; ++i) {
225
4.60k
            argument_columns[i] =
226
4.60k
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
4.60k
        }
228
229
2.28k
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
2.28k
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
2.28k
                                                ColumnComplexType<ResultDataType::PType>,
232
2.28k
                                                ColumnVector<ResultDataType::PType>>;
233
2.28k
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
2.28k
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
2.28k
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
2.28k
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
62
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
62
        }
241
242
2.28k
        col_res = ColVecResult::create();
243
244
2.28k
        auto& vec_res = col_res->get_data();
245
2.28k
        vec_res.resize(input_rows_count);
246
247
2.28k
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
2.28k
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
2.28k
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
62
            block.replace_by_position(
251
62
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
2.22k
        } else {
253
2.22k
            block.replace_by_position(result, std::move(col_res));
254
2.22k
        }
255
2.28k
        return Status::OK();
256
2.28k
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
54
                                 size_t input_rows_count) const {
221
54
        size_t argument_size = arguments.size();
222
54
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
172
        for (size_t i = 0; i < argument_size; ++i) {
225
118
            argument_columns[i] =
226
118
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
118
        }
228
229
54
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
54
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
54
                                                ColumnComplexType<ResultDataType::PType>,
232
54
                                                ColumnVector<ResultDataType::PType>>;
233
54
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
54
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
54
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
54
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
25
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
25
        }
241
242
54
        col_res = ColVecResult::create();
243
244
54
        auto& vec_res = col_res->get_data();
245
54
        vec_res.resize(input_rows_count);
246
247
54
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
54
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
54
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
25
            block.replace_by_position(
251
25
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
29
        } else {
253
29
            block.replace_by_position(result, std::move(col_res));
254
29
        }
255
54
        return Status::OK();
256
54
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
2.14k
                                 size_t input_rows_count) const {
221
2.14k
        size_t argument_size = arguments.size();
222
2.14k
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
6.44k
        for (size_t i = 0; i < argument_size; ++i) {
225
4.30k
            argument_columns[i] =
226
4.30k
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
4.30k
        }
228
229
2.14k
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
2.14k
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
2.14k
                                                ColumnComplexType<ResultDataType::PType>,
232
2.14k
                                                ColumnVector<ResultDataType::PType>>;
233
2.14k
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
2.14k
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
2.14k
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
2.14k
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
0
        }
241
242
2.14k
        col_res = ColVecResult::create();
243
244
2.14k
        auto& vec_res = col_res->get_data();
245
2.14k
        vec_res.resize(input_rows_count);
246
247
2.14k
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
2.14k
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
2.14k
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
0
            block.replace_by_position(
251
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
2.14k
        } else {
253
2.14k
            block.replace_by_position(result, std::move(col_res));
254
2.14k
        }
255
2.14k
        return Status::OK();
256
2.14k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
18
                                 size_t input_rows_count) const {
221
18
        size_t argument_size = arguments.size();
222
18
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
53
        for (size_t i = 0; i < argument_size; ++i) {
225
35
            argument_columns[i] =
226
35
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
35
        }
228
229
18
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
18
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
18
                                                ColumnComplexType<ResultDataType::PType>,
232
18
                                                ColumnVector<ResultDataType::PType>>;
233
18
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
18
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
18
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
18
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
0
        }
241
242
18
        col_res = ColVecResult::create();
243
244
18
        auto& vec_res = col_res->get_data();
245
18
        vec_res.resize(input_rows_count);
246
247
18
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
18
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
18
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
0
            block.replace_by_position(
251
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
18
        } else {
253
18
            block.replace_by_position(result, std::move(col_res));
254
18
        }
255
18
        return Status::OK();
256
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
23
                                 size_t input_rows_count) const {
221
23
        size_t argument_size = arguments.size();
222
23
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
74
        for (size_t i = 0; i < argument_size; ++i) {
225
51
            argument_columns[i] =
226
51
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
51
        }
228
229
23
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
23
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
23
                                                ColumnComplexType<ResultDataType::PType>,
232
23
                                                ColumnVector<ResultDataType::PType>>;
233
23
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
23
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
23
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
23
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
13
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
13
        }
241
242
23
        col_res = ColVecResult::create();
243
244
23
        auto& vec_res = col_res->get_data();
245
23
        vec_res.resize(input_rows_count);
246
247
23
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
23
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
23
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
13
            block.replace_by_position(
251
13
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
13
        } else {
253
10
            block.replace_by_position(result, std::move(col_res));
254
10
        }
255
23
        return Status::OK();
256
23
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
23
                                 size_t input_rows_count) const {
221
23
        size_t argument_size = arguments.size();
222
23
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
72
        for (size_t i = 0; i < argument_size; ++i) {
225
49
            argument_columns[i] =
226
49
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
49
        }
228
229
23
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
23
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
23
                                                ColumnComplexType<ResultDataType::PType>,
232
23
                                                ColumnVector<ResultDataType::PType>>;
233
23
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
23
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
23
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
23
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
12
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
12
        }
241
242
23
        col_res = ColVecResult::create();
243
244
23
        auto& vec_res = col_res->get_data();
245
23
        vec_res.resize(input_rows_count);
246
247
23
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
23
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
23
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
12
            block.replace_by_position(
251
12
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
12
        } else {
253
11
            block.replace_by_position(result, std::move(col_res));
254
11
        }
255
23
        return Status::OK();
256
23
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
220
22
                                 size_t input_rows_count) const {
221
22
        size_t argument_size = arguments.size();
222
22
        std::vector<ColumnPtr> argument_columns(argument_size);
223
224
73
        for (size_t i = 0; i < argument_size; ++i) {
225
51
            argument_columns[i] =
226
51
                    block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
227
51
        }
228
229
22
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
230
22
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
231
22
                                                ColumnComplexType<ResultDataType::PType>,
232
22
                                                ColumnVector<ResultDataType::PType>>;
233
22
        typename ColVecResult::MutablePtr col_res = nullptr;
234
235
22
        typename ColumnUInt8::MutablePtr col_res_nulls;
236
22
        auto& result_info = block.get_by_position(result);
237
        // special case for bitmap_or and bitmap_or_count
238
22
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
239
12
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
240
12
        }
241
242
22
        col_res = ColVecResult::create();
243
244
22
        auto& vec_res = col_res->get_data();
245
22
        vec_res.resize(input_rows_count);
246
247
22
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
248
22
                                            input_rows_count, vec_res, col_res_nulls.get()));
249
23
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
250
12
            block.replace_by_position(
251
12
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
252
12
        } else {
253
10
            block.replace_by_position(result, std::move(col_res));
254
10
        }
255
22
        return Status::OK();
256
22
    }
257
258
private:
259
6.94k
    bool is_count() const {
260
6.94k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
6.94k
                std::is_same_v<Impl, BitmapXorCount>);
262
6.94k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE8is_countEv
Line
Count
Source
259
6.56k
    bool is_count() const {
260
6.56k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
6.56k
                std::is_same_v<Impl, BitmapXorCount>);
262
6.56k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE8is_countEv
Line
Count
Source
259
91
    bool is_count() const {
260
91
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
91
                std::is_same_v<Impl, BitmapXorCount>);
262
91
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE8is_countEv
Line
Count
Source
259
98
    bool is_count() const {
260
98
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
98
                std::is_same_v<Impl, BitmapXorCount>);
262
98
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE8is_countEv
Line
Count
Source
259
98
    bool is_count() const {
260
98
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
98
                std::is_same_v<Impl, BitmapXorCount>);
262
98
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE8is_countEv
Line
Count
Source
259
97
    bool is_count() const {
260
97
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
261
97
                std::is_same_v<Impl, BitmapXorCount>);
262
97
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE8is_countEv
263
};
264
265
using FunctionBitmapOr = FunctionBitMapVariadic<BitmapOr>;
266
using FunctionBitmapXor = FunctionBitMapVariadic<BitmapXor>;
267
using FunctionBitmapAnd = FunctionBitMapVariadic<BitmapAnd>;
268
using FunctionBitmapOrCount = FunctionBitMapVariadic<BitmapOrCount>;
269
using FunctionBitmapAndCount = FunctionBitMapVariadic<BitmapAndCount>;
270
using FunctionBitmapXorCount = FunctionBitMapVariadic<BitmapXorCount>;
271
272
5
void register_function_bitmap_variadic(SimpleFunctionFactory& factory) {
273
5
    factory.register_function<FunctionBitmapOr>();
274
5
    factory.register_function<FunctionBitmapXor>();
275
5
    factory.register_function<FunctionBitmapAnd>();
276
5
    factory.register_function<FunctionBitmapOrCount>();
277
5
    factory.register_function<FunctionBitmapAndCount>();
278
5
    factory.register_function<FunctionBitmapXorCount>();
279
5
}
280
} // namespace doris