Coverage Report

Created: 2026-07-28 15:55

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