Coverage Report

Created: 2026-04-27 15:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/aggregate/aggregate_function_reader_replace.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
// Self-contained implementation for replace/replace_if_not_null reader/load aggregation.
19
// Deliberately does NOT include aggregate_function_reader_first_last.h to avoid pulling in
20
// heavy template machinery shared with the window-function path.
21
22
#include "core/column/column_nullable.h"
23
#include "core/field.h"
24
#include "exprs/aggregate/aggregate_function.h"
25
#include "exprs/aggregate/aggregate_function_reader.h"
26
#include "exprs/aggregate/aggregate_function_simple_factory.h"
27
28
namespace doris {
29
30
// ---------------------------------------------------------------------------
31
// Storage layer: PointerStore / CopyStore
32
// Uniform interface: is_null(), set_value<SkipNull>(), insert_into(), reset().
33
// set_value returns false when SkipNull && the row is null (caller should not
34
// update _has_value); returns true otherwise.
35
// ---------------------------------------------------------------------------
36
37
// Zero-copy storage: keeps a pointer into the source column (reader path).
38
template <bool ArgIsNullable>
39
struct PointerStore {
40
    const IColumn* _ptr = nullptr;
41
    size_t _offset = 0;
42
43
21
    bool is_null() const {
44
21
        if (_ptr == nullptr) {
45
0
            return true;
46
0
        }
47
21
        if constexpr (ArgIsNullable) {
48
21
            return assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr)
49
21
                    ->is_null_at(_offset);
50
21
        }
51
0
        return false;
52
21
    }
Unexecuted instantiation: _ZNK5doris12PointerStoreILb0EE7is_nullEv
_ZNK5doris12PointerStoreILb1EE7is_nullEv
Line
Count
Source
43
21
    bool is_null() const {
44
21
        if (_ptr == nullptr) {
45
0
            return true;
46
0
        }
47
21
        if constexpr (ArgIsNullable) {
48
21
            return assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr)
49
21
                    ->is_null_at(_offset);
50
21
        }
51
0
        return false;
52
21
    }
53
54
    template <bool SkipNull>
55
437
    bool set_value(const IColumn* column, size_t row) {
56
437
        if constexpr (SkipNull && ArgIsNullable) {
57
5
            const auto* nc =
58
5
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
5
            if (nc->is_null_at(row)) {
60
1
                return false;
61
1
            }
62
5
        }
63
4
        _ptr = column;
64
437
        _offset = row;
65
437
        return true;
66
437
    }
_ZN5doris12PointerStoreILb0EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
55
223
    bool set_value(const IColumn* column, size_t row) {
56
        if constexpr (SkipNull && ArgIsNullable) {
57
            const auto* nc =
58
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
            if (nc->is_null_at(row)) {
60
                return false;
61
            }
62
        }
63
223
        _ptr = column;
64
223
        _offset = row;
65
223
        return true;
66
223
    }
_ZN5doris12PointerStoreILb1EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
55
209
    bool set_value(const IColumn* column, size_t row) {
56
        if constexpr (SkipNull && ArgIsNullable) {
57
            const auto* nc =
58
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
            if (nc->is_null_at(row)) {
60
                return false;
61
            }
62
        }
63
209
        _ptr = column;
64
209
        _offset = row;
65
209
        return true;
66
209
    }
Unexecuted instantiation: _ZN5doris12PointerStoreILb0EE9set_valueILb1EEEbPKNS_7IColumnEm
_ZN5doris12PointerStoreILb1EE9set_valueILb1EEEbPKNS_7IColumnEm
Line
Count
Source
55
5
    bool set_value(const IColumn* column, size_t row) {
56
5
        if constexpr (SkipNull && ArgIsNullable) {
57
5
            const auto* nc =
58
5
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
5
            if (nc->is_null_at(row)) {
60
1
                return false;
61
1
            }
62
5
        }
63
4
        _ptr = column;
64
5
        _offset = row;
65
5
        return true;
66
5
    }
