Coverage Report

Created: 2026-07-28 08:37

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
34
    const auto& nested_col_ptr = nullable->get_nested_column_ptr();                            \
56
34
    const auto* __restrict null_map_data = nullable->get_null_map_data().data();               \
57
34
    const auto& mid_data = assert_cast<const ColumnBitmap*>(nested_col_ptr.get())->get_data(); \
58
77
    for (size_t row = 0; row < input_rows_count; ++row) {                                      \
59
43
        if (!null_map_data[row]) {                                                             \
60
20
            res[row] op mid_data[row];                                                         \
61
20
        }                                                                                      \
62
43
    }
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
674
                                    IColumn* res_nulls) {                                         \
71
674
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
674
            int nullable_cols_count = 0;                                                          \
73
674
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
674
            if (res_nulls) {                                                                      \
75
22
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
22
            }                                                                                     \
77
674
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
14
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
14
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
660
            } else {                                                                              \
81
660
                const auto& mid_data =                                                            \
82
660
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
11.1k
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
10.4k
                    res[row] = mid_data[row];                                                     \
85
10.4k
                }                                                                                 \
86
660
            }                                                                                     \
87
1.36k
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
693
                if (auto* nullable =                                                              \
89
693
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
20
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
20
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
673
                } else {                                                                          \
93
673
                    const auto& col_data =                                                        \
94
673
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
673
                                    ->get_data();                                                 \
96
11.1k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
10.4k
                        res[row] OP col_data[row];                                                \
98
10.4k
                    }                                                                             \
99
673
                }                                                                                 \
100
693
            }                                                                                     \
101
674
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
11
                const auto* null_map_data = null_map_datas[0];                                    \
103
24
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
13
                    res_nulls_data[row] = null_map_data[row];                                     \
105
13
                }                                                                                 \
106
22
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
11
                    null_map_data = null_map_datas[i];                                            \
108
24
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
13
                        res_nulls_data[row] &= null_map_data[row];                                \
110
13
                    }                                                                             \
111
11
                }                                                                                 \
112
11
            }                                                                                     \
113
674
            return Status::OK();                                                                  \
114
674
        }                                                                                         \
_ZN5doris8BitmapOr13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
49
                                    IColumn* res_nulls) {                                         \
71
49
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
49
            int nullable_cols_count = 0;                                                          \
73
49
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
49
            if (res_nulls) {                                                                      \
75
22
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
22
            }                                                                                     \
77
49
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
14
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
14
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
35
            } else {                                                                              \
81
35
                const auto& mid_data =                                                            \
82
35
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
96
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
61
                    res[row] = mid_data[row];                                                     \
85
61
                }                                                                                 \
86
35
            }                                                                                     \
87
108
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
59
                if (auto* nullable =                                                              \
89
59
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
20
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
20
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
39
                } else {                                                                          \
93
39
                    const auto& col_data =                                                        \
94
39
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
39
                                    ->get_data();                                                 \
96
99
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
60
                        res[row] OP col_data[row];                                                \
98
60
                    }                                                                             \
99
39
                }                                                                                 \
100
59
            }                                                                                     \
101
49
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
11
                const auto* null_map_data = null_map_datas[0];                                    \
103
24
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
13
                    res_nulls_data[row] = null_map_data[row];                                     \
105
13
                }                                                                                 \
106
22
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
11
                    null_map_data = null_map_datas[i];                                            \
108
24
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
13
                        res_nulls_data[row] &= null_map_data[row];                                \
110
13
                    }                                                                             \
111
11
                }                                                                                 \
112
11
            }                                                                                     \
113
49
            return Status::OK();                                                                  \
114
49
        }                                                                                         \
_ZN5doris9BitmapXor13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
607
                                    IColumn* res_nulls) {                                         \
71
607
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
607
            int nullable_cols_count = 0;                                                          \
73
607
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
607
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
607
            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
607
            } else {                                                                              \
81
607
                const auto& mid_data =                                                            \
82
607
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
10.9k
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
10.3k
                    res[row] = mid_data[row];                                                     \
85
10.3k
                }                                                                                 \
86
607
            }                                                                                     \
87
1.22k
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
613
                if (auto* nullable =                                                              \
89
613
                            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
613
                } else {                                                                          \
93
613
                    const auto& col_data =                                                        \
94
613
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
613
                                    ->get_data();                                                 \
96
10.9k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
10.3k
                        res[row] OP col_data[row];                                                \
98
10.3k
                    }                                                                             \
99
613
                }                                                                                 \
100
613
            }                                                                                     \
101
607
            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
607
            return Status::OK();                                                                  \
114
607
        }                                                                                         \
