Coverage Report

Created: 2026-09-15 18: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
48
    const auto& nested_col_ptr = nullable->get_nested_column_ptr();                            \
56
48
    const auto* __restrict null_map_data = nullable->get_null_map_data().data();               \
57
48
    const auto& mid_data = assert_cast<const ColumnBitmap*>(nested_col_ptr.get())->get_data(); \
58
108
    for (size_t row = 0; row < input_rows_count; ++row) {                                      \
59
60
        if (!null_map_data[row]) {                                                             \
60
28
            res[row] op mid_data[row];                                                         \
61
28
        }                                                                                      \
62
60
    }
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
395
                                    IColumn* res_nulls) {                                         \
71
395
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
395
            int nullable_cols_count = 0;                                                          \
73
395
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
395
            if (res_nulls) {                                                                      \
75
41
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
41
            }                                                                                     \
77
395
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
34
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
34
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
361
            } else {                                                                              \
81
361
                const auto& mid_data =                                                            \
82
361
                        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
361
            }                                                                                     \
87
809
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
414
                if (auto* nullable =                                                              \
89
414
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
14
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
14
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
400
                } else {                                                                          \
93
400
                    const auto& col_data =                                                        \
94
400
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
400
                                    ->get_data();                                                 \
96
16.8k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
16.4k
                        res[row] OP col_data[row];                                                \
98
16.4k
                    }                                                                             \
99
400
                }                                                                                 \
100
414
            }                                                                                     \
101
395
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
6
                const auto* null_map_data = null_map_datas[0];                                    \
103
14
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
8
                    res_nulls_data[row] = null_map_data[row];                                     \
105
8
                }                                                                                 \
106
12
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
6
                    null_map_data = null_map_datas[i];                                            \
108
14
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
8
                        res_nulls_data[row] &= null_map_data[row];                                \
110
8
                    }                                                                             \
111
6
                }                                                                                 \
112
6
            }                                                                                     \
113
395
            return Status::OK();                                                                  \
114
395
        }                                                                                         \
_ZN5doris8BitmapOr13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
63
                                    IColumn* res_nulls) {                                         \
71
63
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
63
            int nullable_cols_count = 0;                                                          \
73
63
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
63
            if (res_nulls) {                                                                      \
75
41
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
41
            }                                                                                     \
77
63
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
34
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
34
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
34
            } else {                                                                              \
81
29
                const auto& mid_data =                                                            \
82
29
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
85
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
56
                    res[row] = mid_data[row];                                                     \
85
56
                }                                                                                 \
86
29
            }                                                                                     \
87
136
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
73
                if (auto* nullable =                                                              \
89
73
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
14
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
14
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
59
                } else {                                                                          \
93
59
                    const auto& col_data =                                                        \
94
59
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
59
                                    ->get_data();                                                 \
96
141
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
82
                        res[row] OP col_data[row];                                                \
98
82
                    }                                                                             \
99
59
                }                                                                                 \
100
73
            }                                                                                     \
101
63
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
6
                const auto* null_map_data = null_map_datas[0];                                    \
103
14
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
8
                    res_nulls_data[row] = null_map_data[row];                                     \
105
8
                }                                                                                 \
106
12
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
6
                    null_map_data = null_map_datas[i];                                            \
108
14
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
8
                        res_nulls_data[row] &= null_map_data[row];                                \
110
8
                    }                                                                             \
111
6
                }                                                                                 \
112
6
            }                                                                                     \
113
63
            return Status::OK();                                                                  \
114
63
        }                                                                                         \
_ZN5doris9BitmapXor13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
314
                                    IColumn* res_nulls) {                                         \
71
314
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
314
            int nullable_cols_count = 0;                                                          \
73
314
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
314
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
314
            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
314
            } else {                                                                              \
81
314
                const auto& mid_data =                                                            \
82
314
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
16.5k
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
16.2k
                    res[row] = mid_data[row];                                                     \
85
16.2k
                }                                                                                 \
86
314
            }                                                                                     \
87
634
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
320
                if (auto* nullable =                                                              \
89
320
                            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
320
                } else {                                                                          \
93
320
                    const auto& col_data =                                                        \
94
320
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
320
                                    ->get_data();                                                 \
96
16.6k
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
16.3k
                        res[row] OP col_data[row];                                                \
98
16.3k
                    }                                                                             \
99
320
                }                                                                                 \
100
320
            }                                                                                     \
101
314
            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
314
            return Status::OK();                                                                  \