67
68
51
    void insert_into(IColumn& to) const {
69
51
        if constexpr (ArgIsNullable) {
70
21
            const auto* nc = assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr);
71
21
            to.insert_from(nc->get_nested_column(), _offset);
72
30
        } else {
73
30
            to.insert_from(*_ptr, _offset);
74
30
        }
75
51
    }
_ZNK5doris12PointerStoreILb0EE11insert_intoERNS_7IColumnE
Line
Count
Source
68
30
    void insert_into(IColumn& to) const {
69
        if constexpr (ArgIsNullable) {
70
            const auto* nc = assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr);
71
            to.insert_from(nc->get_nested_column(), _offset);
72
30
        } else {
73
30
            to.insert_from(*_ptr, _offset);
74
30
        }
75
30
    }
_ZNK5doris12PointerStoreILb1EE11insert_intoERNS_7IColumnE
Line
Count
Source
68
21
    void insert_into(IColumn& to) const {
69
21
        if constexpr (ArgIsNullable) {
70
21
            const auto* nc = assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr);
71
21
            to.insert_from(nc->get_nested_column(), _offset);
72
        } else {
73
            to.insert_from(*_ptr, _offset);
74
        }
75
21
    }
76
77
0
    void reset() {
78
0
        _ptr = nullptr;
79
0
        _offset = 0;
80
0
    }
Unexecuted instantiation: _ZN5doris12PointerStoreILb0EE5resetEv
Unexecuted instantiation: _ZN5doris12PointerStoreILb1EE5resetEv
81
};
82
83
// Deep-copy storage: copies the value into a Field (load path).
84
template <bool ArgIsNullable>
85
struct CopyStore {
86
    Field _value;
87
    bool _is_null = true;
88
89
20
    bool is_null() const { return _is_null; }
Unexecuted instantiation: _ZNK5doris9CopyStoreILb0EE7is_nullEv
_ZNK5doris9CopyStoreILb1EE7is_nullEv
Line
Count
Source
89
20
    bool is_null() const { return _is_null; }
90
91
    template <bool SkipNull>
92
41
    bool set_value(const IColumn* column, size_t row) {
93
41
        if constexpr (ArgIsNullable) {
94
20
            const auto* nc =
95
20
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
96
20
            if (nc->is_null_at(row)) {
97
0
                if constexpr (SkipNull) {
98
0
                    return false;
99
0
                }
100
0
                _is_null = true;
101
0
                return true;
102
0
            }
103
20
            nc->get_nested_column().get(row, _value);
104
21
        } else {
105
21
            column->get(row, _value);
106
21
        }
107
0
        _is_null = false;
108
41
        return true;
109
41
    }
_ZN5doris9CopyStoreILb0EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
92
21
    bool set_value(const IColumn* column, size_t row) {
93
        if constexpr (ArgIsNullable) {
94
            const auto* nc =
95
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
96
            if (nc->is_null_at(row)) {
97
                if constexpr (SkipNull) {
98
                    return false;
99
                }
100
                _is_null = true;
101
                return true;
102
            }
103
            nc->get_nested_column().get(row, _value);
104
21
        } else {
105
21
            column->get(row, _value);
106
21
        }
107
21
        _is_null = false;
108
21
        return true;
109
21
    }
_ZN5doris9CopyStoreILb1EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
92
20
    bool set_value(const IColumn* column, size_t row) {
93
20
        if constexpr (ArgIsNullable) {
94
20
            const auto* nc =
95
20
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
96
20
            if (nc->is_null_at(row)) {
97
                if constexpr (SkipNull) {
98
                    return false;
99
                }
100
0
                _is_null = true;
101
0
                return true;
102
0
            }
103
20
            nc->get_nested_column().get(row, _value);
104
        } else {
105
            column->get(row, _value);
106
        }
107
0
        _is_null = false;
108
20
        return true;
109
20
    }
Unexecuted instantiation: _ZN5doris9CopyStoreILb0EE9set_valueILb1EEEbPKNS_7IColumnEm
Unexecuted instantiation: _ZN5doris9CopyStoreILb1EE9set_valueILb1EEEbPKNS_7IColumnEm
110
111
41
    void insert_into(IColumn& to) const { to.insert(_value); }
_ZNK5doris9CopyStoreILb0EE11insert_intoERNS_7IColumnE
Line
Count
Source
111
21
    void insert_into(IColumn& to) const { to.insert(_value); }
_ZNK5doris9CopyStoreILb1EE11insert_intoERNS_7IColumnE
Line
Count
Source
111
20
    void insert_into(IColumn& to) const { to.insert(_value); }
112
113
0
    void reset() {
114
0
        _is_null = true;
115
0
        _value = {};
116
0
    }
Unexecuted instantiation: _ZN5doris9CopyStoreILb0EE5resetEv
Unexecuted instantiation: _ZN5doris9CopyStoreILb1EE5resetEv
117
};
118
119
// ---------------------------------------------------------------------------
120
// Data layer: ReaderReplaceData
121
// Template params: IsFirst, SkipNull, ArgIsNullable
122
// IsCopy is derived: reader (IsFirst=true) deep-copies via Field because the source
123
// column will be reused; load (IsFirst=false) keeps a zero-copy pointer because
124
// insert_result_into is called while the column is still alive.
125
// ---------------------------------------------------------------------------
126
template <bool IsFirst, bool SkipNull, bool ArgIsNullable>
127
struct ReaderReplaceData {
128
    static constexpr bool IsCopy = IsFirst;
129
    using Store = std::conditional_t<IsCopy, CopyStore<ArgIsNullable>, PointerStore<ArgIsNullable>>;
130
131
    Store _store;
132
    bool _has_value = false;
133
134
865
    void add(int64_t row, const IColumn** columns) {
135
865
        if constexpr (IsFirst) {
136
428
            if (_has_value) {
137
387
                return;
138
387
            }
139
428
        }
140
865
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
477
            _has_value = true;
142
477
        }
143
865
    }