_ZN5doris9BitmapAnd13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
18
                                    IColumn* res_nulls) {                                         \
71
18
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
18
            int nullable_cols_count = 0;                                                          \
73
18
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
18
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
18
            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
18
            } else {                                                                              \
81
18
                const auto& mid_data =                                                            \
82
18
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
60
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
42
                    res[row] = mid_data[row];                                                     \
85
42
                }                                                                                 \
86
18
            }                                                                                     \
87
39
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
21
                if (auto* nullable =                                                              \
89
21
                            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
21
                } else {                                                                          \
93
21
                    const auto& col_data =                                                        \
94
21
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
21
                                    ->get_data();                                                 \
96
66
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
45
                        res[row] OP col_data[row];                                                \
98
45
                    }                                                                             \
99
21
                }                                                                                 \
100
21
            }                                                                                     \
101
18
            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
18
            return Status::OK();                                                                  \
114
18
        }                                                                                         \
115
    }
116
117
#define BITMAP_FUNCTION_COUNT_VARIADIC(CLASS, FUNCTION_NAME, OP, COUNT_OP)                        \
118
    struct CLASS {                                                                                \
119
    public:                                                                                       \
120
        static constexpr auto name = #FUNCTION_NAME;                                              \
121
        using ResultDataType = DataTypeInt64;                                                     \
122
        using TData = std::vector<BitmapValue>;                                                   \
123
        using ResTData = typename ColumnInt64::Container;                                         \
124
        static Status vector_vector(ColumnPtr argument_columns[], size_t col_size,                \
125
121
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
126
121
            DCHECK_GE(col_size, 2);                                                               \
127
121
            if (col_size == 2) {                                                                  \
128
109
                const auto lhs = make_bitmap_column_accessor(argument_columns[0]);                \
129
109
                const auto rhs = make_bitmap_column_accessor(argument_columns[1]);                \
130
319
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
131
210
                    const auto* lhs_value = lhs.is_null_at(row) ? nullptr : &lhs.get_value(row);  \
132
210
                    const auto* rhs_value = rhs.is_null_at(row) ? nullptr : &rhs.get_value(row);  \
133
210
                    if (!lhs_value || !rhs_value) {                                               \
134
28
                        if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                     \
135
28
                            const auto* value = lhs_value ? lhs_value : rhs_value;                \
136
28
                            res[row] = value ? value->cardinality() : 0;                          \
137
28
                        } else {                                                                  \
138
0
                            res[row] = 0;                                                         \
139
0
                        }                                                                         \
140
182
                    } else {                                                                      \
141
182
                        res[row] = lhs_value->COUNT_OP(*rhs_value);                               \
142
182
                    }                                                                             \
143
210
                }                                                                                 \
144
109
                return Status::OK();                                                              \
145
109
            }                                                                                     \
146
121
            TData vals(input_rows_count);                                                         \
147
12
            const auto first_column = make_bitmap_column_accessor(argument_columns[0]);           \
148
33
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
149
21
                if (!first_column.is_null_at(row)) {                                              \
150
20
                    vals[row] = first_column.get_value(row);                                      \
151
20
                }                                                                                 \
152
21
            }                                                                                     \
153
31
            for (size_t col = 1; col + 1 < col_size; ++col) {                                     \
154
19
                const auto column = make_bitmap_column_accessor(argument_columns[col]);           \
155
47
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
156
28
                    if (!column.is_null_at(row)) {                                                \
157
28
                        vals[row] OP column.get_value(row);                                       \
158
28
                    }                                                                             \
159
28
                }                                                                                 \
160
19
            }                                                                                     \
161
12
            const auto last_column = make_bitmap_column_accessor(argument_columns[col_size - 1]); \
162
33
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
163
21
                const auto* lhs_value = &vals[row];                                               \
164
21
                const auto* rhs_value =                                                           \
165
21
                        last_column.is_null_at(row) ? nullptr : &last_column.get_value(row);      \
166
21
                if (!rhs_value) {                                                                 \
167
3
                    if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                         \
168
3
                        res[row] = lhs_value->cardinality();                                      \
169
3
                    } else {                                                                      \
170
0
                        res[row] = 0;                                                             \
171
0
                    }                                                                             \
172
18
                } else {                                                                          \
173
18
                    res[row] = lhs_value->COUNT_OP(*rhs_value);                                   \
174
18
                }                                                                                 \
175
21
            }                                                                                     \
176
12
            return Status::OK();                                                                  \
177
121
        }                                                                                         \
178
                                                                                                  \
179
    private:                                                                                      \