114
314
        }                                                                                         \
_ZN5doris9BitmapAnd13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_
Line
Count
Source
70
18
                                    IColumn* res_nulls) {                                         \
71
18
            std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size);                 \
72
18
            int nullable_cols_count = 0;                                                          \
73
18
            ColumnUInt8::value_type* __restrict res_nulls_data = nullptr;                         \
74
18
            if (res_nulls) {                                                                      \
75
0
                res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data();         \
76
0
            }                                                                                     \
77
18
            if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) {    \
78
0
                null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data();     \
79
0
                BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =);                           \
80
18
            } else {                                                                              \
81
18
                const auto& mid_data =                                                            \
82
18
                        assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data();  \
83
60
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
84
42
                    res[row] = mid_data[row];                                                     \
85
42
                }                                                                                 \
86
18
            }                                                                                     \
87
39
            for (size_t col = 1; col < col_size; ++col) {                                         \
88
21
                if (auto* nullable =                                                              \
89
21
                            check_and_get_column<ColumnNullable>(*argument_columns[col])) {       \
90
0
                    null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \
91
0
                    BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP);                      \
92
21
                } else {                                                                          \
93
21
                    const auto& col_data =                                                        \
94
21
                            assert_cast<const ColumnBitmap*>(argument_columns[col].get())         \
95
21
                                    ->get_data();                                                 \
96
66
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
97
45
                        res[row] OP col_data[row];                                                \
98
45
                    }                                                                             \
99
21
                }                                                                                 \
100
21
            }                                                                                     \
101
18
            if (res_nulls_data && nullable_cols_count == col_size) {                              \
102
0
                const auto* null_map_data = null_map_datas[0];                                    \
103
0
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
104
0
                    res_nulls_data[row] = null_map_data[row];                                     \
105
0
                }                                                                                 \
106
0
                for (int i = 1; i < nullable_cols_count; ++i) {                                   \
107
0
                    null_map_data = null_map_datas[i];                                            \
108
0
                    for (size_t row = 0; row < input_rows_count; ++row) {                         \
109
0
                        res_nulls_data[row] &= null_map_data[row];                                \
110
0
                    }                                                                             \
111
0
                }                                                                                 \
112
0
            }                                                                                     \
113
18
            return Status::OK();                                                                  \
114
18
        }                                                                                         \
115
    }
116
117
#define BITMAP_FUNCTION_COUNT_VARIADIC(CLASS, FUNCTION_NAME, OP, COUNT_OP)                        \
118
    struct CLASS {                                                                                \
119
    public:                                                                                       \
120
        static constexpr auto name = #FUNCTION_NAME;                                              \
121
        using ResultDataType = DataTypeInt64;                                                     \
122
        using TData = std::vector<BitmapValue>;                                                   \
123
        using ResTData = typename ColumnInt64::Container;                                         \
124
        static Status vector_vector(ColumnPtr argument_columns[], size_t col_size,                \
125
110
                                    size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \
126
110
            DCHECK_GE(col_size, 2);                                                               \
127
110
            if (col_size == 2) {                                                                  \
128
98
                const auto lhs = make_bitmap_column_accessor(argument_columns[0]);                \
129
98
                const auto rhs = make_bitmap_column_accessor(argument_columns[1]);                \
130
298
                for (size_t row = 0; row < input_rows_count; ++row) {                             \
131
200
                    const auto* lhs_value = lhs.is_null_at(row) ? nullptr : &lhs.get_value(row);  \
132
200
                    const auto* rhs_value = rhs.is_null_at(row) ? nullptr : &rhs.get_value(row);  \
133
200
                    if (!lhs_value || !rhs_value) {                                               \
134
26
                        if constexpr (std::is_same_v<CLASS, BitmapOrCount>) {                     \
135
26
                            const auto* value = lhs_value ? lhs_value : rhs_value;                \
136
26
                            res[row] = value ? value->cardinality() : 0;                          \
137
26
                        } else {                                                                  \
138
0
                            res[row] = 0;                                                         \
139
0
                        }                                                                         \
140
174
                    } else {                                                                      \
141
174
                        res[row] = lhs_value->COUNT_OP(*rhs_value);                               \
142
174
                    }                                                                             \
143
200
                }                                                                                 \
144
98
                return Status::OK();                                                              \
145
98
            }                                                                                     \
146
110
            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
110
        }                                                                                         \
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
470
            bool is_null_at(size_t row) const {                                                   \
188
470
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
470
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor10is_null_atEm
Line
Count
Source
187
184
            bool is_null_at(size_t row) const {                                                   \
188
184
                return is_const ? is_const_null : (null_map_data && null_map_data[row]);          \
189
184
            }                                                                                     \
_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
433
            const BitmapValue& get_value(size_t row) const {                                      \
192
433
                return is_const ? *const_value : (*values)[row];                                  \
193
433
            }                                                                                     \
_ZNK5doris13BitmapOrCount20BitmapColumnAccessor9get_valueEm
Line
Count
Source
191
147
            const BitmapValue& get_value(size_t row) const {                                      \
192
147
                return is_const ? *const_value : (*values)[row];                                  \
193
147
            }                                                                                     \
_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
239
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
239
            BitmapColumnAccessor accessor;                                                        \
198
239
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
239
            accessor.is_const = is_const;                                                         \
200
239
            const IColumn* data_column = data_column_ptr.get();                                   \
201
239
                                                                                                  \
202
239
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
52
                if (accessor.is_const) {                                                          \
204
2
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
50
                } else {                                                                          \
206
50
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
50
                }                                                                                 \
208
52
                data_column = nullable->get_nested_column_ptr().get();                            \
209
52
            }                                                                                     \
210
239
                                                                                                  \
211
239
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
239
            if (accessor.is_const) {                                                              \
213
2
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
237
            } else {                                                                              \
215
237
                accessor.values = &bitmap_column->get_data();                                     \
216
237
            }                                                                                     \
217
239
                                                                                                  \
218
239
            return accessor;                                                                      \
219
239
        }                                                                                         \
