Coverage Report

Created: 2026-10-09 18:00

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
20
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
126
20
            DCHECK_GE(col_size, 2);                                                               \
127
20
            if (col_size == 2) {                                                                  \
128
14
                const auto lhs = make_bitmap_column_accessor(argument_columns[0]);                \
129
14
                const auto rhs = make_bitmap_column_accessor(argument_columns[1]);                \
130
76
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
131
62
                    const auto* lhs_value = lhs.is_null_at(row) ? nullptr : &lhs.get_value(row);  \
132
62
                    const auto* rhs_value = rhs.is_null_at(row) ? nullptr : &rhs.get_value(row);  \
133
62
                    if (!lhs_value || !rhs_value) {                                               \
134
12
                        if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                     \
135
12
                            const auto* value = lhs_value ? lhs_value : rhs_value;                \
136
12
                            res[row] = value ? value->cardinality() : 0;                          \
137
12
                        } else {                                                                  \
138
0
                            res[row] = 0;                                                         \
139
0
                        }                                                                         \
140
50
                    } else {                                                                      \
141
50
                        res[row] = lhs_value->COUNT_OP(*rhs_value);                               \
142
50
                    }                                                                             \
143
62
                }                                                                                 \
144
14
                return Status::OK();                                                              \
145
14
            }                                                                                     \
146
20
            TData vals(input_rows_count);                                                         \
147
6
            const auto first_column = make_bitmap_column_accessor(argument_columns[0]);           \
148
30
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
149
24
                if (!first_column.is_null_at(row)) {                                              \
150
24
                    vals[row] = first_column.get_value(row);                                      \
151
24
                }                                                                                 \
152
24
            }                                                                                     \
153
12
            for (size_t col = 1; col + 1 < col_size; ++col) {                                     \
154
6
                const auto column = make_bitmap_column_accessor(argument_columns[col]);           \
155
30
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
156
24
                    if (!column.is_null_at(row)) {                                                \
157
24
                        vals[row] OP column.get_value(row);                                       \
158
24
                    }                                                                             \
159
24
                }                                                                                 \
160
6
            }                                                                                     \
161
6
            const auto last_column = make_bitmap_column_accessor(argument_columns[col_size - 1]); \
162
30
            for (size_t row = 0; row < input_rows_count; ++row) {                                 \
163
24
                const auto* lhs_value = &vals[row];                                               \
164
24
                const auto* rhs_value =                                                           \
165
24
                        last_column.is_null_at(row) ? nullptr : &last_column.get_value(row);      \
166
24
                if (!rhs_value) {                                                                 \
167
2
                    if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                         \
168
2
                        res[row] = lhs_value->cardinality();                                      \
169
2
                    } else {                                                                      \
170
0
                        res[row] = 0;                                                             \
171
0
                    }                                                                             \
172
22
                } else {                                                                          \
173
22
                    res[row] = lhs_value->COUNT_OP(*rhs_value);                                   \
174
22
                }                                                                                 \
175
24
            }                                                                                     \
176
6
            return Status::OK();                                                                  \
177
20
        }                                                                                         \
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
196
            bool is_null_at(size_t row) const {                                                   \
188
196
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
196
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
68
            bool is_null_at(size_t row) const {                                                   \
188
68
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
68
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
64
            bool is_null_at(size_t row) const {                                                   \
188
64
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
64
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
64
            bool is_null_at(size_t row) const {                                                   \
188
64
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
64
            }                                                                                     \
190
                                                                                                  \
191
178
            const BitmapValue& get_value(size_t row) const {                                      \
192
178
                return is_const ? *const_value : (*values)[row];                                  \
193
178
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
50
            const BitmapValue& get_value(size_t row) const {                                      \
192
50
                return is_const ? *const_value : (*values)[row];                                  \
193
50
            }                                                                                     \
_ZNK5doris14BitmapAndCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
64
            const BitmapValue& get_value(size_t row) const {                                      \
192
64
                return is_const ? *const_value : (*values)[row];                                  \
193
64
            }                                                                                     \
_ZNK5doris14BitmapXorCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
64
            const BitmapValue& get_value(size_t row) const {                                      \
192
64
                return is_const ? *const_value : (*values)[row];                                  \
193
64
            }                                                                                     \
194
        };                                                                                        \
195
                                                                                                  \
196
46
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
46
            BitmapColumnAccessor accessor;                                                        \
198
46
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
46
            accessor.is_const = is_const;                                                         \
200
46
            const IColumn* data_column = data_column_ptr.get();                                   \
201
46
                                                                                                  \
202
46
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
18
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
18
                } else {                                                                          \
206
18
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
18
                }                                                                                 \
208
18
                data_column = nullable->get_nested_column_ptr().get();                            \
209
18
            }                                                                                     \
210
46
                                                                                                  \
211
46
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
46
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
46
            } else {                                                                              \
215
46
                accessor.values = &bitmap_column->get_data();                                     \
216
46
            }                                                                                     \