180
        struct BitmapColumnAccessor {                                                             \
181
            const std::vector<BitmapValue>* values = nullptr;                                     \
182
            const BitmapValue* const_value = nullptr;                                             \
183
            const ColumnUInt8::value_type* null_map_data = nullptr;                               \
184
            bool is_const = false;                                                                \
185
            bool is_const_null = false;                                                           \
186
                                                                                                  \
187
490
            bool is_null_at(size_t row) const {                                                   \
188
490
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
490
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
204
            bool is_null_at(size_t row) const {                                                   \
188
204
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
204
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
143
            bool is_null_at(size_t row) const {                                                   \
188
143
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
143
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
143
            bool is_null_at(size_t row) const {                                                   \
188
143
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
143
            }                                                                                     \
190
                                                                                                  \
191
451
            const BitmapValue& get_value(size_t row) const {                                      \
192
451
                return is_const ? *const_value : (*values)[row];                                  \
193
451
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
165
            const BitmapValue& get_value(size_t row) const {                                      \
192
165
                return is_const ? *const_value : (*values)[row];                                  \
193
165
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
143
            const BitmapValue& get_value(size_t row) const {                                      \
192
143
                return is_const ? *const_value : (*values)[row];                                  \
193
143
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
143
            const BitmapValue& get_value(size_t row) const {                                      \
192
143
                return is_const ? *const_value : (*values)[row];                                  \
193
143
            }                                                                                     \
194
        };                                                                                        \
195
                                                                                                  \
196
261
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
261
            BitmapColumnAccessor accessor;                                                        \
198
261
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
261
            accessor.is_const = is_const;                                                         \
200
261
            const IColumn* data_column = data_column_ptr.get();                                   \
201
261
                                                                                                  \
202
261
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
63
                if (accessor.is_const) {                                                          \
204
2
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
61
                } else {                                                                          \
206
61
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
61
                }                                                                                 \
208
63
                data_column = nullable->get_nested_column_ptr().get();                            \
209
63
            }                                                                                     \
210
261
                                                                                                  \
211
261
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
261
            if (accessor.is_const) {                                                              \
213
2
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
259
            } else {                                                                              \
215
259
                accessor.values = &bitmap_column->get_data();                                     \
216
259
            }                                                                                     \
217
261
                                                                                                  \
218
261
            return accessor;                                                                      \
219
261
        }                                                                                         \
_ZN5doris13BitmapOrCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
121
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
121
            BitmapColumnAccessor accessor;                                                        \
198
121
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
121
            accessor.is_const = is_const;                                                         \
200
121
            const IColumn* data_column = data_column_ptr.get();                                   \
201
121
                                                                                                  \
202
121
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
63
                if (accessor.is_const) {                                                          \
204
2
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
61
                } else {                                                                          \
206
61
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
61
                }                                                                                 \
208
63
                data_column = nullable->get_nested_column_ptr().get();                            \
209
63
            }                                                                                     \
210
121
                                                                                                  \
211
121
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
121
            if (accessor.is_const) {                                                              \
213
2
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
119
            } else {                                                                              \
215
119
                accessor.values = &bitmap_column->get_data();                                     \
216
119
            }                                                                                     \
217
121
                                                                                                  \
218
121
            return accessor;                                                                      \
219
121
        }                                                                                         \
_ZN5doris14BitmapAndCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
70
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
70
            BitmapColumnAccessor accessor;                                                        \
198
70
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
70
            accessor.is_const = is_const;                                                         \
200
70
            const IColumn* data_column = data_column_ptr.get();                                   \
201
70
                                                                                                  \
202
70
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
0
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
0
                } else {                                                                          \
206
0
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
0
                }                                                                                 \
208
0
                data_column = nullable->get_nested_column_ptr().get();                            \
209
0
            }                                                                                     \
210
70
                                                                                                  \
211
70
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
70
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
70
            } else {                                                                              \
215
70
                accessor.values = &bitmap_column->get_data();                                     \
216
70
            }                                                                                     \
217
70
                                                                                                  \
218
70
            return accessor;                                                                      \
219
70
        }                                                                                         \
_ZN5doris14BitmapXorCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
70
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
70
            BitmapColumnAccessor accessor;                                                        \
198
70
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
70
            accessor.is_const = is_const;                                                         \
200
70
            const IColumn* data_column = data_column_ptr.get();                                   \
201
70
                                                                                                  \
202
70
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
0
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
0
                } else {                                                                          \
206
0
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
0
                }                                                                                 \
208
0
                data_column = nullable->get_nested_column_ptr().get();                            \
209
0
            }                                                                                     \
210
70
                                                                                                  \
211
70
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
70
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
70
            } else {                                                                              \
215
70
                accessor.values = &bitmap_column->get_data();                                     \
216
70
            }                                                                                     \
217
70
                                                                                                  \
218
70
            return accessor;                                                                      \
219
70
        }                                                                                         \
220
    }