_ZN5doris13BitmapOrCount27make_bitmap_column_accessorERKNS_3COWINS_7IColumnEE13immutable_ptrIS2_EE
Line
Count
Source
196
99
        static BitmapColumnAccessor make_bitmap_column_accessor(const ColumnPtr& column) {        \
197
99
            BitmapColumnAccessor accessor;                                                        \
198
99
            const auto& [data_column_ptr, is_const] = unpack_if_const(column);                    \
199
99
            accessor.is_const = is_const;                                                         \
200
99
            const IColumn* data_column = data_column_ptr.get();                                   \
201
99
                                                                                                  \
202
99
            if (const auto* nullable = check_and_get_column<ColumnNullable>(*data_column)) {      \
203
52
                if (accessor.is_const) {                                                          \
204
2
                    accessor.is_const_null = nullable->is_null_at(0);                             \
205
50
                } else {                                                                          \
206
50
                    accessor.null_map_data = nullable->get_null_map_data().data();                \
207
50
                }                                                                                 \
208
52
                data_column = nullable->get_nested_column_ptr().get();                            \
209
52
            }                                                                                     \
210
99
                                                                                                  \
211
99
            const auto* bitmap_column = assert_cast<const ColumnBitmap*>(data_column);            \
212
99
            if (accessor.is_const) {                                                              \
213
2
                accessor.const_value = &bitmap_column->get_data()[0];                             \
214
97
            } else {                                                                              \
215
97
                accessor.values = &bitmap_column->get_data();                                     \
216
97
            }                                                                                     \
217
99
                                                                                                  \
218
99
            return accessor;                                                                      \
219
99
        }                                                                                         \
_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
46
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
302
    static FunctionPtr create() {
257
302
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
302
    }