_ZN5doris17ReaderReplaceDataILb1ELb0ELb0EE3addElPPKNS_7IColumnE
Line
Count
Source
134
219
    void add(int64_t row, const IColumn** columns) {
135
219
        if constexpr (IsFirst) {
136
219
            if (_has_value) {
137
198
                return;
138
198
            }
139
219
        }
140
219
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
21
            _has_value = true;
142
21
        }
143
219
    }
_ZN5doris17ReaderReplaceDataILb1ELb0ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
209
    void add(int64_t row, const IColumn** columns) {
135
209
        if constexpr (IsFirst) {
136
209
            if (_has_value) {
137
189
                return;
138
189
            }
139
209
        }
140
209
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
20
            _has_value = true;
142
20
        }
143
209
    }
_ZN5doris17ReaderReplaceDataILb0ELb0ELb0EE3addElPPKNS_7IColumnE
Line
Count
Source
134
223
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
223
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
223
            _has_value = true;
142
223
        }
143
223
    }
_ZN5doris17ReaderReplaceDataILb0ELb0ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
209
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
209
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
209
            _has_value = true;
142
209
        }
143
209
    }
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb0EE3addElPPKNS_7IColumnE
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb1EE3addElPPKNS_7IColumnE
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb1ELb0EE3addElPPKNS_7IColumnE
_ZN5doris17ReaderReplaceDataILb0ELb1ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
5
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
5
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
4
            _has_value = true;
142
4
        }
143
5
    }
144
145
92
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
92
        if (result_is_nullable) {
147
41
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
41
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
41
            } else {
151
41
                nullable_col.get_null_map_data().push_back(0);
152
41
                _store.insert_into(nullable_col.get_nested_column());
153
41
            }
154
51
        } else {
155
51
            _store.insert_into(to);
156
51
        }
157
92
    }
