Coverage Report

Created: 2026-07-28 19:12

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
0
    const auto& nested_col_ptr = nullable->get_nested_column_ptr();                            \
56
0
    const auto* __restrict null_map_data = nullable->get_null_map_data().data();               \
57
0
    const auto& mid_data = assert_cast<const ColumnBitmap*>(nested_col_ptr.get())->get_data(); \
58
0
    for (size_t row = 0; row < input_rows_count; ++row) {                                      \
59
0
        if (!null_map_data[row]) {                                                             \
60
0
            res[row] op mid_data[row];                                                         \
61
0
        }                                                                                      \
62
0
    }
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
0
                                    IColumn* res_nulls) {                                         \
71
0
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
0
            int nullable_cols_count = 0;                                                          \
73
0
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
0
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
0
            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
0
            } else {                                                                              \
81
0
                const auto& mid_data =                                                            \
82
0
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
0
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
0
                    res[row] = mid_data[row];                                                     \
85
0
                }                                                                                 \
86
0
            }                                                                                     \
87
0
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
0
                if (auto* nullable =                                                              \
89
0
                            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
0
                } else {                                                                          \
93
0
                    const auto& col_data =                                                        \
94
0
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
0
                                    ->get_data();                                                 \
96
0
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
0
                        res[row] OP col_data[row];                                                \
98
0
                    }                                                                             \
99
0
                }                                                                                 \
100
0
            }                                                                                     \
101
0
            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
0
            return Status::OK();                                                                  \
114
0
        }                                                                                         \
Unexecuted instantiation: _ZN5doris8BitmapOr13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Unexecuted instantiation: _ZN5doris9BitmapXor13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Unexecuted instantiation: _ZN5doris9BitmapAnd13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
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
10
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
126
10
            DCHECK_GE(col_size, 2);                                                               \
127
10
            if (col_size == 2) {                                                                  \
128
7
                const auto lhs = make_bitmap_column_accessor(argument_columns[0]);                \
129
7
                const auto rhs = make_bitmap_column_accessor(argument_columns[1]);                \
130
38
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
131
31
                    const auto* lhs_value = lhs.is_null_at(row) ? nullptr : &lhs.get_value(row);  \
132
31
                    const auto* rhs_value = rhs.is_null_at(row) ? nullptr : &rhs.get_value(row);  \
133
31
                    if (!lhs_value || !rhs_value) {                                               \
134
6
                        if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                     \
135
6
                            const auto* value = lhs_value ? lhs_value : rhs_value;                \
136
6
                            res[row] = value ? value->cardinality() : 0;                          \
137
6
                        } else {                                                                  \
138
0
                            res[row] = 0;                                                         \
139
0
                        }                                                                         \
140
25
                    } else {                                                                      \
141
25
                        res[row] = lhs_value->COUNT_OP(*rhs_value);                               \
142
25
                    }                                                                             \
143
31
                }                                                                                 \
144
7
                return Status::OK();                                                              \
145
7
            }                                                                                     \
146
10
            TData vals(input_rows_count);                                                         \
147
3
            const auto first_column = make_bitmap_column_accessor(argument_columns[0]);           \
148
15
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
149
12
                if (!first_column.is_null_at(row)) {                                              \
150
12
                    vals[row] = first_column.get_value(row);                                      \
151
12
                }                                                                                 \
152
12
            }                                                                                     \
153
6
            for (size_t col = 1; col + 1 < col_size; ++col) {                                     \
154
3
                const auto column = make_bitmap_column_accessor(argument_columns[col]);           \
155
15
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
156
12
                    if (!column.is_null_at(row)) {                                                \
157
12
                        vals[row] OP column.get_value(row);                                       \
158
12
                    }                                                                             \
159
12
                }                                                                                 \
160
3
            }                                                                                     \
161
3
            const auto last_column = make_bitmap_column_accessor(argument_columns[col_size - 1]); \
162
15
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
163
12
                const auto* lhs_value = &vals[row];                                               \
164
12
                const auto* rhs_value =                                                           \
165
12
                        last_column.is_null_at(row) ? nullptr : &last_column.get_value(row);      \
166
12
                if (!rhs_value) {                                                                 \
167
1
                    if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                         \
168
1
                        res[row] = lhs_value->cardinality();                                      \
169
1
                    } else {                                                                      \
170
0
                        res[row] = 0;                                                             \
171
0
                    }                                                                             \
172
11
                } else {                                                                          \
173
11
                    res[row] = lhs_value->COUNT_OP(*rhs_value);                                   \
174
11
                }                                                                                 \
175
12
            }                                                                                     \
