Coverage Report

Created: 2026-07-24 22:25

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
42
    bool is_null() const {
44
42
        if (_ptr == nullptr) {
45
0
            return true;
46
0
        }
47
42
        if constexpr (ArgIsNullable) {
48
42
            return assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr)
49
42
                    ->is_null_at(_offset);
50
42
        }
51
0
        return false;
52
42
    }
Unexecuted instantiation: _ZNK5doris12PointerStoreILb0EE7is_nullEv
_ZNK5doris12PointerStoreILb1EE7is_nullEv
Line
Count
Source
43
42
    bool is_null() const {
44
42
        if (_ptr == nullptr) {
45
0
            return true;
46
0
        }
47
42
        if constexpr (ArgIsNullable) {
48
42
            return assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr)
49
42
                    ->is_null_at(_offset);
50
42
        }
51
0
        return false;
52
42
    }
53
54
    template <bool SkipNull>
55
874
    bool set_value(const IColumn* column, size_t row) {
56
874
        if constexpr (SkipNull && ArgIsNullable) {
57
10
            const auto* nc =
58
10
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
10
            if (nc->is_null_at(row)) {
60
2
                return false;
61
2
            }
62
10
        }
63
8
        _ptr = column;
64
874
        _offset = row;
65
874
        return true;
66
874
    }
_ZN5doris12PointerStoreILb0EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
55
446
    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
446
        _ptr = column;
64
446
        _offset = row;
65
446
        return true;
66
446
    }
_ZN5doris12PointerStoreILb1EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
55
418
    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
418
        _ptr = column;
64
418
        _offset = row;
65
418
        return true;
66
418
    }
Unexecuted instantiation: _ZN5doris12PointerStoreILb0EE9set_valueILb1EEEbPKNS_7IColumnEm
_ZN5doris12PointerStoreILb1EE9set_valueILb1EEEbPKNS_7IColumnEm
Line
Count
Source
55
10
    bool set_value(const IColumn* column, size_t row) {
56
10
        if constexpr (SkipNull && ArgIsNullable) {
57
10
            const auto* nc =
58
10
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
59
10
            if (nc->is_null_at(row)) {
60
2
                return false;
61
2
            }
62
10
        }
63
8
        _ptr = column;
64
10
        _offset = row;
65
10
        return true;
66
10
    }
67
68
102
    void insert_into(IColumn& to) const {
69
102
        if constexpr (ArgIsNullable) {
70
42
            const auto* nc = assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr);
71
42
            to.insert_from(nc->get_nested_column(), _offset);
72
60
        } else {
73
60
            to.insert_from(*_ptr, _offset);
74
60
        }
75
102
    }
_ZNK5doris12PointerStoreILb0EE11insert_intoERNS_7IColumnE
Line
Count
Source
68
60
    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
60
        } else {
73
60
            to.insert_from(*_ptr, _offset);
74
60
        }
75
60
    }
_ZNK5doris12PointerStoreILb1EE11insert_intoERNS_7IColumnE
Line
Count
Source
68
42
    void insert_into(IColumn& to) const {
69
42
        if constexpr (ArgIsNullable) {
70
42
            const auto* nc = assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(_ptr);
71
42
            to.insert_from(nc->get_nested_column(), _offset);
72
        } else {
73
            to.insert_from(*_ptr, _offset);
74
        }
75
42
    }
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
40
    bool is_null() const { return _is_null; }
Unexecuted instantiation: _ZNK5doris9CopyStoreILb0EE7is_nullEv
_ZNK5doris9CopyStoreILb1EE7is_nullEv
Line
Count
Source
89
40
    bool is_null() const { return _is_null; }
90
91
    template <bool SkipNull>
92
82
    bool set_value(const IColumn* column, size_t row) {
93
82
        if constexpr (ArgIsNullable) {
94
40
            const auto* nc =
95
40
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
96
40
            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
40
            nc->get_nested_column().get(row, _value);
104
42
        } else {
105
42
            column->get(row, _value);
106
42
        }
107
0
        _is_null = false;
108
82
        return true;
109
82
    }
_ZN5doris9CopyStoreILb0EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
92
42
    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