_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE6createEv
Line
Count
Source
256
58
    static FunctionPtr create() {
257
58
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
58
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE6createEv
Line
Count
Source
256
77
    static FunctionPtr create() {
257
77
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
77
    }
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE6createEv
Line
Count
Source
256
20
    static FunctionPtr create() {
257
20
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
20
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE6createEv
Line
Count
Source
256
13
    static FunctionPtr create() {
257
13
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
13
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE6createEv
Line
Count
Source
256
12
    static FunctionPtr create() {
257
12
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
12
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE6createEv
Line
Count
Source
256
12
    static FunctionPtr create() {
257
12
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
12
    }
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE6createEv
Line
Count
Source
256
44
    static FunctionPtr create() {
257
44
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
44
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE6createEv
Line
Count
Source
256
33
    static FunctionPtr create() {
257
33
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
33
    }
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE6createEv
Line
Count
Source
256
33
    static FunctionPtr create() {
257
33
        return std::make_shared<FunctionBitMapVariadic<Impl, NewVersion>>();
258
33
    }
259
260
3
    String get_name() const override { return name; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE8get_nameB5cxx11Ev
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8get_nameB5cxx11Ev
Line
Count
Source
260
1
    String get_name() const override { return name; }
261
262
0
    size_t get_number_of_arguments() const override { return 0; }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE23get_number_of_argumentsEv
263
264
230
    bool is_variadic() const override { return true; }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE11is_variadicEv
Line
Count
Source
264
50
    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
36
    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
221
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
221
        using ResultDataType = typename Impl::ResultDataType;
268
221
        if constexpr (NewVersion) {
269
83
            return std::make_shared<ResultDataType>();
270
83
        }
271
221
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
59
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
105
            for (size_t i = 0; i < arguments.size(); ++i) {
275
89
                if (arguments[i]->is_nullable()) {
276
43
                    return_nullable = true;
277
43
                    break;
278
43
                }
279
89
            }
280
59
            auto result_type = std::make_shared<ResultDataType>();
281
59
            return return_nullable ? make_nullable(result_type) : result_type;
282
162
        } else {
283
162
            return std::make_shared<ResultDataType>();
284
162
        }
285
221
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
266
49
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
49
        using ResultDataType = typename Impl::ResultDataType;
268
        if constexpr (NewVersion) {
269
            return std::make_shared<ResultDataType>();
270
        }
271
49
        if (std::is_same_v<Impl, BitmapOr> || is_count()) {
272
49
            bool return_nullable = false;
273
            // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count
274
95
            for (size_t i = 0; i < arguments.size(); ++i) {
275
79
                if (arguments[i]->is_nullable()) {
276
33
                    return_nullable = true;
277
33
                    break;
278
33
                }
279
79
            }
280
49
            auto result_type = std::make_shared<ResultDataType>();
281
49
            return return_nullable ? make_nullable(result_type) : result_type;
282
49
        } else {
283
0
            return std::make_shared<ResultDataType>();
284
0
        }
285
49
    }
_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
35
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
267
35
        using ResultDataType = typename Impl::ResultDataType;
268
35
        if constexpr (NewVersion) {
269
35
            return std::make_shared<ResultDataType>();
270
35
        }
271
35
        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
35
        } else {
283
35
            return std::make_shared<ResultDataType>();
284
35
        }
285
35
    }
_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
1.74k
    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.74k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
1.74k
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
238
    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
238
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
238
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
1.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
1.01k
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
1.01k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
73
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
73
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
73
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
13
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
13
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
13
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
9
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
9
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
9
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
9
    bool use_default_implementation_for_nulls() const override {
288
        // result is null only when all columns is null for bitmap_or.
289
        // for count functions, result is always not null, and if the bitmap op result is null,
290
        // the count is 0
291
9
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
9
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE36use_default_implementation_for_nullsEv
Line
Count
Source
287
164
    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
164
        return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count());
292
164
    }
_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
503
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
64
                      std::is_same_v<Impl, BitmapXorCount>) {
298
64
            auto impl_func = [&](FunctionContext* context, Block& block,
299
64
                                 const ColumnNumbers& arguments, uint32_t result,
300
64
                                 size_t input_rows_count) {
301
64
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
64
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm
Line
Count
Source
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
64
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
64
                                                        input_rows_count, impl_func);
305
439
        } else {
306
439
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
439
        }
308
503
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
63
                        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
63
        } else {
306
63
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
63
        }
308
63
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
312
                        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
312
        } else {
306
312
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
312
        }
308
312
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
18
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
18
        } else {
306
18
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
18
        }
308
18
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
3
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
                      std::is_same_v<Impl, BitmapXorCount>) {
298
            auto impl_func = [&](FunctionContext* context, Block& block,
299
                                 const ColumnNumbers& arguments, uint32_t result,
300
                                 size_t input_rows_count) {
301
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
            };
303
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
                                                        input_rows_count, impl_func);
305
3
        } else {
306
3
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
3
        }