217
46
                                                                                                  \
218
46
            return accessor;                                                                      \
219
46
        }                                                                                         \
_ZN5doris13BitmapOrCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
18
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
18
            BitmapColumnAccessor accessor;                                                        \
198
18
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
18
            accessor.is_const = is_const;                                                         \
200
18
            const IColumn* data_column = data_column_ptr.get();                                   \
201
18
                                                                                                  \
202
18
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
18
                if (accessor.is_const) {                                                          \
204
0
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
18
                } else {                                                                          \
206
18
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
18
                }                                                                                 \
208
18
                data_column = nullable->get_nested_column_ptr().get();                            \
209
18
            }                                                                                     \
210
18
                                                                                                  \
211
18
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
18
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
18
            } else {                                                                              \
215
18
                accessor.values = &bitmap_column->get_data();                                     \
216
18
            }                                                                                     \
217
18
                                                                                                  \
218
18
            return accessor;                                                                      \
219
18
        }                                                                                         \
_ZN5doris14BitmapAndCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
14
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
14
            BitmapColumnAccessor accessor;                                                        \
198
14
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
14
            accessor.is_const = is_const;                                                         \
200
14
            const IColumn* data_column = data_column_ptr.get();                                   \
201
14
                                                                                                  \
202
14
            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
14
                                                                                                  \
211
14
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
14
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
14
            } else {                                                                              \
215
14
                accessor.values = &bitmap_column->get_data();                                     \
216
14
            }                                                                                     \
217
14
                                                                                                  \
218
14
            return accessor;                                                                      \
219
14
        }                                                                                         \
_ZN5doris14BitmapXorCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
14
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
14
            BitmapColumnAccessor accessor;                                                        \
198
14
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
14
            accessor.is_const = is_const;                                                         \
200
14
            const IColumn* data_column = data_column_ptr.get();                                   \
201
14
                                                                                                  \
202
14
            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
14
                                                                                                  \
211
14
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
14
            if (accessor.is_const) {                                                              \
213
0
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
14
            } else {                                                                              \
215
14
                accessor.values = &bitmap_column->get_data();                                     \
216
14
            }                                                                                     \
217
14
                                                                                                  \
218
14
            return accessor;                                                                      \
219
14
        }                                                                                         \
220
    }
221
222
BITMAP_FUNCTION_VARIADIC(BitmapOr, bitmap_or, |=);
223
BITMAP_FUNCTION_VARIADIC(BitmapAnd, bitmap_and, &=);
224
BITMAP_FUNCTION_VARIADIC(BitmapXor, bitmap_xor, ^=);
225
8
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapOrCount, bitmap_or_count, |=, or_cardinality);
226
6
BITMAP_FUNCTION_COUNT_VARIADIC(BitmapAndCount, bitmap_and_count, &=, and_cardinality);
227
6
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
74
    static FunctionPtr create() {
257
74
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
74
    }