42
        } else {
105
42
            column->get(row, _value);
106
42
        }
107
42
        _is_null = false;
108
42
        return true;
109
42
    }
_ZN5doris9CopyStoreILb1EE9set_valueILb0EEEbPKNS_7IColumnEm
Line
Count
Source
92
40
    bool set_value(const IColumn* column, size_t row) {
93
40
        if constexpr (ArgIsNullable) {
94
40
            const auto* nc =
95
40
                    assert_cast<const ColumnNullable*, TypeCheckOnRelease::DISABLE>(column);
96
40
            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
40
            nc->get_nested_column().get(row, _value);
104
        } else {
105
            column->get(row, _value);
106
        }
107
0
        _is_null = false;
108
40
        return true;
109
40
    }
Unexecuted instantiation: _ZN5doris9CopyStoreILb0EE9set_valueILb1EEEbPKNS_7IColumnEm
Unexecuted instantiation: _ZN5doris9CopyStoreILb1EE9set_valueILb1EEEbPKNS_7IColumnEm
110
111
82
    void insert_into(IColumn& to) const { to.insert(_value); }
_ZNK5doris9CopyStoreILb0EE11insert_intoERNS_7IColumnE
Line
Count
Source
111
42
    void insert_into(IColumn& to) const { to.insert(_value); }
_ZNK5doris9CopyStoreILb1EE11insert_intoERNS_7IColumnE
Line
Count
Source
111
40
    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
1.73k
    void add(int64_t row, const IColumn** columns) {
135
1.73k
        if constexpr (IsFirst) {
136
856
            if (_has_value) {
137
774
                return;
138
774
            }
139
856
        }
140
1.73k
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
954
            _has_value = true;
142
954
        }
143
1.73k
    }
_ZN5doris17ReaderReplaceDataILb1ELb0ELb0EE3addElPPKNS_7IColumnE
Line
Count
Source
134
438
    void add(int64_t row, const IColumn** columns) {
135
438
        if constexpr (IsFirst) {
136
438
            if (_has_value) {
137
396
                return;
138
396
            }
139
438
        }
140
438
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
42
            _has_value = true;
142
42
        }
143
438
    }
_ZN5doris17ReaderReplaceDataILb1ELb0ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
418
    void add(int64_t row, const IColumn** columns) {
135
418
        if constexpr (IsFirst) {
136
418
            if (_has_value) {
137
378
                return;
138
378
            }
139
418
        }
140
418
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
40
            _has_value = true;
142
40
        }
143
418
    }
_ZN5doris17ReaderReplaceDataILb0ELb0ELb0EE3addElPPKNS_7IColumnE
Line
Count
Source
134
446
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
446
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
446
            _has_value = true;
142
446
        }
143
446
    }
_ZN5doris17ReaderReplaceDataILb0ELb0ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
418
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
418
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
418
            _has_value = true;
142
418
        }
143
418
    }
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb0EE3addElPPKNS_7IColumnE
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb1ELb1ELb1EE3addElPPKNS_7IColumnE
Unexecuted instantiation: _ZN5doris17ReaderReplaceDataILb0ELb1ELb0EE3addElPPKNS_7IColumnE
_ZN5doris17ReaderReplaceDataILb0ELb1ELb1EE3addElPPKNS_7IColumnE
Line
Count
Source
134
10
    void add(int64_t row, const IColumn** columns) {
135
        if constexpr (IsFirst) {
136
            if (_has_value) {
137
                return;
138
            }
139
        }
140
10
        if (_store.template set_value<SkipNull>(columns[0], row)) {
141
8
            _has_value = true;
142
8
        }
143
10
    }
144
145
184
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
184
        if (result_is_nullable) {
147
82
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(to);
148
82
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
82
            } else {
151
82
                nullable_col.get_null_map_data().push_back(0);
152
82
                _store.insert_into(nullable_col.get_nested_column());
153
82
            }
154
102
        } else {
155
102
            _store.insert_into(to);
156
102
        }
157
184
    }