308
3
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
2
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
2
                      std::is_same_v<Impl, BitmapXorCount>) {
298
2
            auto impl_func = [&](FunctionContext* context, Block& block,
299
2
                                 const ColumnNumbers& arguments, uint32_t result,
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
303
2
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
2
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
2
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
2
                      std::is_same_v<Impl, BitmapXorCount>) {
298
2
            auto impl_func = [&](FunctionContext* context, Block& block,
299
2
                                 const ColumnNumbers& arguments, uint32_t result,
300
2
                                 size_t input_rows_count) {
301
2
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
2
            };
303
2
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
2
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
2
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
43
                        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
43
        } else {
306
43
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
43
        }
308
43
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
30
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
30
                      std::is_same_v<Impl, BitmapXorCount>) {
298
30
            auto impl_func = [&](FunctionContext* context, Block& block,
299
30
                                 const ColumnNumbers& arguments, uint32_t result,
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
30
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
30
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
30
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
295
30
                        uint32_t result, size_t input_rows_count) const override {
296
        if constexpr (std::is_same_v<Impl, BitmapAndCount> ||
297
30
                      std::is_same_v<Impl, BitmapXorCount>) {
298
30
            auto impl_func = [&](FunctionContext* context, Block& block,
299
30
                                 const ColumnNumbers& arguments, uint32_t result,
300
30
                                 size_t input_rows_count) {
301
30
                return execute_impl_internal(context, block, arguments, result, input_rows_count);
302
30
            };
303
30
            return execute_bitmap_op_count_null_to_zero(context, block, arguments, result,
304
30
                                                        input_rows_count, impl_func);
305
        } else {
306
            return execute_impl_internal(context, block, arguments, result, input_rows_count);
307
        }
308
30
    }
309
310
    Status execute_impl_internal(FunctionContext* context, Block& block,
311
                                 const ColumnNumbers& arguments, uint32_t result,
312
500
                                 size_t input_rows_count) const {
313
500
        size_t argument_size = arguments.size();
314
315
500
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
500
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
500
                                                ColumnComplexType<ResultDataType::PType>,
318
500
                                                ColumnVector<ResultDataType::PType>>;
319
500
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
500
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
500
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
500
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
48
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
48
        }
327
328
500
        col_res = ColVecResult::create();
329
330
500
        auto& vec_res = col_res->get_data();
331
500
        vec_res.resize(input_rows_count);
332
333
500
        std::vector<ColumnPtr> argument_columns(argument_size);
334
1.54k
        for (size_t i = 0; i < argument_size; ++i) {
335
1.04k
            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
809
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
809
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
809
            }
341
1.04k
        }
342
500
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
500
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
500
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
48
            block.replace_by_position(
347
48
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
452
        } else {
349
452
            block.replace_by_position(result, std::move(col_res));
350
452
        }
351
500
        return Status::OK();
352
500
    }
_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
63
                                 size_t input_rows_count) const {
313
63
        size_t argument_size = arguments.size();
314
315
63
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
63
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
63
                                                ColumnComplexType<ResultDataType::PType>,
318
63
                                                ColumnVector<ResultDataType::PType>>;
319
63
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
63
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
63
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
63
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
325
41
            col_res_nulls = ColumnUInt8::create(input_rows_count, 0);
326
41
        }
327
328
63
        col_res = ColVecResult::create();
329
330
63
        auto& vec_res = col_res->get_data();
331
63
        vec_res.resize(input_rows_count);
332
333
63
        std::vector<ColumnPtr> argument_columns(argument_size);
334
199
        for (size_t i = 0; i < argument_size; ++i) {
335
136
            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
136
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
136
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
136
            }
341
136
        }
342
63
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
63
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
63
        if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) {
346
41
            block.replace_by_position(
347
41
                    result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls)));
348
41
        } else {
349
22
            block.replace_by_position(result, std::move(col_res));
350
22
        }
351
63
        return Status::OK();
352
63
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
312
309
                                 size_t input_rows_count) const {
313
309
        size_t argument_size = arguments.size();
314
315
309
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
309
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
309
                                                ColumnComplexType<ResultDataType::PType>,
318
309
                                                ColumnVector<ResultDataType::PType>>;
319
309
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
309
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
309
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
309
        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
309
        col_res = ColVecResult::create();
329
330
309
        auto& vec_res = col_res->get_data();
331
309
        vec_res.resize(input_rows_count);
332
333
309
        std::vector<ColumnPtr> argument_columns(argument_size);
334
943
        for (size_t i = 0; i < argument_size; ++i) {
335
634
            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
634
                          !std::is_same_v<Impl, BitmapXorCount>) {
339
634
                argument_columns[i] = argument_columns[i]->convert_to_full_column_if_const();
340
634
            }
341
634
        }
342
309
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
309
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
309
        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
309
        } else {
349
309
            block.replace_by_position(result, std::move(col_res));
350
309
        }
351
309
        return Status::OK();
352
309
    }