_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE6createEv
Line
Count
Source
256
4
    static FunctionPtr create() {
257
4
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
4
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE6createEv
Line
Count
Source
256
4
    static FunctionPtr create() {
257
4
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
4
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE6createEv
Line
Count
Source
256
4
    static FunctionPtr create() {
257
4
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
4
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE6createEv
Line
Count
Source
256
12
    static FunctionPtr create() {
257
12
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
12
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE6createEv
Line
Count
Source
256
10
    static FunctionPtr create() {
257
10
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
10
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE6createEv
Line
Count
Source
256
10
    static FunctionPtr create() {
257
10
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
10
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE6createEv
Line
Count
Source
256
10
    static FunctionPtr create() {
257
10
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
10
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE6createEv
Line
Count
Source
256
10
    static FunctionPtr create() {
257
10
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
10
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE6createEv
Line
Count
Source
256
10
    static FunctionPtr create() {
257
10
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
10
    }
259
260
6
    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
2
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
2
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
2
    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
56
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE11is_variadicEv
Line
Count
Source
264
2
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE11is_variadicEv
Line
Count
Source
264
2
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE11is_variadicEv
Line
Count
Source
264
2
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE11is_variadicEv
Line
Count
Source
264
10
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE11is_variadicEv
Line
Count
Source
264
8
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE11is_variadicEv
Line
Count
Source
264
8
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE11is_variadicEv
Line
Count
Source
264
8
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE11is_variadicEv
Line
Count
Source
264
8
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE11is_variadicEv
Line
Count
Source
264
8
    bool is_variadic() const override { return true; }
265
266
38
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
38
        using ResultDataType = typename Impl::ResultDataType;
268
38
        if constexpr (NewVersion) {
269
18
            return std::make_shared<ResultDataType>();
270
18
        }
271
38
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
20
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
20
            for (size_t i = 0; i < arguments.size(); ++i) {
275
20
                if (arguments[i]->is_nullable()) {
276
20
                    return_nullable = true;
277
20
                    break;
278
20
                }
279
20
            }
280
20
            auto result_type = std::make_shared<ResultDataType>();
281
20
            return return_nullable ? make_nullable(result_type) : result_type;
282
20
        } else {
283
18
            return std::make_shared<ResultDataType>();
284
18
        }
285
38
    }
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
8
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
8
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
8
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
8
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
8
            for (size_t i = 0; i < arguments.size(); ++i) {
275
8
                if (arguments[i]->is_nullable()) {
276
8
                    return_nullable = true;
277
8
                    break;
278
8
                }
279
8
            }
280
8
            auto result_type = std::make_shared<ResultDataType>();
281
8
            return return_nullable ? make_nullable(result_type) : result_type;
282
8
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
8
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
6
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
6
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
6
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
6
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
6
            for (size_t i = 0; i < arguments.size(); ++i) {
275
6
                if (arguments[i]->is_nullable()) {
276
6
                    return_nullable = true;
277
6
                    break;
278
6
                }
279
6
            }
280
6
            auto result_type = std::make_shared<ResultDataType>();
281
6
            return return_nullable ? make_nullable(result_type) : result_type;
282
6
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
6
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
6
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
6
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
6
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
6
            for (size_t i = 0; i < arguments.size(); ++i) {
275
6
                if (arguments[i]->is_nullable()) {
276
6
                    return_nullable = true;
277
6
                    break;
278
6
                }
279
6
            }
280
6
            auto result_type = std::make_shared<ResultDataType>();
281
6
            return return_nullable ? make_nullable(result_type) : result_type;
282
6
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
6
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
6
        using ResultDataType = typename Impl::ResultDataType;
268
6
        if constexpr (NewVersion) {
269
6
            return std::make_shared<ResultDataType>();
270
6
        }
271
6
        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
6
        } else {
283
6
            return std::make_shared<ResultDataType>();
284
6
        }
285
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
6
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
6
        using ResultDataType = typename Impl::ResultDataType;
268
6
        if constexpr (NewVersion) {
269
6
            return std::make_shared<ResultDataType>();
270
6
        }
271
6
        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
6
        } else {
283
6
            return std::make_shared<ResultDataType>();
284
6
        }
285
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
6
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
6
        using ResultDataType = typename Impl::ResultDataType;
268
6
        if constexpr (NewVersion) {
269
6
            return std::make_shared<ResultDataType>();
270
6
        }
271
6
        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
6
        } else {
283
6
            return std::make_shared<ResultDataType>();
284
6
        }
285
6
    }
286
287
98
    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
98
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
98
    }
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
26
    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
26
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
26
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
18
    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
18
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
18
    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
18
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
12
    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
12
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
12
    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
12
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
12
    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
12
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
12
    }