_ZNK5doris17ReaderReplaceDataILb1ELb0ELb0EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
42
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
42
        if (result_is_nullable) {
147
0
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(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
42
        } else {
155
42
            _store.insert_into(to);
156
42
        }
157
42
    }
_ZNK5doris17ReaderReplaceDataILb1ELb0ELb1EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
40
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
40
        if (result_is_nullable) {
147
40
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(to);
148
40
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
40
            } else {
151
40
                nullable_col.get_null_map_data().push_back(0);
152
40
                _store.insert_into(nullable_col.get_nested_column());
153
40
            }
154
40
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
40
    }
_ZNK5doris17ReaderReplaceDataILb0ELb0ELb0EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
60
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
60
        if (result_is_nullable) {
147
0
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(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
60
        } else {
155
60
            _store.insert_into(to);
156
60
        }
157
60
    }
_ZNK5doris17ReaderReplaceDataILb0ELb0ELb1EE18insert_result_intoERNS_7IColumnEb
Line
Count
Source
145
40
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
40
        if (result_is_nullable) {
147
40
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(to);
148
40
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
40
            } else {
151
40
                nullable_col.get_null_map_data().push_back(0);
152
40
                _store.insert_into(nullable_col.get_nested_column());
153
40
            }
154
40
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
40
    }
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
2
    void insert_result_into(IColumn& to, bool result_is_nullable) const {
146
2
        if (result_is_nullable) {
147
2
            auto& nullable_col = assert_cast<ColumnNullable&, TypeCheckOnRelease::DISABLE>(to);
148
2
            if (!_has_value || _store.is_null()) {
149
0
                nullable_col.insert_default();
150
2
            } else {
151
2
                nullable_col.get_null_map_data().push_back(0);
152
2
                _store.insert_into(nullable_col.get_nested_column());
153
2
            }
154
2
        } else {
155
0
            _store.insert_into(to);
156
0
        }
157
2
    }
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
214
            : IAggregateFunctionDataHelper<Data,
178
214
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
214
                      argument_types_),
180
214
              _argument_type(argument_types_[0]),
181
214
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb1ELb0ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
42
            : IAggregateFunctionDataHelper<Data,
178
42
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
42
                      argument_types_),
180
42
              _argument_type(argument_types_[0]),
181
42
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb1ELb0ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
40
            : IAggregateFunctionDataHelper<Data,
178
40
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
40
                      argument_types_),
180
40
              _argument_type(argument_types_[0]),
181
40
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb0ELb0ELb0EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
90
            : IAggregateFunctionDataHelper<Data,
178
90
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
90
                      argument_types_),
180
90
              _argument_type(argument_types_[0]),
181
90
              _result_is_nullable(result_is_nullable) {}
_ZN5doris21ReaderReplaceFunctionILb0ELb0ELb1EEC2ERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS6_EEb
Line
Count
Source
177
40
            : IAggregateFunctionDataHelper<Data,
178
40
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
40
                      argument_types_),
180
40
              _argument_type(argument_types_[0]),
181
40
              _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
2
            : IAggregateFunctionDataHelper<Data,
178
2
                                           ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
179
2
                      argument_types_),
180
2
              _argument_type(argument_types_[0]),
181
2
              _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
48
    DataTypePtr get_return_type() const override {
186
48
        if (_result_is_nullable) {
187
0
            return make_nullable(_argument_type);
188
0
        }
189
48
        return _argument_type;
190
48
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE15get_return_typeEv
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE15get_return_typeEv
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE15get_return_typeEv
Line
Count
Source
185
48
    DataTypePtr get_return_type() const override {
186
48
        if (_result_is_nullable) {
187
0
            return make_nullable(_argument_type);
188
0
        }
189
48
        return _argument_type;
190
48
    }
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
1.73k
             Arena&) const override {
194
1.73k
        this->data(place).add(row_num, columns);
195
1.73k
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
438
             Arena&) const override {
194
438
        this->data(place).add(row_num, columns);
195
438
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
418
             Arena&) const override {
194
418
        this->data(place).add(row_num, columns);
195
418
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
446
             Arena&) const override {
194
446
        this->data(place).add(row_num, columns);
195
446
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
418
             Arena&) const override {
194
418
        this->data(place).add(row_num, columns);
195
418
    }
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb1ELb1ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Unexecuted instantiation: _ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb0EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
_ZNK5doris21ReaderReplaceFunctionILb0ELb1ELb1EE3addEPcPPKNS_7IColumnElRNS_5ArenaE
Line
Count
Source
193
10
             Arena&) const override {
194
10
        this->data(place).add(row_num, columns);
195
10
    }
