Coverage Report

Created: 2026-03-31 15:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/storage/row_cursor.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 "storage/row_cursor.h"
19
20
#include <glog/logging.h>
21
22
#include <algorithm>
23
#include <numeric>
24
#include <ostream>
25
26
#include "common/cast_set.h"
27
#include "common/consts.h"
28
#include "core/data_type/primitive_type.h"
29
#include "core/field.h"
30
#include "storage/field.h"
31
#include "storage/olap_common.h"
32
#include "storage/olap_define.h"
33
#include "storage/tablet/tablet_schema.h"
34
#include "storage/types.h"
35
#include "util/slice.h"
36
37
namespace doris {
38
#include "common/compile_check_begin.h"
39
using namespace ErrorCode;
40
41
4.05M
RowCursor::RowCursor() = default;
42
4.06M
RowCursor::~RowCursor() = default;
43
0
RowCursor::RowCursor(RowCursor&&) noexcept = default;
44
0
RowCursor& RowCursor::operator=(RowCursor&&) noexcept = default;
45
46
358
void RowCursor::_init_schema(TabletSchemaSPtr schema, uint32_t column_count) {
47
358
    std::vector<uint32_t> columns(column_count);
48
358
    std::iota(columns.begin(), columns.end(), 0);
49
358
    _schema.reset(new Schema(schema->columns(), columns));
50
358
}
51
52
3.26M
void RowCursor::_init_schema(const std::shared_ptr<Schema>& shared_schema, uint32_t column_count) {
53
3.26M
    _schema.reset(new Schema(*shared_schema));
54
3.26M
}
55
56
94
Status RowCursor::init(TabletSchemaSPtr schema, size_t num_columns) {
57
94
    if (num_columns > schema->num_columns()) {
58
0
        return Status::Error<INVALID_ARGUMENT>(
59
0
                "Input param are invalid. Column count is bigger than num_columns of schema. "
60
0
                "column_count={}, schema.num_columns={}",
61
0
                num_columns, schema->num_columns());
62
0
    }
63
94
    _init_schema(schema, cast_set<uint32_t>(num_columns));
64
    // Initialize all fields as null (TYPE_NULL).
65
94
    _fields.resize(num_columns);
66
94
    return Status::OK();
67
94
}
68
69
0
Status RowCursor::init(TabletSchemaSPtr schema, const OlapTuple& tuple) {
70
0
    size_t key_size = tuple.size();
71
0
    if (key_size > schema->num_columns()) {
72
0
        return Status::Error<INVALID_ARGUMENT>(
73
0
                "Input param are invalid. Column count is bigger than num_columns of schema. "
74
0
                "column_count={}, schema.num_columns={}",
75
0
                key_size, schema->num_columns());
76
0
    }
77
0
    _init_schema(schema, cast_set<uint32_t>(key_size));
78
0
    return from_tuple(tuple);
79
0
}
80
81
Status RowCursor::init(TabletSchemaSPtr schema, const OlapTuple& tuple,
82
3.28M
                       const std::shared_ptr<Schema>& shared_schema) {
83
3.28M
    size_t key_size = tuple.size();
84
3.28M
    if (key_size > schema->num_columns()) {
85
0
        return Status::Error<INVALID_ARGUMENT>(
86
0
                "Input param are invalid. Column count is bigger than num_columns of schema. "
87
0
                "column_count={}, schema.num_columns={}",
88
0
                key_size, schema->num_columns());
89
0
    }
90
3.28M
    _init_schema(shared_schema, cast_set<uint32_t>(key_size));
91
3.28M
    return from_tuple(tuple);
92
3.28M
}
93
94
264
Status RowCursor::init_scan_key(TabletSchemaSPtr schema, std::vector<Field> fields) {
95
264
    size_t key_size = fields.size();
96
264
    if (key_size > schema->num_columns()) {
97
0
        return Status::Error<INVALID_ARGUMENT>(
98
0
                "Input param are invalid. Column count is bigger than num_columns of schema. "
99
0
                "column_count={}, schema.num_columns={}",
100
0
                key_size, schema->num_columns());
101
0
    }
102
264
    _init_schema(schema, cast_set<uint32_t>(key_size));
103
264
    _fields = std::move(fields);
104
264
    return Status::OK();
105
264
}
106
107
3.27M
Status RowCursor::from_tuple(const OlapTuple& tuple) {
108
3.27M
    if (tuple.size() != _schema->num_column_ids()) {
109
0
        return Status::Error<INVALID_ARGUMENT>(
110
0
                "column count does not match. tuple_size={}, field_count={}", tuple.size(),
111
0
                _schema->num_column_ids());
112
0
    }
113
3.27M
    _fields.resize(tuple.size());
114
10.6M
    for (size_t i = 0; i < tuple.size(); ++i) {
115
7.41M
        _fields[i] = tuple.get_field(i);
116
7.41M
    }
117
3.27M
    return Status::OK();
118
3.27M
}
119
120
770k
RowCursor RowCursor::clone() const {
121
770k
    RowCursor result;
122
770k
    result._schema = std::make_unique<Schema>(*_schema);
123
770k
    result._fields = _fields;
124
770k
    return result;
125
770k
}
126
127
773k
void RowCursor::pad_char_fields() {
128
1.56M
    for (size_t i = 0; i < _fields.size(); ++i) {
129
787k
        const StorageField* col = _schema->column(cast_set<uint32_t>(i));
130
787k
        if (col->type() == FieldType::OLAP_FIELD_TYPE_CHAR && !_fields[i].is_null()) {
131
724
            String padded = _fields[i].get<TYPE_CHAR>();
132
724
            padded.resize(col->length(), '\0');
133
724
            _fields[i] = Field::create_field<TYPE_CHAR>(std::move(padded));
134
724
        }
135
787k
    }
136
773k
}
137
138
9.27M
std::string RowCursor::to_string() const {
139
9.27M
    std::string result;
140
34.5M
    for (size_t i = 0; i < _fields.size(); ++i) {
141
25.2M
        if (i > 0) {
142
15.9M
            result.append("|");
143
15.9M
        }
144
25.2M
        if (_fields[i].is_null()) {
145
428k
            result.append("1&NULL");
146
24.8M
        } else {
147
24.8M
            result.append("0&");
148
24.8M
            result.append(_fields[i].to_debug_string(
149
24.8M
                    _schema->column(cast_set<uint32_t>(i))->get_scale()));
150
24.8M
        }
151
25.2M
    }
152
9.27M
    return result;
153
9.27M
}
154
155
// Convert a Field value to its storage representation via PrimitiveTypeConvertor and encode.
156
// For most types this is an identity conversion; for DATE, DATETIME, DECIMALV2 it does
157
// actual conversion to the olap storage format.
158
template <PrimitiveType PT>
159
static void encode_non_string_field(const StorageField* storage_field, const Field& f,
160
1.22M
                                    bool full_encode, std::string* buf) {
161
1.22M
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
1.22M
    if (full_encode) {
163
536k
        storage_field->full_encode_ascending(&storage_val, buf);
164
686k
    } else {
165
686k
        storage_field->encode_ascending(&storage_val, buf);
166
686k
    }
167
1.22M
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE2EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
2.58k
                                    bool full_encode, std::string* buf) {
161
2.58k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
2.58k
    if (full_encode) {
163
231
        storage_field->full_encode_ascending(&storage_val, buf);
164
2.35k
    } else {
165
2.35k
        storage_field->encode_ascending(&storage_val, buf);
166
2.35k
    }
167
2.58k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE3EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
164k
                                    bool full_encode, std::string* buf) {
161
164k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
164k
    if (full_encode) {
163
6.45k
        storage_field->full_encode_ascending(&storage_val, buf);
164
157k
    } else {
165
157k
        storage_field->encode_ascending(&storage_val, buf);
166
157k
    }
167
164k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE4EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
10.1k
                                    bool full_encode, std::string* buf) {
161
10.1k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
10.1k
    if (full_encode) {
163
2.24k
        storage_field->full_encode_ascending(&storage_val, buf);
164
7.87k
    } else {
165
7.87k
        storage_field->encode_ascending(&storage_val, buf);
166
7.87k
    }
167
10.1k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE5EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
688k
                                    bool full_encode, std::string* buf) {
161
688k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
688k
    if (full_encode) {
163
477k
        storage_field->full_encode_ascending(&storage_val, buf);
164
477k
    } else {
165
210k
        storage_field->encode_ascending(&storage_val, buf);
166
210k
    }
167
688k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE6EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
31.8k
                                    bool full_encode, std::string* buf) {
161
31.8k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
31.8k
    if (full_encode) {
163
5.62k
        storage_field->full_encode_ascending(&storage_val, buf);
164
26.2k
    } else {
165
26.2k
        storage_field->encode_ascending(&storage_val, buf);
166
26.2k
    }
167
31.8k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE7EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
13.4k
                                    bool full_encode, std::string* buf) {
161
13.4k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
13.4k
    if (full_encode) {
163
1.49k
        storage_field->full_encode_ascending(&storage_val, buf);
164
11.9k
    } else {
165
11.9k
        storage_field->encode_ascending(&storage_val, buf);
166
11.9k
    }
167
13.4k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE8EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
8
                                    bool full_encode, std::string* buf) {
161
8
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
8
    if (full_encode) {
163
2
        storage_field->full_encode_ascending(&storage_val, buf);
164
6
    } else {
165
6
        storage_field->encode_ascending(&storage_val, buf);
166
6
    }
167
8
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE9EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
3
                                    bool full_encode, std::string* buf) {
161
3
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
3
    if (full_encode) {
163
1
        storage_field->full_encode_ascending(&storage_val, buf);
164
2
    } else {
165
2
        storage_field->encode_ascending(&storage_val, buf);
166
2
    }
167
3
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE11EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
13.7k
                                    bool full_encode, std::string* buf) {
161
13.7k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
13.7k
    if (full_encode) {
163
5.47k
        storage_field->full_encode_ascending(&storage_val, buf);
164
8.24k
    } else {
165
8.24k
        storage_field->encode_ascending(&storage_val, buf);
166
8.24k
    }
167
13.7k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE12EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
190
                                    bool full_encode, std::string* buf) {
161
190
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
190
    if (full_encode) {
163
6
        storage_field->full_encode_ascending(&storage_val, buf);
164
184
    } else {
165
184
        storage_field->encode_ascending(&storage_val, buf);
166
184
    }
167
190
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE25EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
281k
                                    bool full_encode, std::string* buf) {
161
281k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
281k
    if (full_encode) {
163
31.6k
        storage_field->full_encode_ascending(&storage_val, buf);
164
250k
    } else {
165
250k
        storage_field->encode_ascending(&storage_val, buf);
166
250k
    }
167
281k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE26EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
7.17k
                                    bool full_encode, std::string* buf) {
161
7.17k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
7.17k
    if (full_encode) {
163
2.51k
        storage_field->full_encode_ascending(&storage_val, buf);
164
4.66k
    } else {
165
4.66k
        storage_field->encode_ascending(&storage_val, buf);
166
4.66k
    }
167
7.17k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE42EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
7.81k
                                    bool full_encode, std::string* buf) {
161
7.81k
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
7.81k
    if (full_encode) {
163
3.07k
        storage_field->full_encode_ascending(&storage_val, buf);
164
4.74k
    } else {
165
4.74k
        storage_field->encode_ascending(&storage_val, buf);
166
4.74k
    }
167
7.81k
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE20EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
116
                                    bool full_encode, std::string* buf) {
161
116
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
116
    if (full_encode) {
163
15
        storage_field->full_encode_ascending(&storage_val, buf);
164
101
    } else {
165
101
        storage_field->encode_ascending(&storage_val, buf);
166
101
    }
167
116
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE28EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
429
                                    bool full_encode, std::string* buf) {
161
429
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
429
    if (full_encode) {
163
70
        storage_field->full_encode_ascending(&storage_val, buf);
164
359
    } else {
165
359
        storage_field->encode_ascending(&storage_val, buf);
166
359
    }
167
429
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE29EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
351
                                    bool full_encode, std::string* buf) {
161
351
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
351
    if (full_encode) {
163
54
        storage_field->full_encode_ascending(&storage_val, buf);
164
297
    } else {
165
297
        storage_field->encode_ascending(&storage_val, buf);
166
297
    }
167
351
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE30EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
846
                                    bool full_encode, std::string* buf) {
161
846
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
846
    if (full_encode) {
163
99
        storage_field->full_encode_ascending(&storage_val, buf);
164
747
    } else {
165
747
        storage_field->encode_ascending(&storage_val, buf);
166
747
    }
167
846
}
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE35EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
762
                                    bool full_encode, std::string* buf) {
161
762
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
762
    if (full_encode) {
163
0
        storage_field->full_encode_ascending(&storage_val, buf);
164
762
    } else {
165
762
        storage_field->encode_ascending(&storage_val, buf);
166
762
    }
167
762
}
Unexecuted instantiation: row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE36EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
row_cursor.cpp:_ZN5dorisL23encode_non_string_fieldILNS_13PrimitiveTypeE37EEEvPKNS_12StorageFieldERKNS_5FieldEbPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
160
2
                                    bool full_encode, std::string* buf) {
161
2
    auto storage_val = PrimitiveTypeConvertor<PT>::to_storage_field_type(f.get<PT>());
162
2
    if (full_encode) {
163
0
        storage_field->full_encode_ascending(&storage_val, buf);
164
2
    } else {
165
2
        storage_field->encode_ascending(&storage_val, buf);
166
2
    }
167
2
}
168
169
void RowCursor::_encode_field(const StorageField* storage_field, const Field& f, bool full_encode,
170
13.8M
                              std::string* buf) const {
171
13.8M
    FieldType ft = storage_field->type();
172
173
13.8M
    if (field_is_slice_type(ft)) {
174
        // String types: CHAR, VARCHAR, STRING — all stored as String in Field.
175
12.6M
        const String& str = f.get<TYPE_STRING>();
176
177
12.6M
        if (ft == FieldType::OLAP_FIELD_TYPE_CHAR) {
178
            // CHAR type: must pad with \0 to the declared column length
179
778
            size_t col_len = storage_field->length();
180
778
            String padded(col_len, '\0');
181
778
            memcpy(padded.data(), str.data(), std::min(str.size(), col_len));
182
183
778
            Slice slice(padded.data(), col_len);
184
778
            if (full_encode) {
185
50
                storage_field->full_encode_ascending(&slice, buf);
186
728
            } else {
187
728
                storage_field->encode_ascending(&slice, buf);
188
728
            }
189
12.6M
        } else {
190
            // VARCHAR / STRING: use actual length
191
12.6M
            Slice slice(str.data(), str.size());
192
12.6M
            if (full_encode) {
193
12.6M
                storage_field->full_encode_ascending(&slice, buf);
194
12.6M
            } else {
195
22.3k
                storage_field->encode_ascending(&slice, buf);
196
22.3k
            }
197
12.6M
        }
198
12.6M
        return;
199
12.6M
    }
200
201
    // Non-string types: convert Field value to storage format via PrimitiveTypeConvertor,
202
    // then encode. For most types this is an identity conversion.
203
1.21M
    switch (ft) {
204
2.59k
    case FieldType::OLAP_FIELD_TYPE_BOOL:
205
2.59k
        encode_non_string_field<TYPE_BOOLEAN>(storage_field, f, full_encode, buf);
206
2.59k
        break;
207
164k
    case FieldType::OLAP_FIELD_TYPE_TINYINT:
208
164k
        encode_non_string_field<TYPE_TINYINT>(storage_field, f, full_encode, buf);
209
164k
        break;
210
10.1k
    case FieldType::OLAP_FIELD_TYPE_SMALLINT:
211
10.1k
        encode_non_string_field<TYPE_SMALLINT>(storage_field, f, full_encode, buf);
212
10.1k
        break;
213
687k
    case FieldType::OLAP_FIELD_TYPE_INT:
214
687k
        encode_non_string_field<TYPE_INT>(storage_field, f, full_encode, buf);
215
687k
        break;
216
31.8k
    case FieldType::OLAP_FIELD_TYPE_BIGINT:
217
31.8k
        encode_non_string_field<TYPE_BIGINT>(storage_field, f, full_encode, buf);
218
31.8k
        break;
219
13.4k
    case FieldType::OLAP_FIELD_TYPE_LARGEINT:
220
13.4k
        encode_non_string_field<TYPE_LARGEINT>(storage_field, f, full_encode, buf);
221
13.4k
        break;
222
8
    case FieldType::OLAP_FIELD_TYPE_FLOAT:
223
8
        encode_non_string_field<TYPE_FLOAT>(storage_field, f, full_encode, buf);
224
8
        break;
225
3
    case FieldType::OLAP_FIELD_TYPE_DOUBLE:
226
3
        encode_non_string_field<TYPE_DOUBLE>(storage_field, f, full_encode, buf);
227
3
        break;
228
13.7k
    case FieldType::OLAP_FIELD_TYPE_DATE:
229
13.7k
        encode_non_string_field<TYPE_DATE>(storage_field, f, full_encode, buf);
230
13.7k
        break;
231
190
    case FieldType::OLAP_FIELD_TYPE_DATETIME:
232
190
        encode_non_string_field<TYPE_DATETIME>(storage_field, f, full_encode, buf);
233
190
        break;
234
281k
    case FieldType::OLAP_FIELD_TYPE_DATEV2:
235
281k
        encode_non_string_field<TYPE_DATEV2>(storage_field, f, full_encode, buf);
236
281k
        break;
237
7.18k
    case FieldType::OLAP_FIELD_TYPE_DATETIMEV2:
238
7.18k
        encode_non_string_field<TYPE_DATETIMEV2>(storage_field, f, full_encode, buf);
239
7.18k
        break;
240
7.82k
    case FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ:
241
7.82k
        encode_non_string_field<TYPE_TIMESTAMPTZ>(storage_field, f, full_encode, buf);
242
7.82k
        break;
243
116
    case FieldType::OLAP_FIELD_TYPE_DECIMAL:
244
116
        encode_non_string_field<TYPE_DECIMALV2>(storage_field, f, full_encode, buf);
245
116
        break;
246
429
    case FieldType::OLAP_FIELD_TYPE_DECIMAL32:
247
429
        encode_non_string_field<TYPE_DECIMAL32>(storage_field, f, full_encode, buf);
248
429
        break;
249
351
    case FieldType::OLAP_FIELD_TYPE_DECIMAL64:
250
351
        encode_non_string_field<TYPE_DECIMAL64>(storage_field, f, full_encode, buf);
251
351
        break;
252
846
    case FieldType::OLAP_FIELD_TYPE_DECIMAL128I:
253
846
        encode_non_string_field<TYPE_DECIMAL128I>(storage_field, f, full_encode, buf);
254
846
        break;
255
762
    case FieldType::OLAP_FIELD_TYPE_DECIMAL256:
256
762
        encode_non_string_field<TYPE_DECIMAL256>(storage_field, f, full_encode, buf);
257
762
        break;
258
0
    case FieldType::OLAP_FIELD_TYPE_IPV4:
259
0
        encode_non_string_field<TYPE_IPV4>(storage_field, f, full_encode, buf);
260
0
        break;
261
2
    case FieldType::OLAP_FIELD_TYPE_IPV6:
262
2
        encode_non_string_field<TYPE_IPV6>(storage_field, f, full_encode, buf);
263
2
        break;
264
0
    default:
265
0
        LOG(FATAL) << "unsupported field type for encoding: " << int(ft);
266
0
        break;
267
1.21M
    }
268
1.21M
}
269
270
template <bool is_mow>
271
void RowCursor::encode_key_with_padding(std::string* buf, size_t num_keys,
272
4.16M
                                        bool padding_minimal) const {
273
17.7M
    for (uint32_t cid = 0; cid < num_keys; cid++) {
274
17.5M
        auto* storage_field = _schema->column(cid);
275
17.5M
        if (storage_field == nullptr) {
276
3.91M
            if (padding_minimal) {
277
1.79M
                buf->push_back(KeyConsts::KEY_MINIMAL_MARKER);
278
2.12M
            } else {
279
2.12M
                if (is_mow) {
280
1.80M
                    buf->push_back(KeyConsts::KEY_NORMAL_NEXT_MARKER);
281
1.80M
                } else {
282
323k
                    buf->push_back(KeyConsts::KEY_MAXIMAL_MARKER);
283
323k
                }
284
2.12M
            }
285
3.91M
            break;
286
3.91M
        }
287
288
13.6M
        if (cid >= _fields.size() || _fields[cid].is_null()) {
289
105k
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
290
105k
            continue;
291
105k
        }
292
293
13.5M
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
294
13.5M
        _encode_field(storage_field, _fields[cid], is_mow, buf);
295
13.5M
    }
296
4.16M
}
_ZNK5doris9RowCursor23encode_key_with_paddingILb0EEEvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmb
Line
Count
Source
272
771k
                                        bool padding_minimal) const {
273
1.55M
    for (uint32_t cid = 0; cid < num_keys; cid++) {
274
1.35M
        auto* storage_field = _schema->column(cid);
275
1.35M
        if (storage_field == nullptr) {
276
572k
            if (padding_minimal) {
277
247k
                buf->push_back(KeyConsts::KEY_MINIMAL_MARKER);
278
324k
            } else {
279
324k
                if (is_mow) {
280
0
                    buf->push_back(KeyConsts::KEY_NORMAL_NEXT_MARKER);
281
324k
                } else {
282
324k
                    buf->push_back(KeyConsts::KEY_MAXIMAL_MARKER);
283
324k
                }
284
324k
            }
285
572k
            break;
286
572k
        }
287
288
787k
        if (cid >= _fields.size() || _fields[cid].is_null()) {
289
89.7k
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
290
89.7k
            continue;
291
89.7k
        }
292
293
693k
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
294
693k
        _encode_field(storage_field, _fields[cid], is_mow, buf);
295
693k
    }
296
771k
}
_ZNK5doris9RowCursor23encode_key_with_paddingILb1EEEvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmb
Line
Count
Source
272
3.39M
                                        bool padding_minimal) const {
273
16.2M
    for (uint32_t cid = 0; cid < num_keys; cid++) {
274
16.1M
        auto* storage_field = _schema->column(cid);
275
16.1M
        if (storage_field == nullptr) {
276
3.34M
            if (padding_minimal) {
277
1.54M
                buf->push_back(KeyConsts::KEY_MINIMAL_MARKER);
278
1.80M
            } else {
279
1.80M
                if (is_mow) {
280
1.80M
                    buf->push_back(KeyConsts::KEY_NORMAL_NEXT_MARKER);
281
18.4E
                } else {
282
18.4E
                    buf->push_back(KeyConsts::KEY_MAXIMAL_MARKER);
283
18.4E
                }
284
1.80M
            }
285
3.34M
            break;
286
3.34M
        }
287
288
12.8M
        if (cid >= _fields.size() || _fields[cid].is_null()) {
289
16.1k
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
290
16.1k
            continue;
291
16.1k
        }
292
293
12.8M
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
294
12.8M
        _encode_field(storage_field, _fields[cid], is_mow, buf);
295
12.8M
    }
296
3.39M
}
297
298
// Explicit template instantiations
299
template void RowCursor::encode_key_with_padding<false>(std::string*, size_t, bool) const;
300
template void RowCursor::encode_key_with_padding<true>(std::string*, size_t, bool) const;
301
302
template <bool full_encode>
303
129k
void RowCursor::encode_key(std::string* buf, size_t num_keys) const {
304
387k
    for (uint32_t cid = 0; cid < num_keys; cid++) {
305
258k
        if (cid >= _fields.size() || _fields[cid].is_null()) {
306
6
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
307
6
            continue;
308
6
        }
309
258k
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
310
258k
        _encode_field(_schema->column(cid), _fields[cid], full_encode, buf);
311
258k
    }
312
129k
}
_ZNK5doris9RowCursor10encode_keyILb0EEEvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm
Line
Count
Source
303
33
void RowCursor::encode_key(std::string* buf, size_t num_keys) const {
304
82
    for (uint32_t cid = 0; cid < num_keys; cid++) {
305
49
        if (cid >= _fields.size() || _fields[cid].is_null()) {
306
6
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
307
6
            continue;
308
6
        }
309
43
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
310
43
        _encode_field(_schema->column(cid), _fields[cid], full_encode, buf);
311
43
    }
312
33
}
_ZNK5doris9RowCursor10encode_keyILb1EEEvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm
Line
Count
Source
303
129k
void RowCursor::encode_key(std::string* buf, size_t num_keys) const {
304
387k
    for (uint32_t cid = 0; cid < num_keys; cid++) {
305
258k
        if (cid >= _fields.size() || _fields[cid].is_null()) {
306
0
            buf->push_back(KeyConsts::KEY_NULL_FIRST_MARKER);
307
0
            continue;
308
0
        }
309
258k
        buf->push_back(KeyConsts::KEY_NORMAL_MARKER);
310
258k
        _encode_field(_schema->column(cid), _fields[cid], full_encode, buf);
311
258k
    }
312
129k
}
313
314
template void RowCursor::encode_key<false>(std::string*, size_t) const;
315
template void RowCursor::encode_key<true>(std::string*, size_t) const;
316
317
#include "common/compile_check_end.h"
318
} // namespace doris