221
222
BITMAP_FUNCTION_VARIADIC(BitmapOr, bitmap_or, |=);
223
BITMAP_FUNCTION_VARIADIC(BitmapAnd, bitmap_and, &=);
224
BITMAP_FUNCTION_VARIADIC(BitmapXor, bitmap_xor, ^=);
225
57
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapOrCount, bitmap_or_count, |=, or_cardinality);
226
32
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapAndCount, bitmap_and_count, &=, and_cardinality);
227
32
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapXorCount, bitmap_xor_count, ^=, xor_cardinality);
228
229
Status execute_bitmap_op_count_null_to_zero(
230
        FunctionContext* context, Block& block, const ColumnNumbers& arguments, uint32_t result,
231
        size_t input_rows_count,
232
        const std::function<Status(FunctionContext*, Block&, const ColumnNumbers&, size_t, size_t)>&
233
                exec_impl_func);
234
235
template <typename Impl, bool NewVersion = false>
236
class FunctionBitMapVariadic : public IFunction {
237
    static_assert(!NewVersion || (NewVersion && (std::is_same_v<Impl, BitmapOrCount> ||
238
                                                 std::is_same_v<Impl, BitmapAndCount> ||
239
                                                 std::is_same_v<Impl, BitmapXorCount>)));
240
241
public:
242
    static constexpr auto name = []() constexpr {
243
        if constexpr (!NewVersion) {
244
            return Impl::name;
245
        } else if constexpr (std::is_same_v<Impl, BitmapOrCount>) {
246
            return "bitmap_or_count_v2";
247
        } else if constexpr (std::is_same_v<Impl, BitmapAndCount>) {
248
            return "bitmap_and_count_v2";
249
        } else if constexpr (std::is_same_v<Impl, BitmapXorCount>) {
250
            return "bitmap_xor_count_v2";
251
        } else {
252
            return Impl::name;
253
        }
254
    }();
255
256
265
    static FunctionPtr create() {
257
265
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
265
    }
_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE6createEv
Line
Count
Source
256
41
    static FunctionPtr create() {
257
41
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
41
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE6createEv
Line
Count
Source
256
55
    static FunctionPtr create() {
257
55
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
55
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE6createEv
Line
Count
Source
256
20
    static FunctionPtr create() {
257
20
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
20
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE6createEv
Line
Count
Source
256
13
    static FunctionPtr create() {
257
13
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
13
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE6createEv
Line
Count
Source
256
12
    static FunctionPtr create() {
257
12
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
12
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE6createEv
Line
Count
Source
256
12
    static FunctionPtr create() {
257
12
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
12
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE6createEv
Line
Count
Source
256
46
    static FunctionPtr create() {
257
46
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
46
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE6createEv
Line
Count
Source
256
33
    static FunctionPtr create() {
257
33
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
33
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE6createEv
Line
Count
Source
256
33
    static FunctionPtr create() {
257
33
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
33
    }
259
260
3
    String get_name() const override { return name; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE8get_nameB5cxx11Ev
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
261
262
0
    size_t get_number_of_arguments() const override { return 0; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE23get_number_of_argumentsEv
263
264
193
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE11is_variadicEv
Line
Count
Source
264
33
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE11is_variadicEv
Line
Count
Source
264
47
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE11is_variadicEv
Line
Count
Source
264
12
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE11is_variadicEv
Line
Count
Source
264
5
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE11is_variadicEv
Line
Count
Source
264
4
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE11is_variadicEv
Line
Count
Source
264
4
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE11is_variadicEv
Line
Count
Source
264
38
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE11is_variadicEv
Line
Count
Source
264
25
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE11is_variadicEv
Line
Count
Source
264
25
    bool is_variadic() const override { return true; }
265
266
184
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
184
        using ResultDataType = typename Impl::ResultDataType;
268
184
        if constexpr (NewVersion) {
269
85
            return std::make_shared<ResultDataType>();
270
85
        }
271
184
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
42
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
90
            for (size_t i = 0; i < arguments.size(); ++i) {
275
73
                if (arguments[i]->is_nullable()) {
276
25
                    return_nullable = true;
277
25
                    break;
278
25
                }
279
73
            }
280
42
            auto result_type = std::make_shared<ResultDataType>();
281
42
            return return_nullable ? make_nullable(result_type) : result_type;
282
142
        } else {
283
142
            return std::make_shared<ResultDataType>();
284
142
        }
285
184
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
32
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
32
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
32
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
32
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
80
            for (size_t i = 0; i < arguments.size(); ++i) {
275
63
                if (arguments[i]->is_nullable()) {
276
15
                    return_nullable = true;
277
15
                    break;
278
15
                }
279
63
            }
280
32
            auto result_type = std::make_shared<ResultDataType>();
281
32
            return return_nullable ? make_nullable(result_type) : result_type;
282
32
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
32
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
46
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
46
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
46
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
0
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
0
            for (size_t i = 0; i < arguments.size(); ++i) {
275
0
                if (arguments[i]->is_nullable()) {
276
0
                    return_nullable = true;
277
0
                    break;
278
0
                }
279
0
            }
280
0
            auto result_type = std::make_shared<ResultDataType>();
281
0
            return return_nullable ? make_nullable(result_type) : result_type;
282
46
        } else {
283
46
            return std::make_shared<ResultDataType>();
284
46
        }
285
46
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
11
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
11
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
11
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
0
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
0
            for (size_t i = 0; i < arguments.size(); ++i) {
275
0
                if (arguments[i]->is_nullable()) {
276
0
                    return_nullable = true;
277
0
                    break;
278
0
                }
279
0
            }
280
0
            auto result_type = std::make_shared<ResultDataType>();
281
0
            return return_nullable ? make_nullable(result_type) : result_type;
282
11
        } else {
283
11
            return std::make_shared<ResultDataType>();
284
11
        }
285
11
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
4
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
4
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
4
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
4
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
4
            for (size_t i = 0; i < arguments.size(); ++i) {
275
4
                if (arguments[i]->is_nullable()) {
276
4
                    return_nullable = true;
277
4
                    break;
278
4
                }
279
4
            }
280
4
            auto result_type = std::make_shared<ResultDataType>();
281
4
            return return_nullable ? make_nullable(result_type) : result_type;
282
4
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
4
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
3
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
3
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
3
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
3
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
3
            for (size_t i = 0; i < arguments.size(); ++i) {
275
3
                if (arguments[i]->is_nullable()) {
276
3
                    return_nullable = true;
277
3
                    break;
278
3
                }
279
3
            }
280
3
            auto result_type = std::make_shared<ResultDataType>();
281
3
            return return_nullable ? make_nullable(result_type) : result_type;
282
3
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
3
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
3
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
3
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
3
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
3
            for (size_t i = 0; i < arguments.size(); ++i) {
275
3
                if (arguments[i]->is_nullable()) {
276
3
                    return_nullable = true;
277
3
                    break;
278
3
                }
279
3
            }
280
3
            auto result_type = std::make_shared<ResultDataType>();
281
3
            return return_nullable ? make_nullable(result_type) : result_type;
282
3
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
37
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
37
        using ResultDataType = typename Impl::ResultDataType;
268
37
        if constexpr (NewVersion) {
269
37
            return std::make_shared<ResultDataType>();
270
37
        }
271
37
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
0
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
0
            for (size_t i = 0; i < arguments.size(); ++i) {
275
0
                if (arguments[i]->is_nullable()) {
276
0
                    return_nullable = true;
277
0
                    break;
278
0
                }
279
0
            }
280
0
            auto result_type = std::make_shared<ResultDataType>();
281
0
            return return_nullable ? make_nullable(result_type) : result_type;
282
37
        } else {
283
37
            return std::make_shared<ResultDataType>();
284
37
        }
285
37
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
24
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
24
        using ResultDataType = typename Impl::ResultDataType;
268
24
        if constexpr (NewVersion) {
269
24
            return std::make_shared<ResultDataType>();
270
24
        }
271
24
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
0
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
0
            for (size_t i = 0; i < arguments.size(); ++i) {
275
0
                if (arguments[i]->is_nullable()) {
276
0
                    return_nullable = true;
277
0
                    break;
278
0
                }
279
0
            }
280
0
            auto result_type = std::make_shared<ResultDataType>();
281
0
            return return_nullable ? make_nullable(result_type) : result_type;
282
24
        } else {
283
24
            return std::make_shared<ResultDataType>();
284
24
        }
285
24
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
24
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
24
        using ResultDataType = typename Impl::ResultDataType;
268
24
        if constexpr (NewVersion) {
269
24
            return std::make_shared<ResultDataType>();
270
24
        }
271
24
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
0
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
0
            for (size_t i = 0; i < arguments.size(); ++i) {
275
0
                if (arguments[i]->is_nullable()) {
276
0
                    return_nullable = true;
277
0
                    break;
278
0
                }
279
0
            }
280
0
            auto result_type = std::make_shared<ResultDataType>();
281
0
            return return_nullable ? make_nullable(result_type) : result_type;
282
24
        } else {
283
24
            return std::make_shared<ResultDataType>();
284
24
        }
285
24
    }
286
287
2.58k
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
2.58k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
2.58k
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
179
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
179
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
179
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
1.87k
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
1.87k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
1.87k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
73
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
73
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
73
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
13
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
13
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
13
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
9
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
9
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
9
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
9
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
9
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
9
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
199
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
199
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
199
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
114
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
114
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
114
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
114
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
114
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
114
    }
293
294
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
295
795
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
64
                      std::is_same_v<Impl, BitmapXorCount>) {
298
64
            auto impl_func = [&](FunctionContext* context, Block& block,
299
64
                                 const ColumnNumbers& arguments, uint32_t result,
300
64
                                 size_t input_rows_count) {
301
64
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
64
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
64
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
64
                                                        input_rows_count, impl_func);
305
731
        } else {
306
731
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
731
        }
308
795
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
49
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
49
        } else {
306
49
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
49
        }
308
49
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
607
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
607
        } else {
306
607
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
607
        }