196
197
184
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
184
        this->data(place).insert_result_into(to, _result_is_nullable);
199
184
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb0EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
42
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
42
        this->data(place).insert_result_into(to, _result_is_nullable);
199
42
    }
_ZNK5doris21ReaderReplaceFunctionILb1ELb0ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
40
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
40
        this->data(place).insert_result_into(to, _result_is_nullable);
199
40
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb0EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
60
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
60
        this->data(place).insert_result_into(to, _result_is_nullable);
199
60
    }
_ZNK5doris21ReaderReplaceFunctionILb0ELb0ELb1EE18insert_result_intoEPKcRNS_7IColumnE
Line
Count
Source
197
40
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
40
        this->data(place).insert_result_into(to, _result_is_nullable);
199
40
    }
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
2
    void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override {
198
2
        this->data(place).insert_result_into(to, _result_is_nullable);
199
2
    }
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
214
                                                  const AggregateFunctionAttr& /*attr*/) {
234
214
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
214
            argument_types_, result_is_nullable);
236
214
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb0ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
42
                                                  const AggregateFunctionAttr& /*attr*/) {
234
42
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
42
            argument_types_, result_is_nullable);
236
42
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb1ELb0ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
40
                                                  const AggregateFunctionAttr& /*attr*/) {
234
40
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
40
            argument_types_, result_is_nullable);
236
40
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb0ELb0EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
90
                                                  const AggregateFunctionAttr& /*attr*/) {
234
90
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
90
            argument_types_, result_is_nullable);
236
90
}
aggregate_function_reader_replace.cpp:_ZN5dorisL21create_reader_replaceILb0ELb0ELb1EEESt10shared_ptrINS_18IAggregateFunctionEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS1_IKNS_9IDataTypeEESaISF_EERKSF_bRKNS_21AggregateFunctionAttrE
Line
Count
Source
233
40
                                                  const AggregateFunctionAttr& /*attr*/) {
234
40
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
40
            argument_types_, result_is_nullable);
236
40
}
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
2
                                                  const AggregateFunctionAttr& /*attr*/) {
234
2
    return std::make_shared<ReaderReplaceFunction<IsFirst, SkipNull, ArgIsNullable>>(
235
2
            argument_types_, result_is_nullable);
236
2
}
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
18
void register_aggregate_function_replace_reader_load(AggregateFunctionSimpleFactory& factory) {
247
18
    auto reg = [&](const std::string& name, const std::string& suffix,
248
18
                   const AggregateFunctionCreator& creator,
249
144
                   bool nullable) { factory.register_function(name + suffix, creator, nullable); };
250
251
    //                                         IsFirst SkipNull ArgNullable
252
    // replace – reader (first, pointer, accept null)
253
18
    reg("replace", AGG_READER_SUFFIX, create_reader_replace<true, false, false>, false);
254
18
    reg("replace", AGG_READER_SUFFIX, create_reader_replace<true, false, true>, true);
255
256
    // replace – load (last, copy, accept null)
257
18
    reg("replace", AGG_LOAD_SUFFIX, create_reader_replace<false, false, false>, false);
258
18
    reg("replace", AGG_LOAD_SUFFIX, create_reader_replace<false, false, true>, true);
259
260
    // replace_if_not_null – reader (first, pointer, skip null)
261
18
    reg("replace_if_not_null", AGG_READER_SUFFIX, create_reader_replace<true, true, false>, false);
262
18
    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
18
    reg("replace_if_not_null", AGG_LOAD_SUFFIX, create_reader_replace<false, true, false>, false);
266
18
    reg("replace_if_not_null", AGG_LOAD_SUFFIX, create_reader_replace<false, true, true>, true);
267
18
}
268
269
} // namespace doris