_ZNK5doris17ReaderReplaceDataILb1ELb0ELb0EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
21
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
21
        if (result_is_nullable) {
147
0
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
0
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
0
            } else {
151
0
                nullable_col.get_null_map_data().push_back(0);
152
0
                _store.insert_into(nullable_col.get_nested_column());
153
0
            }
154
21
        } else {
155
21
            _store.insert_into(to);
156
21
        }
157
21
    }
_ZNK5doris17ReaderReplaceDataILb1ELb0ELb1EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
20
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
20
        if (result_is_nullable) {
147
20
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
20
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
20
            } else {
151
20
                nullable_col.get_null_map_data().push_back(0);
152
20
                _store.insert_into(nullable_col.get_nested_column());
153
20
            }
154
20
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
20
    }
_ZNK5doris17ReaderReplaceDataILb0ELb0ELb0EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
30
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
30
        if (result_is_nullable) {
147
0
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
0
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
0
            } else {
151
0
                nullable_col.get_null_map_data().push_back(0);
152
0
                _store.insert_into(nullable_col.get_nested_column());
153
0
            }
154
30
        } else {
155
30
            _store.insert_into(to);
156
30
        }
157
30
    }
_ZNK5doris17ReaderReplaceDataILb0ELb0ELb1EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
20
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
20
        if (result_is_nullable) {
147
20
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
20
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
20
            } else {
151
20
                nullable_col.get_null_map_data().push_back(0);
152
20
                _store.insert_into(nullable_col.get_nested_column());
153
20
            }
154
20
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
20
    }
Unexecuted instantiation: _ZNK5doris17ReaderReplaceDataILb1ELb1ELb0EE18insert_result_intoERNS_7IColumnEb
Unexecuted instantiation: _ZNK5doris17ReaderReplaceDataILb1ELb1ELb1EE18insert_result_intoERNS_7IColumnEb
Unexecuted instantiation: _ZNK5doris17ReaderReplaceDataILb0ELb1ELb0EE18insert_result_intoERNS_7IColumnEb
_ZNK5doris17ReaderReplaceDataILb0ELb1ELb1EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
1
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
1
        if (result_is_nullable) {
147
1
            auto& nullable_col = assert_cast<ColumnNullable&>(to);
148
1
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
1
            } else {
151
1
                nullable_col.get_null_map_data().push_back(0);
152
1
                _store.insert_into(nullable_col.get_nested_column());
153
1
            }
154
1
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
1
    }
158
159
0
    void reset() {
160
0
        _has_value = false;
161
0
        _store.reset();
162
0
    }
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb0ELb0EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb0ELb1EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb0ELb0EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb0ELb1EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb0EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb1EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb1ELb0EE5resetEv
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb1ELb1EE5resetEv
163
};
164
165
// ---------------------------------------------------------------------------
166
// Aggregate function class
167
// ---------------------------------------------------------------------------
168
template <bool IsFirst, bool SkipNull, bool ArgIsNullable>
169
class ReaderReplaceFunction final
170
        : public IAggregateFunctionDataHelper<
171
                  ReaderReplaceData<IsFirst, SkipNull, ArgIsNullable>,
172
                  ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>> {
173
    using Data = ReaderReplaceData<IsFirst, SkipNull, ArgIsNullable>;
174
175
public:
176
    ReaderReplaceFunction(const DataTypes& argument_types_, bool result_is_nullable)
177
107
            : IAggregateFunctionDataHelper<Data,
178
107
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
107
                      argument_types_),
180
107
              _argument_type(argument_types_[0]),
181
107
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb1ELb0ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
21
            : IAggregateFunctionDataHelper<Data,
178
21
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
21
                      argument_types_),
180
21
              _argument_type(argument_types_[0]),
181
21
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb1ELb0ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
20
            : IAggregateFunctionDataHelper<Data,
178
20
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
20
                      argument_types_),
180
20
              _argument_type(argument_types_[0]),
181
20
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb0ELb0ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
45
            : IAggregateFunctionDataHelper<Data,
178
45
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
45
                      argument_types_),