176
3
            return Status::OK();                                                                  \
177
10
        }                                                                                         \
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
98
            bool is_null_at(size_t row) const {                                                   \
188
98
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
98
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
34
            bool is_null_at(size_t row) const {                                                   \
188
34
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
34
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
32
            bool is_null_at(size_t row) const {                                                   \
188
32
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
32
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
32
            bool is_null_at(size_t row) const {                                                   \
188
32
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
32
            }                                                                                     \
190
                                                                                                  \
191
89
            const BitmapValue& get_value(size_t row) const {                                      \
192
89
                return is_const ? *const_value : (*values)[row];                                  \
193
89
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
25
            const BitmapValue& get_value(size_t row) const {                                      \
192
25
                return is_const ? *const_value : (*values)[row];                                  \
193
25
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
32
            const BitmapValue& get_value(size_t row) const {                                      \
192
32
                return is_const ? *const_value : (*values)[row];                                  \
193
32
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
32
            const BitmapValue& get_value(size_t row) const {                                      \
192
32
                return is_const ? *const_value : (*values)[row];                                  \
193
32
            }                                                                                     \
194
        };                                                                                        \
195
                                                                                                  \
196
23
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
23
            BitmapColumnAccessor accessor;                                                        \
198
23
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
23
            accessor.is_const = is_const;                                                         \
200
23
            const IColumn* data_column = data_column_ptr.get();                                   \
201
23
                                                                                                  \
202
23
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
9
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
9
                } else {                                                                          \
206
9
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
9
                }                                                                                 \
208
9
                data_column = nullable->get_nested_column_ptr().get();                            \
209
9
            }                                                                                     \
210
23
                                                                                                  \
211
23
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
23
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
23
            } else {                                                                              \
215
23
                accessor.values = &bitmap_column->get_data();                                     \
216
23
            }                                                                                     \
217
23
                                                                                                  \
218
23
            return accessor;                                                                      \
219
23
        }                                                                                         \
_ZN5doris13BitmapOrCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
9
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
9
            BitmapColumnAccessor accessor;                                                        \
198
9
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
9
            accessor.is_const = is_const;                                                         \
200
9
            const IColumn* data_column = data_column_ptr.get();                                   \
201
9
                                                                                                  \
202
9
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
9
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
9
                } else {                                                                          \
206
9
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
9
                }                                                                                 \
208
9
                data_column = nullable->get_nested_column_ptr().get();                            \
209
9
            }                                                                                     \
210
9
                                                                                                  \
211
9
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
9
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
9
            } else {                                                                              \
215
9
                accessor.values = &bitmap_column->get_data();                                     \
216
9
            }                                                                                     \
217
9
                                                                                                  \
218
9
            return accessor;                                                                      \
219
9
        }                                                                                         \
_ZN5doris14BitmapAndCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
7
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
7
            BitmapColumnAccessor accessor;                                                        \
198
7
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
7
            accessor.is_const = is_const;                                                         \
200
7
            const IColumn* data_column = data_column_ptr.get();                                   \
201
7
                                                                                                  \
202
7
            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
7
                                                                                                  \
211
7
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
7
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
7
            } else {                                                                              \
215
7
                accessor.values = &bitmap_column->get_data();                                     \
216
7
            }                                                                                     \
217
7
                                                                                                  \
218
7
            return accessor;                                                                      \
219
7
        }                                                                                         \
_ZN5doris14BitmapXorCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
7
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
7
            BitmapColumnAccessor accessor;                                                        \
198
7
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
7
            accessor.is_const = is_const;                                                         \
200
7
            const IColumn* data_column = data_column_ptr.get();                                   \
201
7
                                                                                                  \
202
7
            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
7
                                                                                                  \
211
7
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
7
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
7
            } else {                                                                              \
215
7
                accessor.values = &bitmap_column->get_data();                                     \
216
7
            }                                                                                     \
217
7
                                                                                                  \
218
7
            return accessor;                                                                      \
219
7
        }                                                                                         \
220
    }
221
222
BITMAP_FUNCTION_VARIADIC(BitmapOr, bitmap_or, |=);
223
BITMAP_FUNCTION_VARIADIC(BitmapAnd, bitmap_and, &=);
224
BITMAP_FUNCTION_VARIADIC(BitmapXor, bitmap_xor, ^=);
225
4
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapOrCount, bitmap_or_count, |=, or_cardinality);
226
3
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapAndCount, bitmap_and_count, &=, and_cardinality);
227
3
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
37
    static FunctionPtr create() {
257
37
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
37
    }