308
607
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
18
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
18
        } else {
306
18
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
18
        }
308
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
3
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
3
        } else {
306
3
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
3
        }
308
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
2
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
2
                      std::is_same_v<Impl, BitmapXorCount>) {
298
2
            auto impl_func = [&](FunctionContext* context, Block& block,
299
2
                                 const ColumnNumbers& arguments, uint32_t result,
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
303
2
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
2
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
2
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
2
                      std::is_same_v<Impl, BitmapXorCount>) {
298
2
            auto impl_func = [&](FunctionContext* context, Block& block,
299
2
                                 const ColumnNumbers& arguments, uint32_t result,
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
303
2
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
2
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
54
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
54
        } else {
306
54
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
54
        }
308
54
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
30
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
30
                      std::is_same_v<Impl, BitmapXorCount>) {
298
30
            auto impl_func = [&](FunctionContext* context, Block& block,
299
30
                                 const ColumnNumbers& arguments, uint32_t result,
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
30
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
30
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
30
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
30
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
30
                      std::is_same_v<Impl, BitmapXorCount>) {
298
30
            auto impl_func = [&](FunctionContext* context, Block& block,
299
30
                                 const ColumnNumbers& arguments, uint32_t result,
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
30
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
30
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
30
    }
309
310
    Status execute_impl_internal(FunctionContext* context, Block& block,
311
                                 const ColumnNumbers& arguments, uint32_t result,
312
795
                                 size_t input_rows_count) const {
313
795
        size_t argument_size = arguments.size();
314
315
795
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
795
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
795
                                                ColumnComplexType<ResultDataType::PType>,
318
795
                                                ColumnVector<ResultDataType::PType>>;
319
795
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
795
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
795
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
795
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
29
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
29
        }
327
328
795
        col_res = ColVecResult::create();
329
330
795
        auto& vec_res = col_res->get_data();
331
795
        vec_res.resize(input_rows_count);
332
333
795
        std::vector<ColumnPtr> argument_columns(argument_size);
334
2.42k
        for (size_t i = 0; i < argument_size; ++i) {
335
1.62k
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
1.36k
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
1.36k
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
1.36k
            }
341
1.62k
        }
342
795
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
795
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
795
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
29
            block.replace_by_position(
347
29
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
766
        } else {
349
766
            block.replace_by_position(result, std::move(col_res));
350
766
        }
351
795
        return Status::OK();
352
795
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
49
                                 size_t input_rows_count) const {
313
49
        size_t argument_size = arguments.size();
314
315
49
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
49
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
49
                                                ColumnComplexType<ResultDataType::PType>,
318
49
                                                ColumnVector<ResultDataType::PType>>;
319
49
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
49
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
49
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
49
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
22
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
22
        }
327
328
49
        col_res = ColVecResult::create();
329
330
49
        auto& vec_res = col_res->get_data();
331
49
        vec_res.resize(input_rows_count);
332
333
49
        std::vector<ColumnPtr> argument_columns(argument_size);
334
157
        for (size_t i = 0; i < argument_size; ++i) {
335
108
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
108
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
108
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
108
            }
341
108
        }