293
294
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
295
20
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
12
                      std::is_same_v<Impl, BitmapXorCount>) {
298
12
            auto impl_func = [&](FunctionContext* context, Block& block,
299
12
                                 const ColumnNumbers& arguments, uint32_t result,
300
12
                                 size_t input_rows_count) {
301
12
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
12
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
4
                                 size_t input_rows_count) {
301
4
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
4
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
4
                                 size_t input_rows_count) {
301
4
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
4
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_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_14BitmapXorCountELb1EE12execute_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
            };
303
12
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
12
                                                        input_rows_count, impl_func);
305
12
        } else {
306
8
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
8
        }
308
20
    }
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
6
                        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
6
        } else {
306
6
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
6
        }
308
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
4
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
4
                      std::is_same_v<Impl, BitmapXorCount>) {
298
4
            auto impl_func = [&](FunctionContext* context, Block& block,
299
4
                                 const ColumnNumbers& arguments, uint32_t result,
300
4
                                 size_t input_rows_count) {
301
4
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
4
            };
303
4
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
4
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
4
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
4
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
4
                      std::is_same_v<Impl, BitmapXorCount>) {
298
4
            auto impl_func = [&](FunctionContext* context, Block& block,
299
4
                                 const ColumnNumbers& arguments, uint32_t result,
300
4
                                 size_t input_rows_count) {
301
4
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
4
            };
303
4
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
4
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
4
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE12execute_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
                      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
2
        } else {
306
2
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
2
        }
308
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_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_14BitmapXorCountELb1EE12execute_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
    }
309
310
    Status execute_impl_internal(FunctionContext* context, Block& block,
311
                                 const ColumnNumbers& arguments, uint32_t result,
312
20
                                 size_t input_rows_count) const {
313
20
        size_t argument_size = arguments.size();
314
315
20
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
20
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
20
                                                ColumnComplexType<ResultDataType::PType>,
318
20
                                                ColumnVector<ResultDataType::PType>>;
319
20
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
20
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
20
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
20
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
14
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
14
        }
327
328
20
        col_res = ColVecResult::create();
329
330
20
        auto& vec_res = col_res->get_data();
331
20
        vec_res.resize(input_rows_count);
332
333
20
        std::vector<ColumnPtr> argument_columns(argument_size);
334
66
        for (size_t i = 0; i < argument_size; ++i) {
335
46
            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
46
        }
342
20
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
20
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
20
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
14
            block.replace_by_position(
347
14
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
14
        } else {
349
6
            block.replace_by_position(result, std::move(col_res));
350
6
        }
351
20
        return Status::OK();
352
20
    }
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
6
                                 size_t input_rows_count) const {
313
6
        size_t argument_size = arguments.size();
314
315
6
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
6
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
6
                                                ColumnComplexType<ResultDataType::PType>,
318
6
                                                ColumnVector<ResultDataType::PType>>;
319
6
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
6
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
6
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
6
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
6
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
6
        }
327
328
6
        col_res = ColVecResult::create();
329
330
6
        auto& vec_res = col_res->get_data();
331
6
        vec_res.resize(input_rows_count);
332
333
6
        std::vector<ColumnPtr> argument_columns(argument_size);
334
20
        for (size_t i = 0; i < argument_size; ++i) {
335
14
            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
14
        }
342
6
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
6
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
6
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
6
            block.replace_by_position(
347
6
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
6
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
6
        return Status::OK();
352
6
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
4
                                 size_t input_rows_count) const {
313
4
        size_t argument_size = arguments.size();
314
315
4
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
4
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
4
                                                ColumnComplexType<ResultDataType::PType>,
318
4
                                                ColumnVector<ResultDataType::PType>>;
319
4
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
4
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
4
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
4
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
4
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
4
        }