180
45
              _argument_type(argument_types_[0]),
181
45
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb0ELb0ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
20
            : IAggregateFunctionDataHelper<Data,
178
20
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
20
                      argument_types_),
180
20
              _argument_type(argument_types_[0]),
181
20
              _result_is_nullable(result_is_nullable) {}
Unexecuted instantiation: _ZN5doris21ReaderReplaceFunctionILb1ELb1ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Unexecuted instantiation: _ZN5doris21ReaderReplaceFunctionILb1ELb1ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Unexecuted instantiation: _ZN5doris21ReaderReplaceFunctionILb0ELb1ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
_ZN5doris21ReaderReplaceFunctionILb0ELb1ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
1
            : IAggregateFunctionDataHelper<Data,
178
1
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
1
                      argument_types_),
180
1
              _argument_type(argument_types_[0]),
181
1
              _result_is_nullable(result_is_nullable) {}
182
183
0
    String get_name() const override { return "reader_replace"; }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE8get_nameB5cxx11Ev
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE8get_nameB5cxx11Ev
184
185
0
    DataTypePtr get_return_type() const override {
186
0
        if (_result_is_nullable) {
187
0
            return make_nullable(_argument_type);
188
0
        }
189
0
        return _argument_type;
190
0
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE15get_return_typeEv
191
192
    void add(AggregateDataPtr place, const IColumn** columns, ssize_t row_num,
193
865
             Arena&) const override {
194
865
        this->data(place).add(row_num, columns);
195
865
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
219
             Arena&) const override {
194
219
        this->data(place).add(row_num, columns);
195
219
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
209
             Arena&) const override {
194
209
        this->data(place).add(row_num, columns);
195
209
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
223
             Arena&) const override {
194
223
        this->data(place).add(row_num, columns);
195
223
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
209
             Arena&) const override {
194
209
        this->data(place).add(row_num, columns);
195
209
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
_ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
5
             Arena&) const override {
194
5
        this->data(place).add(row_num, columns);
195
5
    }
196
197
92
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
92
        this->data(place).insert_result_into(to, _result_is_nullable);
199
92
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
21
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
21
        this->data(place).insert_result_into(to, _result_is_nullable);
199
21
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
20
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
20
        this->data(place).insert_result_into(to, _result_is_nullable);
199
20
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
30
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
30
        this->data(place).insert_result_into(to, _result_is_nullable);
199
30
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
20
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
20
        this->data(place).insert_result_into(to, _result_is_nullable);
199
20
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE18insert_result_intoEPKcRNS_7IColumnE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE18insert_result_intoEPKcRNS_7IColumnE
_ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
1
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
1
        this->data(place).insert_result_into(to, _result_is_nullable);
199
1
    }