_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE6createEv
Line
Count
Source
256
2
    static FunctionPtr create() {
257
2
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
2
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE6createEv
Line
Count
Source
256
2
    static FunctionPtr create() {
257
2
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
2
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE6createEv
Line
Count
Source
256
2
    static FunctionPtr create() {
257
2
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
2
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE6createEv
Line
Count
Source
256
6
    static FunctionPtr create() {
257
6
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
6
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE6createEv
Line
Count
Source
256
5
    static FunctionPtr create() {
257
5
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
5
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE6createEv
Line
Count
Source
256
5
    static FunctionPtr create() {
257
5
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
5
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE6createEv
Line
Count
Source
256
5
    static FunctionPtr create() {
257
5
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
5
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE6createEv
Line
Count
Source
256
5
    static FunctionPtr create() {
257
5
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
5
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE6createEv
Line
Count
Source
256
5
    static FunctionPtr create() {
257
5
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
5
    }
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
28
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE11is_variadicEv
Line
Count
Source
264
1
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE11is_variadicEv
Line
Count
Source
264
1
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE11is_variadicEv
Line
Count
Source
264
1
    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
4
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE11is_variadicEv
Line
Count
Source
264
4
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE11is_variadicEv
Line
Count
Source
264
4
    bool is_variadic() const override { return true; }
265
266
19
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
19
        using ResultDataType = typename Impl::ResultDataType;
268
19
        if constexpr (NewVersion) {
269
9
            return std::make_shared<ResultDataType>();
270
9
        }
271
19
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
10
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
10
            for (size_t i = 0; i < arguments.size(); ++i) {
275
10
                if (arguments[i]->is_nullable()) {
276
10
                    return_nullable = true;
277
10
                    break;
278
10
                }
279
10
            }
280
10
            auto result_type = std::make_shared<ResultDataType>();
281
10
            return return_nullable ? make_nullable(result_type) : result_type;
282
10
        } else {
283
9
            return std::make_shared<ResultDataType>();
284
9
        }
285
19
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
_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
3
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
3
        using ResultDataType = typename Impl::ResultDataType;
268
3
        if constexpr (NewVersion) {
269
3
            return std::make_shared<ResultDataType>();
270
3
        }
271
3
        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
3
        } else {
283
3
            return std::make_shared<ResultDataType>();
284
3
        }
285
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE20get_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
3
        if constexpr (NewVersion) {
269
3
            return std::make_shared<ResultDataType>();
270
3
        }
271
3
        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
3
        } else {
283
3
            return std::make_shared<ResultDataType>();
284
3
        }
285
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE20get_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
3
        if constexpr (NewVersion) {
269
3
            return std::make_shared<ResultDataType>();
270
3
        }
271
3
        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
3
        } else {
283
3
            return std::make_shared<ResultDataType>();
284
3
        }
285
3
    }
286
287
49
    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
49
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
49
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE36use_default_implementation_for_nullsEv
_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
6
    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
6
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
6
    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
6
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
6
    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
6
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
6
    }
293
294
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
295
10
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
6
                      std::is_same_v<Impl, BitmapXorCount>) {
298
6
            auto impl_func = [&](FunctionContext* context, Block& block,
299
6
                                 const ColumnNumbers& arguments, uint32_t result,
300
6
                                 size_t input_rows_count) {
301
6
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
6
            };
_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
1
                                 size_t input_rows_count) {
301
1
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
1
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
1
                                 size_t input_rows_count) {
301
1
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
1
            };
303
6
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
6
                                                        input_rows_count, impl_func);
305
6
        } else {
306
4
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
4
        }
308
10
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_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
1
                        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
1
        } else {
306
1
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
1
        }
308
1
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
1
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
1
                      std::is_same_v<Impl, BitmapXorCount>) {
298
1
            auto impl_func = [&](FunctionContext* context, Block& block,
299
1
                                 const ColumnNumbers& arguments, uint32_t result,
300
1
                                 size_t input_rows_count) {
301
1
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
1
            };
303
1
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
1
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
1
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
1
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
1
                      std::is_same_v<Impl, BitmapXorCount>) {
298
1
            auto impl_func = [&](FunctionContext* context, Block& block,
299
1
                                 const ColumnNumbers& arguments, uint32_t result,
300
1
                                 size_t input_rows_count) {
301
1
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
1
            };
303
1
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
1
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
1
    }
309
310
    Status execute_impl_internal(FunctionContext* context, Block& block,
311
                                 const ColumnNumbers& arguments, uint32_t result,
312
10
                                 size_t input_rows_count) const {
313
10
        size_t argument_size = arguments.size();
314
315
10
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
10
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
10
                                                ColumnComplexType<ResultDataType::PType>,
318
10
                                                ColumnVector<ResultDataType::PType>>;
319
10
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
10
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
10
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
10
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
7
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
7
        }