342
49
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
49
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
49
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
22
            block.replace_by_position(
347
22
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
27
        } else {
349
27
            block.replace_by_position(result, std::move(col_res));
350
27
        }
351
49
        return Status::OK();
352
49
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
607
                                 size_t input_rows_count) const {
313
607
        size_t argument_size = arguments.size();
314
315
607
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
607
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
607
                                                ColumnComplexType<ResultDataType::PType>,
318
607
                                                ColumnVector<ResultDataType::PType>>;
319
607
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
607
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
607
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
607
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
327
328
607
        col_res = ColVecResult::create();
329
330
607
        auto& vec_res = col_res->get_data();
331
607
        vec_res.resize(input_rows_count);
332
333
607
        std::vector<ColumnPtr> argument_columns(argument_size);
334
1.82k
        for (size_t i = 0; i < argument_size; ++i) {
335
1.22k
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
1.22k
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
1.22k
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
1.22k
            }
341
1.22k
        }
342
607
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
607
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
607
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
607
        } else {
349
607
            block.replace_by_position(result, std::move(col_res));
350
607
        }
351
607
        return Status::OK();
352
607
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
18
                                 size_t input_rows_count) const {
313
18
        size_t argument_size = arguments.size();
314
315
18
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
18
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
18
                                                ColumnComplexType<ResultDataType::PType>,
318
18
                                                ColumnVector<ResultDataType::PType>>;
319
18
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
18
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
18
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
18
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
327
328
18
        col_res = ColVecResult::create();
329
330
18
        auto& vec_res = col_res->get_data();
331
18
        vec_res.resize(input_rows_count);
332
333
18
        std::vector<ColumnPtr> argument_columns(argument_size);
334
57
        for (size_t i = 0; i < argument_size; ++i) {
335
39
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
39
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
39
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
39
            }
341
39
        }