_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
43
                                 size_t input_rows_count) const {
313
43
        size_t argument_size = arguments.size();
314
315
43
        using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64
316
43
        using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>,
317
43
                                                ColumnComplexType<ResultDataType::PType>,
318
43
                                                ColumnVector<ResultDataType::PType>>;
319
43
        typename ColVecResult::MutablePtr col_res = nullptr;
320
321
43
        typename ColumnUInt8::MutablePtr col_res_nulls;
322
43
        auto& result_info = block.get_by_position(result);
323
        // special case for bitmap_or and bitmap_or_count
324
43
        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
43
        col_res = ColVecResult::create();
329
330
43
        auto& vec_res = col_res->get_data();
331
43
        vec_res.resize(input_rows_count);
332
333
43
        std::vector<ColumnPtr> argument_columns(argument_size);
334
135
        for (size_t i = 0; i < argument_size; ++i) {
335
92
            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
92
        }
342
43
        RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size,
343
43
                                            input_rows_count, vec_res, col_res_nulls.get()));
344
345
43
        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
43
        } else {
349
43
            block.replace_by_position(result, std::move(col_res));
350
43
        }
351
43
        return Status::OK();
352
43
    }
_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.59k
    bool is_count() const {
356
1.59k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
1.59k
                std::is_same_v<Impl, BitmapXorCount>);
358
1.59k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorELb0EE8is_countEv
Line
Count
Source
355
1.08k
    bool is_count() const {
356
1.08k
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
1.08k
                std::is_same_v<Impl, BitmapXorCount>);
358
1.08k
    }
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndELb0EE8is_countEv
Line
Count
Source
355
84
    bool is_count() const {
356
84
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
84
                std::is_same_v<Impl, BitmapXorCount>);
358
84
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb0EE8is_countEv
Line
Count
Source
355
17
    bool is_count() const {
356
17
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
17
                std::is_same_v<Impl, BitmapXorCount>);
358
17
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb0EE8is_countEv
Line
Count
Source
355
12
    bool is_count() const {
356
12
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
12
                std::is_same_v<Impl, BitmapXorCount>);
358
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb0EE8is_countEv
Line
Count
Source
355
12
    bool is_count() const {
356
12
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
12
                std::is_same_v<Impl, BitmapXorCount>);
358
12
    }
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountELb1EE8is_countEv
Line
Count
Source
355
163
    bool is_count() const {
356
163
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
163
                std::is_same_v<Impl, BitmapXorCount>);
358
163
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountELb1EE8is_countEv
Line
Count
Source
355
114
    bool is_count() const {
356
114
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
114
                std::is_same_v<Impl, BitmapXorCount>);
358
114
    }
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountELb1EE8is_countEv
Line
Count
Source
355
114
    bool is_count() const {
356
114
        return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> ||
357
114
                std::is_same_v<Impl, BitmapXorCount>);
358
114
    }
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrELb0EE8is_countEv
359
};
360
361
using FunctionBitmapOr = FunctionBitMapVariadic<BitmapOr>;
362
using FunctionBitmapXor = FunctionBitMapVariadic<BitmapXor>;
363
using FunctionBitmapAnd = FunctionBitMapVariadic<BitmapAnd>;
364
using FunctionBitmapOrCount = FunctionBitMapVariadic<BitmapOrCount>;
365
using FunctionBitmapAndCount = FunctionBitMapVariadic<BitmapAndCount>;
366
using FunctionBitmapXorCount = FunctionBitMapVariadic<BitmapXorCount>;
367
using FunctionBitmapOrCountV2 = FunctionBitMapVariadic<BitmapOrCount, true>;
368
using FunctionBitmapAndCountV2 = FunctionBitMapVariadic<BitmapAndCount, true>;
369
using FunctionBitmapXorCountV2 = FunctionBitMapVariadic<BitmapXorCount, true>;
370
371
8
void register_function_bitmap_variadic(SimpleFunctionFactory& factory) {
372
8
    factory.register_function<FunctionBitmapOr>();
373
8
    factory.register_function<FunctionBitmapXor>();
374
8
    factory.register_function<FunctionBitmapAnd>();
375
8
    factory.register_function<FunctionBitmapOrCount>();
376
8
    factory.register_function<FunctionBitmapAndCount>();
377
8
    factory.register_function<FunctionBitmapXorCount>();
378
8
    factory.register_function<FunctionBitmapOrCountV2>();
379
8
    factory.register_function<FunctionBitmapAndCountV2>();
380
8
    factory.register_function<FunctionBitmapXorCountV2>();
381
8
}
382
} // namespace doris