327
328
10
        col_res = ColVecResult::create();
329
330
10
        auto& vec_res = col_res->get_data();
331
10
        vec_res.resize(input_rows_count);
332
333
10
        std::vector<ColumnPtr> argument_columns(argument_size);
334
33
        for (size_t i = 0; i < argument_size; ++i) {
335
23
            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
0
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
0
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
0
            }
341
23
        }
342
10
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
10
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
10
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
7
            block.replace_by_position(
347
7
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
7
        } else {
349
3
            block.replace_by_position(result, std::move(col_res));
350
3
        }
351
10
        return Status::OK();
352
10
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_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
1
                                 size_t input_rows_count) const {
313
1
        size_t argument_size = arguments.size();
314
315
1
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
1
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
1
                                                ColumnComplexType<ResultDataType::PType>,
318
1
                                                ColumnVector<ResultDataType::PType>>;
319
1
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
1
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
1
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
1
        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
1
        col_res = ColVecResult::create();
329
330
1
        auto& vec_res = col_res->get_data();
331
1
        vec_res.resize(input_rows_count);
332
333
1
        std::vector<ColumnPtr> argument_columns(argument_size);
334
3
        for (size_t i = 0; i < argument_size; ++i) {
335
2
            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
2
        }
342
1
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
1
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
1
        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
1
        } else {
349
1
            block.replace_by_position(result, std::move(col_res));
350
1
        }
351
1
        return Status::OK();
352
1
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
1
                                 size_t input_rows_count) const {
313
1
        size_t argument_size = arguments.size();
314
315
1
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
1
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
1
                                                ColumnComplexType<ResultDataType::PType>,
318
1
                                                ColumnVector<ResultDataType::PType>>;
319
1
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
1
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
1
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
1
        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
1
        col_res = ColVecResult::create();
329
330
1
        auto& vec_res = col_res->get_data();
331
1
        vec_res.resize(input_rows_count);
332
333
1
        std::vector<ColumnPtr> argument_columns(argument_size);
334
3
        for (size_t i = 0; i < argument_size; ++i) {
335
2
            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
2
        }
342
1
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
1
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
1
        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
1
        } else {
349
1
            block.replace_by_position(result, std::move(col_res));
350
1
        }
351
1
        return Status::OK();
352
1
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
1
                                 size_t input_rows_count) const {
313
1
        size_t argument_size = arguments.size();
314
315
1
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
1
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
1
                                                ColumnComplexType<ResultDataType::PType>,
318
1
                                                ColumnVector<ResultDataType::PType>>;
319
1
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
1
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
1
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
1
        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
1
        col_res = ColVecResult::create();
329
330
1
        auto& vec_res = col_res->get_data();
331
1
        vec_res.resize(input_rows_count);
332
333
1
        std::vector<ColumnPtr> argument_columns(argument_size);
334
3
        for (size_t i = 0; i < argument_size; ++i) {
335
2
            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
2
        }
342
1
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
1
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
1
        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
1
        } else {
349
1
            block.replace_by_position(result, std::move(col_res));
350
1
        }
351
1
        return Status::OK();
352
1
    }
353
354
private:
355
59
    bool is_count() const {
356
59
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
59
                std::is_same_v<Impl, BitmapXorCount>);
358
59
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8is_countEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8is_countEv
_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
6
    bool is_count() const {
356
6
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
6
                std::is_same_v<Impl, BitmapXorCount>);
358
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8is_countEv
Line
Count
Source
355
6
    bool is_count() const {
356
6
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
6
                std::is_same_v<Impl, BitmapXorCount>);
358
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8is_countEv
Line
Count
Source
355
6
    bool is_count() const {
356
6
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
6
                std::is_same_v<Impl, BitmapXorCount>);
358
6
    }
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
1
void register_function_bitmap_variadic(SimpleFunctionFactory& factory) {
372
1
    factory.register_function<FunctionBitmapOr>();
373
1
    factory.register_function<FunctionBitmapXor>();
374
1
    factory.register_function<FunctionBitmapAnd>();
375
1
    factory.register_function<FunctionBitmapOrCount>();
376
1
    factory.register_function<FunctionBitmapAndCount>();
377
1
    factory.register_function<FunctionBitmapXorCount>();
378
1
    factory.register_function<FunctionBitmapOrCountV2>();
379
1
    factory.register_function<FunctionBitmapAndCountV2>();
380
1
    factory.register_function<FunctionBitmapXorCountV2>();
381
1
}
382
} // namespace doris