342
18
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
18
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
18
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
18
        } else {
349
18
            block.replace_by_position(result, std::move(col_res));
350
18
        }
351
18
        return Status::OK();
352
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
3
                                 size_t input_rows_count) const {
313
3
        size_t argument_size = arguments.size();
314
315
3
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
3
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
3
                                                ColumnComplexType<ResultDataType::PType>,
318
3
                                                ColumnVector<ResultDataType::PType>>;
319
3
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
3
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
3
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
3
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
3
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
3
        }
327
328
3
        col_res = ColVecResult::create();
329
330
3
        auto& vec_res = col_res->get_data();
331
3
        vec_res.resize(input_rows_count);
332
333
3
        std::vector<ColumnPtr> argument_columns(argument_size);
334
10
        for (size_t i = 0; i < argument_size; ++i) {
335
7
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
7
        }
342
3
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
3
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
3
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
3
            block.replace_by_position(
347
3
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
3
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
3
        return Status::OK();
352
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
2
                                 size_t input_rows_count) const {
313
2
        size_t argument_size = arguments.size();
314
315
2
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
2
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
2
                                                ColumnComplexType<ResultDataType::PType>,
318
2
                                                ColumnVector<ResultDataType::PType>>;
319
2
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
2
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
2
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
2
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
2
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
2
        }
327
328
2
        col_res = ColVecResult::create();
329
330
2
        auto& vec_res = col_res->get_data();
331
2
        vec_res.resize(input_rows_count);
332
333
2
        std::vector<ColumnPtr> argument_columns(argument_size);
334
7
        for (size_t i = 0; i < argument_size; ++i) {
335
5
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
5
        }
342
2
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
2
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
2
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
2
            block.replace_by_position(
347
2
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
2
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
2
        return Status::OK();
352
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
2
                                 size_t input_rows_count) const {
313
2
        size_t argument_size = arguments.size();
314
315
2
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
2
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
2
                                                ColumnComplexType<ResultDataType::PType>,
318
2
                                                ColumnVector<ResultDataType::PType>>;
319
2
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
2
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
2
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
2
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
2
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
2
        }
327
328
2
        col_res = ColVecResult::create();
329
330
2
        auto& vec_res = col_res->get_data();
331
2
        vec_res.resize(input_rows_count);
332
333
2
        std::vector<ColumnPtr> argument_columns(argument_size);
334
7
        for (size_t i = 0; i < argument_size; ++i) {
335
5
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
5
        }
342
2
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
2
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
2
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
2
            block.replace_by_position(
347
2
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
2
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
2
        return Status::OK();
352
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
54
                                 size_t input_rows_count) const {
313
54
        size_t argument_size = arguments.size();
314
315
54
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
54
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
54
                                                ColumnComplexType<ResultDataType::PType>,
318
54
                                                ColumnVector<ResultDataType::PType>>;
319
54
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
54
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
54
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
54
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
327
328
54
        col_res = ColVecResult::create();
329
330
54
        auto& vec_res = col_res->get_data();
331
54
        vec_res.resize(input_rows_count);
332
333
54
        std::vector<ColumnPtr> argument_columns(argument_size);
334
168
        for (size_t i = 0; i < argument_size; ++i) {
335
114
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
114
        }
342
54
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
54
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
54
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
54
        } else {
349
54
            block.replace_by_position(result, std::move(col_res));
350
54
        }
351
54
        return Status::OK();
352
54
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
30
                                 size_t input_rows_count) const {
313
30
        size_t argument_size = arguments.size();
314
315
30
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
30
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
30
                                                ColumnComplexType<ResultDataType::PType>,
318
30
                                                ColumnVector<ResultDataType::PType>>;
319
30
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
30
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
30
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
30
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
327
328
30
        col_res = ColVecResult::create();
329
330
30
        auto& vec_res = col_res->get_data();
331
30
        vec_res.resize(input_rows_count);
332
333
30
        std::vector<ColumnPtr> argument_columns(argument_size);
334
95
        for (size_t i = 0; i < argument_size; ++i) {
335
65
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
65
        }
342
30
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
30
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
30
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
30
        } else {
349
30
            block.replace_by_position(result, std::move(col_res));
350
30
        }