327
328
4
        col_res = ColVecResult::create();
329
330
4
        auto& vec_res = col_res->get_data();
331
4
        vec_res.resize(input_rows_count);
332
333
4
        std::vector<ColumnPtr> argument_columns(argument_size);
334
14
        for (size_t i = 0; i < argument_size; ++i) {
335
10
            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
10
        }
342
4
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
4
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
4
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
4
            block.replace_by_position(
347
4
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
4
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
4
        return Status::OK();
352
4
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
4
                                 size_t input_rows_count) const {
313
4
        size_t argument_size = arguments.size();
314
315
4
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
4
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
4
                                                ColumnComplexType<ResultDataType::PType>,
318
4
                                                ColumnVector<ResultDataType::PType>>;
319
4
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
4
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
4
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
4
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
4
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
4
        }
327
328
4
        col_res = ColVecResult::create();
329
330
4
        auto& vec_res = col_res->get_data();
331
4
        vec_res.resize(input_rows_count);
332
333
4
        std::vector<ColumnPtr> argument_columns(argument_size);
334
14
        for (size_t i = 0; i < argument_size; ++i) {
335
10
            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
10
        }
342
4
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
4
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
4
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
4
            block.replace_by_position(
347
4
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
4
        } else {
349
0
            block.replace_by_position(result, std::move(col_res));
350
0
        }
351
4
        return Status::OK();
352
4
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE21execute_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
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
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
6
        for (size_t i = 0; i < argument_size; ++i) {
335
4
            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
4
        }
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
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
2
        } else {
349
2
            block.replace_by_position(result, std::move(col_res));
350
2
        }
351
2
        return Status::OK();
352
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE21execute_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
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
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
6
        for (size_t i = 0; i < argument_size; ++i) {
335
4
            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
4
        }
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
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
2
        } else {
349
2
            block.replace_by_position(result, std::move(col_res));
350
2
        }
351
2
        return Status::OK();
352
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE21execute_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
0
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
0
        }
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
6
        for (size_t i = 0; i < argument_size; ++i) {
335
4
            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
4
        }
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
0
            block.replace_by_position(
347
0
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
2
        } else {
349
2
            block.replace_by_position(result, std::move(col_res));
350
2
        }
351
2
        return Status::OK();
352
2
    }
353
354
private:
355
118
    bool is_count() const {
356
118
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
118
                std::is_same_v<Impl, BitmapXorCount>);
358
118
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8is_countEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8is_countEv
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE8is_countEv
Line
Count
Source
355
34
    bool is_count() const {
356
34
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
34
                std::is_same_v<Impl, BitmapXorCount>);
358
34
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE8is_countEv
Line
Count
Source
355
24
    bool is_count() const {
356
24
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
24
                std::is_same_v<Impl, BitmapXorCount>);
358
24
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE8is_countEv
Line
Count
Source
355
24
    bool is_count() const {
356
24
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
24
                std::is_same_v<Impl, BitmapXorCount>);
358
24
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE8is_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_14BitmapAndCountELb1EE8is_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_14BitmapXorCountELb1EE8is_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
    }
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
2
void register_function_bitmap_variadic(SimpleFunctionFactory& factory) {
372
2
    factory.register_function<FunctionBitmapOr>();
373
2
    factory.register_function<FunctionBitmapXor>();
374
2
    factory.register_function<FunctionBitmapAnd>();
375
2
    factory.register_function<FunctionBitmapOrCount>();
376
2
    factory.register_function<FunctionBitmapAndCount>();
377
2
    factory.register_function<FunctionBitmapXorCount>();
378
2
    factory.register_function<FunctionBitmapOrCountV2>();
379
2
    factory.register_function<FunctionBitmapAndCountV2>();
380
2
    factory.register_function<FunctionBitmapXorCountV2>();
381
2
}
382
} // namespace doris