200
201
0
    void reset(AggregateDataPtr place) const override { this->data(place).reset(); }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE5resetEPc
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE5resetEPc
202
203
    void add_range_single_place(int64_t, int64_t, int64_t, int64_t, AggregateDataPtr,
204
0
                                const IColumn**, Arena&, UInt8*, UInt8*) const override {
205
0
        throw doris::Exception(Status::FatalError(
206
0
                "ReaderReplaceFunction does not support add_range_single_place"));
207
0
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE22add_range_single_placeEllllPcPPKNS_7IColumnERNS_5ArenaEPhS9_
208
0
    void merge(AggregateDataPtr, ConstAggregateDataPtr, Arena&) const override {
209
0
        throw doris::Exception(Status::FatalError("ReaderReplaceFunction does not support merge"));
210
0
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE5mergeEPcPKcRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE5mergeEPcPKcRNS_5ArenaE
211
0
    void serialize(ConstAggregateDataPtr, BufferWritable&) const override {
212
0
        throw doris::Exception(
213
0
                Status::FatalError("ReaderReplaceFunction does not support serialize"));
214
0
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE9serializeEPKcRNS_14BufferWritableE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE9serializeEPKcRNS_14BufferWritableE
215
0
    void deserialize(AggregateDataPtr, BufferReadable&, Arena&) const override {
216
0
        throw doris::Exception(
217
0
                Status::FatalError("ReaderReplaceFunction does not support deserialize"));
218
0
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE11deserializeEPcRNS_14BufferReadableERNS_5ArenaE
219
220
private:
221
    DataTypePtr _argument_type;
222
    bool _result_is_nullable;
223
};
224
225
// ---------------------------------------------------------------------------
226
// Factory helpers
227
// ---------------------------------------------------------------------------
228
template <bool IsFirst, bool SkipNull, bool ArgIsNullable>
229
static AggregateFunctionPtr create_reader_replace(const std::string& /*name*/,
230
                                                  const DataTypes& argument_types_,
231
                                                  const DataTypePtr& /*result_type*/,
232
                                                  bool result_is_nullable,
233
107
                                                  const AggregateFunctionAttr& /*attr*/) {
234
107
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
107
            argument_types_, result_is_nullable);
236
107
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb0ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
21
                                                  const AggregateFunctionAttr& /*attr*/) {
234
21
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
21
            argument_types_, result_is_nullable);
236
21
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb0ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
20
                                                  const AggregateFunctionAttr& /*attr*/) {
234
20
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
20
            argument_types_, result_is_nullable);
236
20
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb0ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
45
                                                  const AggregateFunctionAttr& /*attr*/) {
234
45
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
45
            argument_types_, result_is_nullable);
236
45
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb0ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
20
                                                  const AggregateFunctionAttr& /*attr*/) {
234
20
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
20
            argument_types_, result_is_nullable);
236
20
}
Unexecuted instantiation: aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb1ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Unexecuted instantiation: aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb1ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Unexecuted instantiation: aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb1ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb1ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
1
                                                  const AggregateFunctionAttr& /*attr*/) {
234
1
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
1
            argument_types_, result_is_nullable);
236
1
}
237
238
// ---------------------------------------------------------------------------
239
// Registration
240
// ---------------------------------------------------------------------------
241
242
// only replace function in load/reader do different agg operation.
243
// because Doris can ensure that the data is globally ordered in reader, but cannot in load
244
// 1. reader: get the first value of input data  (IsFirst=true  → CopyStore, deep copy)
245
// 2. load:   get the last  value of input data  (IsFirst=false → PointerStore, zero-copy)
246
9
void register_aggregate_function_replace_reader_load(AggregateFunctionSimpleFactory& factory) {
247
9
    auto reg = [&](const std::string& name, const std::string& suffix,
248
9
                   const AggregateFunctionCreator& creator,
249
72
                   bool nullable) { factory.register_function(name + suffix, creator, nullable); };
250
251
    //                                         IsFirst SkipNull ArgNullable
252
    // replace – reader (first, pointer, accept null)
253
9
    reg("replace", AGG_READER_SUFFIX, create_reader_replace<true, false, false>, false);
254
9
    reg("replace", AGG_READER_SUFFIX, create_reader_replace<true, false, true>, true);
255
256
    // replace – load (last, copy, accept null)
257
9
    reg("replace", AGG_LOAD_SUFFIX, create_reader_replace<false, false, false>, false);
258
9
    reg("replace", AGG_LOAD_SUFFIX, create_reader_replace<false, false, true>, true);
259
260
    // replace_if_not_null – reader (first, pointer, skip null)
261
9
    reg("replace_if_not_null", AGG_READER_SUFFIX, create_reader_replace<true, true, false>, false);
262
9
    reg("replace_if_not_null", AGG_READER_SUFFIX, create_reader_replace<true, true, true>, true);
263
264
    // replace_if_not_null – load (last, copy, skip null)
265
9
    reg("replace_if_not_null", AGG_LOAD_SUFFIX, create_reader_replace<false, true, false>, false);
266
9
    reg("replace_if_not_null", AGG_LOAD_SUFFIX, create_reader_replace<false, true, true>, true);
267
9
}
268
269
} // namespace doris