351
30
        return Status::OK();
352
30
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
30
                                 size_t input_rows_count) const {
313
30
        size_t argument_size = arguments.size();
314
315
30
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
30
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
30
                                                ColumnComplexType<ResultDataType::PType>,
318
30
                                                ColumnVector<ResultDataType::PType>>;
319
30
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
30
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
30
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
30
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
327
328
30
        col_res = ColVecResult::create();
329
330
30
        auto& vec_res = col_res->get_data();
331
30
        vec_res.resize(input_rows_count);
332
333
30
        std::vector<ColumnPtr> argument_columns(argument_size);
334
95
        for (size_t i = 0; i < argument_size; ++i) {
335
65
            argument_columns[i] = block.get_by_position(arguments[i]).column;
336
            if constexpr (!std::is_same_v<Impl, BitmapOrCount> &&
337
                          !std::is_same_v<Impl, BitmapAndCount> &&
338
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
            }
341
65
        }
342
30
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
30
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
30
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
30
        } else {
349
30
            block.replace_by_position(result, std::move(col_res));
350
30
        }
351
30
        return Status::OK();
352
30
    }
353
354
private:
355
2.47k
    bool is_count() const {
356
2.47k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
2.47k
                std::is_same_v<Impl, BitmapXorCount>);
358
2.47k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8is_countEv
Line
Count
Source
355
1.91k
    bool is_count() const {
356
1.91k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
1.91k
                std::is_same_v<Impl, BitmapXorCount>);
358
1.91k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8is_countEv
Line
Count
Source
355
84
    bool is_count() const {
356
84
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
84
                std::is_same_v<Impl, BitmapXorCount>);
358
84
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE8is_countEv
Line
Count
Source
355
17
    bool is_count() const {
356
17
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
17
                std::is_same_v<Impl, BitmapXorCount>);
358
17
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE8is_countEv
Line
Count
Source
355
12
    bool is_count() const {
356
12
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
12
                std::is_same_v<Impl, BitmapXorCount>);
358
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE8is_countEv
Line
Count
Source
355
12
    bool is_count() const {
356
12
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
12
                std::is_same_v<Impl, BitmapXorCount>);
358
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE8is_countEv
Line
Count
Source
355
199
    bool is_count() const {
356
199
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
199
                std::is_same_v<Impl, BitmapXorCount>);
358
199
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8is_countEv
Line
Count
Source
355
114
    bool is_count() const {
356
114
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
114
                std::is_same_v<Impl, BitmapXorCount>);
358
114
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8is_countEv
Line
Count
Source
355
114
    bool is_count() const {
356
114
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
114
                std::is_same_v<Impl, BitmapXorCount>);
358
114
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE8is_countEv
359
};
360
361
using FunctionBitmapOr = FunctionBitMapVariadic<BitmapOr>;
362
using FunctionBitmapXor = FunctionBitMapVariadic<BitmapXor>;
363
using FunctionBitmapAnd = FunctionBitMapVariadic<BitmapAnd>;
364
using FunctionBitmapOrCount = FunctionBitMapVariadic<BitmapOrCount>;
365
using FunctionBitmapAndCount = FunctionBitMapVariadic<BitmapAndCount>;
366
using FunctionBitmapXorCount = FunctionBitMapVariadic<BitmapXorCount>;
367
using FunctionBitmapOrCountV2 = FunctionBitMapVariadic<BitmapOrCount, true>;
368
using FunctionBitmapAndCountV2 = FunctionBitMapVariadic<BitmapAndCount, true>;
369
using FunctionBitmapXorCountV2 = FunctionBitMapVariadic<BitmapXorCount, true>;
370
371
8
void register_function_bitmap_variadic(SimpleFunctionFactory& factory) {
372
8
    factory.register_function<FunctionBitmapOr>();
373
8
    factory.register_function<FunctionBitmapXor>();
374
8
    factory.register_function<FunctionBitmapAnd>();
375
8
    factory.register_function<FunctionBitmapOrCount>();
376
8
    factory.register_function<FunctionBitmapAndCount>();
377
8
    factory.register_function<FunctionBitmapXorCount>();
378
8
    factory.register_function<FunctionBitmapOrCountV2>();
379
8
    factory.register_function<FunctionBitmapAndCountV2>();
380
8
    factory.register_function<FunctionBitmapXorCountV2>();
381
8
}
382
} // namespace doris