Coverage Report

Created: 2026-10-28 22:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/format/parquet/parquet_column_convert.h
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
#pragma once
19
20
#include <cctz/time_zone.h>
21
#include <gen_cpp/parquet_types.h>
22
#include <libdivide.h>
23
24
#include <chrono>
25
#include <cmath>
26
#include <limits>
27
28
#include "common/cast_set.h"
29
#include "core/column/column_fixed_length_object.h"
30
#include "core/column/column_varbinary.h"
31
#include "core/column/column_vector.h"
32
#include "core/data_type/data_type_factory.hpp"
33
#include "core/data_type/primitive_type.h"
34
#include "core/extended_types.h"
35
#include "core/field.h"
36
#include "core/types.h"
37
#include "format/column_type_convert.h"
38
#include "format/format_common.h"
39
#include "format/parquet/decoder.h"
40
#include "format/parquet/parquet_common.h"
41
#include "format/parquet/schema_desc.h"
42
#include "util/timezone_utils.h"
43
44
namespace doris::parquet {
45
namespace detail {
46
47
struct EpochSecondsAndMicros {
48
    int64_t seconds;
49
    uint32_t microseconds;
50
};
51
52
inline EpochSecondsAndMicros split_epoch_time(int64_t timestamp, int64_t units_per_second,
53
59
                                              int64_t nanos_per_unit) {
54
59
    int64_t seconds = timestamp / units_per_second;
55
59
    int64_t subsecond = timestamp % units_per_second;
56
    // C++ division truncates toward zero. Normalize to floor division so the fractional part is
57
    // always non-negative for timestamps before the Unix epoch.
58
59
    if (subsecond < 0) {
59
10
        subsecond += units_per_second;
60
10
        --seconds;
61
10
    }
62
59
    return {.seconds = seconds,
63
59
            .microseconds = static_cast<uint32_t>(subsecond * nanos_per_unit / 1000)};
64
59
}
65
66
inline bool try_split_local_time(int64_t local_time, uint16_t* year, uint8_t* month, uint8_t* day,
67
73
                                 uint8_t* hour, uint8_t* minute, uint8_t* second) {
68
73
    static const libdivide::divider<int64_t> fast_div_86400(86400);
69
73
    static const libdivide::divider<int64_t> fast_div_3600(3600);
70
73
    static const libdivide::divider<int64_t> fast_div_60(60);
71
73
    static constexpr int64_t kMinSupportedDays = -365LL * 10000;
72
73
    static constexpr int64_t kMaxSupportedDays = 365LL * 10000;
73
74
73
    int64_t days = local_time / fast_div_86400;
75
73
    int64_t second_of_day = local_time - days * 86400;
76
73
    if (second_of_day < 0) {
77
11
        second_of_day += 86400;
78
11
        --days;
79
11
    }
80
73
    if (days < kMinSupportedDays || days > kMaxSupportedDays) {
81
0
        return false;
82
0
    }
83
84
73
    const auto ymd = std::chrono::year_month_day {std::chrono::sys_days {std::chrono::days {days}}};
85
73
    const int y = static_cast<int>(ymd.year());
86
73
    if (y < 0 || y > std::numeric_limits<uint16_t>::max()) {
87
0
        return false;
88
0
    }
89
90
73
    const int64_t h = second_of_day / fast_div_3600;
91
73
    const int64_t minute_second = second_of_day - h * 3600;
92
73
    const int64_t m = minute_second / fast_div_60;
93
73
    const int64_t s = minute_second - m * 60;
94
95
73
    *year = static_cast<uint16_t>(y);
96
73
    *month = static_cast<uint8_t>(static_cast<unsigned>(ymd.month()));
97
73
    *day = static_cast<uint8_t>(static_cast<unsigned>(ymd.day()));
98
73
    *hour = static_cast<uint8_t>(h);
99
73
    *minute = static_cast<uint8_t>(m);
100
73
    *second = static_cast<uint8_t>(s);
101
73
    return true;
102
73
}
103
104
template <typename DateType>
105
inline bool try_convert_timestamp_with_fixed_offset(DateType& value, int64_t epoch_seconds,
106
73
                                                    int32_t offset_seconds) {
107
73
    uint16_t year = 0;
108
73
    uint8_t month = 0;
109
73
    uint8_t day = 0;
110
73
    uint8_t hour = 0;
111
73
    uint8_t minute = 0;
112
73
    uint8_t second = 0;
113
73
    if (!try_split_local_time(epoch_seconds + offset_seconds, &year, &month, &day, &hour, &minute,
114
73
                              &second)) {
115
0
        return false;
116
0
    }
117
    // The caller sets sub-second precision immediately after this conversion.
118
73
    value.unchecked_set_time(year, month, day, hour, minute, second, 0);
119
73
    return true;
120
73
}
121
122
template <typename DateType>
123
inline bool try_convert_timestamp_with_lookup(DateType& value, int64_t epoch_seconds,
124
10
                                              const cctz::time_zone& ctz) {
125
10
    static const auto epoch = std::chrono::time_point_cast<cctz::sys_seconds>(
126
10
            std::chrono::system_clock::from_time_t(0));
127
10
    cctz::time_point<cctz::sys_seconds> t = epoch + cctz::seconds(epoch_seconds);
128
10
    const int32_t offset = ctz.lookup_offset(t).offset;
129
10
    return try_convert_timestamp_with_fixed_offset(value, epoch_seconds, offset);
130
10
}
131
132
} // namespace detail
133
134
struct ConvertParams {
135
    // schema.logicalType.TIMESTAMP.isAdjustedToUTC == false
136
    static const cctz::time_zone utc0;
137
    // schema.logicalType.TIMESTAMP.isAdjustedToUTC == true, we should set local time zone
138
    const cctz::time_zone* ctz = nullptr;
139
    bool is_fixed_offset = false;
140
    int32_t fixed_offset_seconds = 0;
141
    int64_t second_mask = 1;
142
    int64_t scale_to_nano_factor = 1;
143
    const FieldSchema* field_schema = nullptr;
144
145
    //For UInt8 -> Int16,UInt16 -> Int32,UInt32 -> Int64,UInt64 -> Int128.
146
    bool is_type_compatibility = false;
147
148
    /**
149
     * Some frameworks like paimon maybe writes non-standard parquet files. Timestamp field doesn't have
150
     * logicalType or converted_type to indicates its precision. We have to reset the time mask.
151
     */
152
16
    void reset_time_scale_if_missing(int scale) {
153
16
        const auto& schema = field_schema->parquet_schema;
154
16
        if (!schema.__isset.logicalType && !schema.__isset.converted_type) {
155
0
            int ts_scale = 9;
156
0
            if (scale <= 3) {
157
0
                ts_scale = 3;
158
0
            } else if (scale <= 6) {
159
0
                ts_scale = 6;
160
0
            }
161
0
            second_mask = common::exp10_i64(ts_scale);
162
0
            scale_to_nano_factor = common::exp10_i64(9 - ts_scale);
163
164
            // The missing parque metadata makes it impossible for us to know the time zone information,
165
            // so we default to UTC here.
166
0
            if (ctz == nullptr) {
167
0
                ctz = &utc0;
168
0
            }
169
0
        }
170
16
    }
171
172
398
    void init(const FieldSchema* field_schema_, const cctz::time_zone* ctz_) {
173
398
        field_schema = field_schema_;
174
398
        if (ctz_ != nullptr) {
175
372
            ctz = ctz_;
176
372
        }
177
398
        const auto& schema = field_schema->parquet_schema;
178
398
        if (schema.__isset.logicalType && schema.logicalType.__isset.TIMESTAMP) {
179
18
            const auto& timestamp_info = schema.logicalType.TIMESTAMP;
180
18
            if (!timestamp_info.isAdjustedToUTC) {
181
                // should set timezone to utc+0
182
                // Reference: https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#instant-semantics-timestamps-normalized-to-utc
183
                // If isAdjustedToUTC = false, the reader should display the same value no mater what local time zone is. For example:
184
                // When a timestamp is stored as `1970-01-03 12:00:00`,
185
                // if isAdjustedToUTC = true, UTC8 should read as `1970-01-03 20:00:00`, UTC6 should read as `1970-01-03 18:00:00`
186
                // if isAdjustedToUTC = false, UTC8 and UTC6 should read as `1970-01-03 12:00:00`, which is the same as `1970-01-03 12:00:00` in UTC0
187
13
                ctz = &utc0;
188
13
            }
189
18
            const auto& time_unit = timestamp_info.unit;
190
18
            if (time_unit.__isset.MILLIS) {
191
5
                second_mask = 1000;
192
5
                scale_to_nano_factor = 1000000;
193
13
            } else if (time_unit.__isset.MICROS) {
194
11
                second_mask = 1000000;
195
11
                scale_to_nano_factor = 1000;
196
11
            } else if (time_unit.__isset.NANOS) {
197
2
                second_mask = 1000000000;
198
2
                scale_to_nano_factor = 1;
199
2
            }
200
380
        } else if (schema.__isset.converted_type) {
201
77
            const auto& converted_type = schema.converted_type;
202
77
            if (converted_type == tparquet::ConvertedType::TIMESTAMP_MILLIS) {
203
0
                second_mask = 1000;
204
0
                scale_to_nano_factor = 1000000;
205
77
            } else if (converted_type == tparquet::ConvertedType::TIMESTAMP_MICROS) {
206
4
                second_mask = 1000000;
207
4
                scale_to_nano_factor = 1000;
208
4
            }
209
77
        }
210
211
398
        if (ctz != nullptr) {
212
383
            is_fixed_offset =
213
383
                    TimezoneUtils::try_get_fixed_offset_seconds(*ctz, &fixed_offset_seconds);
214
383
        }
215
398
        is_type_compatibility = field_schema_->is_type_compatibility;
216
398
    }
217
};
218
219
72
inline IColumn* get_mutable_inner_column(ColumnPtr& column) {
220
72
    column = IColumn::mutate(std::move(column));
221
72
    auto mutable_column = column->assert_mutable();
222
72
    if (is_column_nullable(*mutable_column)) {
223
54
        return &assert_cast<ColumnNullable*>(mutable_column.get())->get_nested_column();
224
54
    }
225
18
    return mutable_column.get();
226
72
}
227
228
148
inline size_t get_mutable_inner_column_size(const ColumnPtr& column) {
229
148
    if (is_column_nullable(*column)) {
230
139
        const auto* nullable = assert_cast<const ColumnNullable*>(column.get());
231
139
        return nullable->get_nested_column().size();
232
139
    }
233
9
    return column->size();
234
148
}
235
236
84
inline size_t get_null_map_size_or_inner_column_size(const ColumnPtr& column) {
237
84
    if (is_column_nullable(*column)) {
238
80
        const auto* nullable = assert_cast<const ColumnNullable*>(column.get());
239
80
        return nullable->get_null_map_column().size();
240
80
    }
241
4
    return column->size();
242
84
}
243
244
84
inline size_t get_appended_null_map_start(const ColumnPtr& column, size_t new_rows) {
245
84
    if (!is_column_nullable(*column)) {
246
8
        return 0;
247
8
    }
248
76
    const auto* nullable = assert_cast<const ColumnNullable*>(column.get());
249
76
    const size_t null_map_size = nullable->get_null_map_column().size();
250
76
    DCHECK_GE(null_map_size, new_rows);
251
76
    return null_map_size - new_rows;
252
84
}
253
254
inline void align_null_map(ColumnPtr& src_column, ColumnPtr& dst_column, size_t old_null_map_size,
255
85
                           size_t new_rows, size_t src_null_map_start = 0) {
256
85
    if (!is_column_nullable(*dst_column)) {
257
4
        return;
258
4
    }
259
260
81
    dst_column = IColumn::mutate(std::move(dst_column));
261
81
    auto* dst_nullable = assert_cast<ColumnNullable*>(dst_column->assert_mutable().get());
262
81
    auto& dst_null_map = dst_nullable->get_null_map_column();
263
81
    const size_t expected_rows = old_null_map_size + new_rows;
264
81
    if (dst_null_map.size() == expected_rows) {
265
19
        return;
266
19
    }
267
81
    DCHECK_EQ(dst_null_map.size(), old_null_map_size);
268
62
    if (is_column_nullable(*src_column)) {
269
58
        const auto* src_nullable = assert_cast<const ColumnNullable*>(src_column.get());
270
58
        DCHECK_GE(src_nullable->get_null_map_column().size(), src_null_map_start + new_rows);
271
58
        dst_null_map.insert_range_from(src_nullable->get_null_map_column(), src_null_map_start,
272
58
                                       new_rows);
273
58
    } else {
274
4
        dst_null_map.insert_many_vals(0, new_rows);
275
4
    }
276
62
}
277
278
struct FixedLengthPhysicalData {
279
    const uint8_t* data = nullptr;
280
    size_t byte_size = 0;
281
    size_t rows = 0;
282
};
283
284
inline FixedLengthPhysicalData get_fixed_length_physical_data(const IColumn& column,
285
17
                                                              size_t type_length) {
286
17
    if (const auto* fixed_length_column = check_and_get_column<ColumnFixedLengthObject>(column)) {
287
14
        DCHECK_EQ(fixed_length_column->item_size(), type_length);
288
14
        return {fixed_length_column->get_data().data(), fixed_length_column->byte_size(),
289
14
                fixed_length_column->size()};
290
14
    }
291
292
3
    const auto& uint8_column = assert_cast<const ColumnUInt8&>(column);
293
3
    DCHECK_EQ(uint8_column.size() % type_length, 0);
294
3
    return {uint8_column.get_data().data(), uint8_column.size(), uint8_column.size() / type_length};
295
17
}
296
297
/**
298
 * Convert parquet physical column to logical column
299
 * In parquet document(https://github.com/apache/parquet-format/blob/master/LogicalTypes.md),
300
 * Logical or converted type is the data type of column, physical type is the stored type of column chunk.
301
 * eg, decimal type can be stored as INT32, INT64, BYTE_ARRAY, FIXED_LENGTH_BYTE_ARRAY.
302
 * So there is a convert process from physical type to logical type.
303
 * In addition, Schema change will bring about a change in logical type.
304
 *
305
 * `PhysicalToLogicalConverter` strips away the conversion of logical type, and reuse `ColumnTypeConverter`
306
 * to resolve schema change, allowing parquet reader to only focus on the conversion of physical types.
307
 *
308
 * Therefore, tow layers converters are designed:
309
 * First, read parquet data with the physical type
310
 * Second, convert physical type to logical type
311
 * Third, convert logical type to the final type planned by FE(schema change)
312
 *
313
 * Ultimate performance optimization:
314
 * 1. If process of (First => Second) is consistent, eg. from BYTE_ARRAY to string, no additional copies and conversions will be introduced;
315
 * 2. If process of (Second => Third) is consistent, no additional copies and conversions will be introduced;
316
 * 3. Null maps are owned by each temporary nullable column, and only appended null slices are
317
 *    copied between conversion stages;
318
 * 4. Only create one physical column in physical conversion, and reused in each loop;
319
 * 5. Only create one logical column in logical conversion, and reused in each loop;
320
 * 6. FIXED_LENGTH_BYTE_ARRAY is read as ColumnFixedLengthObject instead of ColumnString, so
321
 *    the decoder can copy fixed-size values as a whole while keeping nullable row counts valid.
322
 */
323
class PhysicalToLogicalConverter {
324
protected:
325
    ColumnPtr _cached_src_physical_column = nullptr;
326
    DataTypePtr _cached_src_physical_type = nullptr;
327
    std::unique_ptr<converter::ColumnTypeConverter> _logical_converter = nullptr;
328
329
    std::string _error_msg;
330
331
    std::unique_ptr<ConvertParams> _convert_params;
332
333
public:
334
    static std::unique_ptr<PhysicalToLogicalConverter> get_converter(
335
            const FieldSchema* field_schema, DataTypePtr src_logical_type,
336
            const DataTypePtr& dst_logical_type, const cctz::time_zone* ctz,
337
            bool is_dict_filter = false, bool preserve_binary_uuid = false);
338
339
    static bool is_parquet_native_type(PrimitiveType type);
340
341
    static bool is_decimal_type(PrimitiveType type);
342
343
394
    PhysicalToLogicalConverter() = default;
344
394
    virtual ~PhysicalToLogicalConverter() = default;
345
346
11
    virtual Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) {
347
11
        return Status::OK();
348
11
    }
349
350
    Status convert(ColumnPtr& src_physical_col, DataTypePtr src_logical_type,
351
                   const DataTypePtr& dst_logical_type, ColumnPtr& dst_logical_col,
352
434
                   bool is_dict_filter) {
353
434
        if (is_dict_filter) {
354
1
            src_logical_type = DataTypeFactory::instance().create_data_type(
355
1
                    PrimitiveType::TYPE_INT, dst_logical_type->is_nullable());
356
1
        }
357
434
        if (is_consistent() && _logical_converter->is_consistent()) {
358
369
            dst_logical_col = std::move(src_physical_col);
359
369
            return Status::OK();
360
369
        }
361
65
        if (_logical_converter->is_consistent()) {
362
47
            const size_t old_rows = get_mutable_inner_column_size(dst_logical_col);
363
47
            const size_t old_null_map_size =
364
47
                    get_null_map_size_or_inner_column_size(dst_logical_col);
365
47
            RETURN_IF_ERROR(physical_convert(src_physical_col, dst_logical_col));
366
47
            const size_t new_rows = get_mutable_inner_column_size(dst_logical_col) - old_rows;
367
47
            align_null_map(src_physical_col, dst_logical_col, old_null_map_size, new_rows,
368
47
                           get_appended_null_map_start(src_physical_col, new_rows));
369
47
            return Status::OK();
370
47
        }
371
372
18
        ColumnPtr src_logical_column;
373
18
        if (is_consistent()) {
374
11
            src_logical_column = src_physical_col;
375
11
        } else {
376
7
            src_logical_column = _logical_converter->get_column(src_logical_type, dst_logical_col,
377
7
                                                                dst_logical_type);
378
7
        }
379
18
        const size_t src_old_rows = get_mutable_inner_column_size(src_logical_column);
380
18
        const size_t src_old_null_map_size =
381
18
                get_null_map_size_or_inner_column_size(src_logical_column);
382
18
        RETURN_IF_ERROR(physical_convert(src_physical_col, src_logical_column));
383
18
        const size_t src_new_rows =
384
18
                get_mutable_inner_column_size(src_logical_column) - src_old_rows;
385
18
        align_null_map(src_physical_col, src_logical_column, src_old_null_map_size, src_new_rows,
386
18
                       get_appended_null_map_start(src_physical_col, src_new_rows));
387
388
18
        dst_logical_col = IColumn::mutate(std::move(dst_logical_col));
389
18
        const size_t dst_old_null_map_size =
390
18
                get_null_map_size_or_inner_column_size(dst_logical_col);
391
18
        const size_t rows_to_convert = get_mutable_inner_column_size(src_logical_column);
392
        // Logical converters append all source rows and may mark failed casts as NULL (e.g.
393
        // "xx" -> BIGINT). Copy source nulls first so those writes have allocated entries and
394
        // are not overwritten after conversion. Keep any existing destination prefix intact.
395
18
        align_null_map(src_logical_column, dst_logical_col, dst_old_null_map_size, rows_to_convert,
396
18
                       get_appended_null_map_start(src_logical_column, rows_to_convert));
397
18
        auto converted_column = dst_logical_col->assert_mutable();
398
18
        RETURN_IF_ERROR(_logical_converter->convert(src_logical_column, converted_column));
399
17
        return Status::OK();
400
18
    }
401
402
    virtual ColumnPtr get_physical_column(tparquet::Type::type src_physical_type,
403
                                          DataTypePtr src_logical_type,
404
                                          ColumnPtr& dst_logical_column,
405
                                          const DataTypePtr& dst_logical_type, bool is_dict_filter);
406
407
418
    DataTypePtr& get_physical_type() { return _cached_src_physical_type; }
408
409
418
    bool read_directly_into_dst_logical_column() {
410
418
        return !_convert_params->is_type_compatibility && is_consistent() &&
411
418
               _logical_converter->is_consistent();
412
418
    }
413
414
154
    virtual bool is_consistent() { return false; }
415
416
680
    virtual bool support() { return true; }
417
418
0
    std::string get_error_msg() { return _error_msg; }
419
};
420
421
class ConsistentPhysicalConverter : public PhysicalToLogicalConverter {
422
1.23k
    bool is_consistent() override { return true; }
423
};
424
425
class UnsupportedConverter : public PhysicalToLogicalConverter {
426
public:
427
0
    UnsupportedConverter(std::string error_msg) { _error_msg = error_msg; }
428
429
    UnsupportedConverter(tparquet::Type::type src_physical_type,
430
2
                         const DataTypePtr& src_logical_type) {
431
2
        std::string src_physical_str = tparquet::to_string(src_physical_type);
432
2
        std::string src_logical_str = src_logical_type->get_name();
433
2
        _error_msg = src_physical_str + " => " + src_logical_str;
434
2
    }
435
436
4
    bool support() override { return false; }
437
438
0
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
439
0
        return Status::InternalError("Unsupported physical to logical type: {}", _error_msg);
440
0
    }
441
};
442
443
// for tinyint, smallint
444
template <PrimitiveType IntPrimitiveType>
445
class LittleIntPhysicalConverter : public PhysicalToLogicalConverter {
446
28
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
447
28
        using DstCppType = typename PrimitiveTypeTraits<IntPrimitiveType>::CppType;
448
28
        using DstColumnType = typename PrimitiveTypeTraits<IntPrimitiveType>::ColumnType;
449
28
        ColumnPtr from_col = remove_nullable(src_physical_col);
450
28
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
451
452
28
        size_t rows = from_col->size();
453
        // always comes from tparquet::Type::INT32
454
28
        auto& src_data = assert_cast<const ColumnInt32*>(from_col.get())->get_data();
455
28
        size_t start_idx = to_col->size();
456
28
        to_col->resize(start_idx + rows);
457
28
        auto& data = assert_cast<DstColumnType&>(*to_col).get_data();
458
108
        for (int i = 0; i < rows; ++i) {
459
80
            data[start_idx + i] = static_cast<DstCppType>(src_data[i]);
460
80
        }
461
462
28
        return Status::OK();
463
28
    }
_ZN5doris7parquet26LittleIntPhysicalConverterILNS_13PrimitiveTypeE3EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Line
Count
Source
446
17
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
447
17
        using DstCppType = typename PrimitiveTypeTraits<IntPrimitiveType>::CppType;
448
17
        using DstColumnType = typename PrimitiveTypeTraits<IntPrimitiveType>::ColumnType;
449
17
        ColumnPtr from_col = remove_nullable(src_physical_col);
450
17
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
451
452
17
        size_t rows = from_col->size();
453
        // always comes from tparquet::Type::INT32
454
17
        auto& src_data = assert_cast<const ColumnInt32*>(from_col.get())->get_data();
455
17
        size_t start_idx = to_col->size();
456
17
        to_col->resize(start_idx + rows);
457
17
        auto& data = assert_cast<DstColumnType&>(*to_col).get_data();
458
59
        for (int i = 0; i < rows; ++i) {
459
42
            data[start_idx + i] = static_cast<DstCppType>(src_data[i]);
460
42
        }
461
462
17
        return Status::OK();
463
17
    }
_ZN5doris7parquet26LittleIntPhysicalConverterILNS_13PrimitiveTypeE4EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Line
Count
Source
446
11
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
447
11
        using DstCppType = typename PrimitiveTypeTraits<IntPrimitiveType>::CppType;
448
11
        using DstColumnType = typename PrimitiveTypeTraits<IntPrimitiveType>::ColumnType;
449
11
        ColumnPtr from_col = remove_nullable(src_physical_col);
450
11
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
451
452
11
        size_t rows = from_col->size();
453
        // always comes from tparquet::Type::INT32
454
11
        auto& src_data = assert_cast<const ColumnInt32*>(from_col.get())->get_data();
455
11
        size_t start_idx = to_col->size();
456
11
        to_col->resize(start_idx + rows);
457
11
        auto& data = assert_cast<DstColumnType&>(*to_col).get_data();
458
49
        for (int i = 0; i < rows; ++i) {
459
38
            data[start_idx + i] = static_cast<DstCppType>(src_data[i]);
460
38
        }
461
462
11
        return Status::OK();
463
11
    }
464
};
465
466
template <PrimitiveType type>
467
struct UnsignedTypeTraits;
468
469
template <>
470
struct UnsignedTypeTraits<TYPE_SMALLINT> {
471
    using UnsignedCppType = UInt8;
472
    //https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#unsigned-integers
473
    //INT(8, false), INT(16, false), and INT(32, false) must annotate an int32 primitive type and INT(64, false)
474
    //must annotate an int64 primitive type.
475
    using StorageCppType = Int32;
476
    using StorageColumnType = ColumnInt32;
477
};
478
479
template <>
480
struct UnsignedTypeTraits<TYPE_INT> {
481
    using UnsignedCppType = UInt16;
482
    using StorageCppType = Int32;
483
    using StorageColumnType = ColumnInt32;
484
};
485
486
template <>
487
struct UnsignedTypeTraits<TYPE_BIGINT> {
488
    using UnsignedCppType = UInt32;
489
    using StorageCppType = Int32;
490
    using StorageColumnType = ColumnInt32;
491
};
492
493
template <>
494
struct UnsignedTypeTraits<TYPE_LARGEINT> {
495
    using UnsignedCppType = UInt64;
496
    using StorageCppType = Int64;
497
    using StorageColumnType = ColumnInt64;
498
};
499
500
template <PrimitiveType IntPrimitiveType>
501
class UnsignedIntegerConverter : public PhysicalToLogicalConverter {
502
0
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
503
0
        using UnsignedCppType = typename UnsignedTypeTraits<IntPrimitiveType>::UnsignedCppType;
504
0
        using StorageCppType = typename UnsignedTypeTraits<IntPrimitiveType>::StorageCppType;
505
0
        using StorageColumnType = typename UnsignedTypeTraits<IntPrimitiveType>::StorageColumnType;
506
0
        using DstColumnType = typename PrimitiveTypeTraits<IntPrimitiveType>::ColumnType;
507
508
0
        ColumnPtr from_col = remove_nullable(src_physical_col);
509
0
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
510
0
        auto& src_data = assert_cast<const StorageColumnType*>(from_col.get())->get_data();
511
512
0
        size_t rows = src_data.size();
513
0
        size_t start_idx = to_col->size();
514
0
        to_col->resize(start_idx + rows);
515
0
        auto& data = assert_cast<DstColumnType&>(*to_col).get_data();
516
517
0
        for (int i = 0; i < rows; i++) {
518
0
            StorageCppType src_value = src_data[i];
519
0
            auto unsigned_value = static_cast<UnsignedCppType>(src_value);
520
0
            data[start_idx + i] = unsigned_value;
521
0
        }
522
523
0
        return Status::OK();
524
0
    }
Unexecuted instantiation: _ZN5doris7parquet24UnsignedIntegerConverterILNS_13PrimitiveTypeE4EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet24UnsignedIntegerConverterILNS_13PrimitiveTypeE5EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet24UnsignedIntegerConverterILNS_13PrimitiveTypeE6EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet24UnsignedIntegerConverterILNS_13PrimitiveTypeE7EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
525
};
526
527
class FixedSizeBinaryConverter : public PhysicalToLogicalConverter {
528
private:
529
    int _type_length;
530
531
public:
532
5
    FixedSizeBinaryConverter(int type_length) : _type_length(type_length) {}
533
534
8
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
535
8
        ColumnPtr from_col = remove_nullable(src_physical_col);
536
8
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
537
538
8
        const auto src_data = get_fixed_length_physical_data(*from_col, _type_length);
539
8
        size_t length = src_data.byte_size;
540
8
        size_t num_values = src_data.rows;
541
8
        auto& string_col = static_cast<ColumnString&>(*to_col);
542
8
        auto& offsets = string_col.get_offsets();
543
8
        auto& chars = string_col.get_chars();
544
545
8
        size_t origin_size = chars.size();
546
8
        chars.resize(origin_size + length);
547
8
        memcpy(chars.data() + origin_size, src_data.data, length);
548
549
8
        origin_size = offsets.size();
550
8
        offsets.resize(origin_size + num_values);
551
8
        auto end_offset = offsets[origin_size - 1];
552
35
        for (int i = 0; i < num_values; ++i) {
553
27
            end_offset += _type_length;
554
27
            offsets[origin_size + i] = end_offset;
555
27
        }
556
557
8
        return Status::OK();
558
8
    }
559
};
560
561
class Float16PhysicalConverter : public PhysicalToLogicalConverter {
562
private:
563
    int _type_length;
564
565
public:
566
0
    Float16PhysicalConverter(int type_length) : _type_length(type_length) {
567
0
        DCHECK_EQ(_type_length, 2);
568
0
    }
569
570
0
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
571
0
        ColumnPtr from_col = remove_nullable(src_physical_col);
572
0
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
573
574
0
        const auto src_data = get_fixed_length_physical_data(*from_col, _type_length);
575
0
        size_t num_values = src_data.rows;
576
0
        auto* to_float_column = assert_cast<ColumnFloat32*>(to_col);
577
0
        size_t start_idx = to_float_column->size();
578
0
        to_float_column->resize(start_idx + num_values);
579
0
        auto& to_float_column_data = to_float_column->get_data();
580
0
        const auto* ptr = src_data.data;
581
0
        for (int i = 0; i < num_values; ++i) {
582
0
            size_t offset = i * _type_length;
583
0
            const auto* data_ptr = ptr + offset;
584
0
            uint16_t raw;
585
0
            memcpy(&raw, data_ptr, sizeof(uint16_t));
586
0
            float value = half_to_float(raw);
587
0
            to_float_column_data[start_idx + i] = value;
588
0
        }
589
590
0
        return Status::OK();
591
0
    }
592
593
0
    float half_to_float(uint16_t h) {
594
        // uint16_t h: half precision floating point
595
        // bit 15:       sign(1 bit)
596
        // bits 14..10 : exponent(5 bits)
597
        // bits 9..0   : mantissa(10 bits)
598
599
        // sign bit placed to float32 bit31
600
0
        uint32_t sign = (h & 0x8000U) << 16; // 0x8000 << 16 = 0x8000_0000
601
        // exponent:(5 bits)
602
0
        uint32_t exp = (h & 0x7C00U) >> 10; // 0x7C00 = 0111 1100 0000 (half exponent mask)
603
        // mantissa(10 bits)
604
0
        uint32_t mant = (h & 0x03FFU); // 10-bit fraction
605
606
        // cases:Zero/Subnormal, Normal, Inf/NaN
607
0
        if (exp == 0) {
608
            // exp==0: Zero or Subnormal ----------
609
0
            if (mant == 0) {
610
                // ±0.0
611
                // sign = either 0x00000000 or 0x80000000
612
0
                return std::bit_cast<float>(sign);
613
0
            } else {
614
                // ---------- Subnormal ----------
615
                // half subnormal:
616
                //    value = (-1)^sign * (mant / 2^10) * 2^(1 - bias)
617
                // half bias = 15 → exponent = 1 - 15 = -14
618
0
                float f = (static_cast<float>(mant) / 1024.0F) * std::pow(2.0F, -14.0F);
619
0
                return sign ? -f : f;
620
0
            }
621
0
        } else if (exp == 0x1F) {
622
            // exp==31: Inf or NaN ----------
623
            // float32:
624
            //    exponent = 255 (0xFF)
625
            //    mantissa = mant << 13
626
0
            uint32_t f = sign | 0x7F800000U | (mant << 13);
627
0
            return std::bit_cast<float>(f);
628
0
        } else {
629
            // Normalized ----------
630
            // float32 exponent:
631
            //   exp32 = exp16 - bias16 + bias32
632
            //   bias16 = 15
633
            //   bias32 = 127
634
            //
635
            // so: exp32 = exp + (127 - 15)
636
0
            uint32_t f = sign | ((exp + (127 - 15)) << 23) // place to float32 exponent
637
0
                         | (mant << 13);                   // mantissa align to 23 bits
638
0
            return std::bit_cast<float>(f);
639
0
        }
640
0
    }
641
};
642
643
class UUIDVarBinaryConverter : public PhysicalToLogicalConverter {
644
public:
645
0
    UUIDVarBinaryConverter(int type_length) : _type_length(type_length) {}
646
647
0
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
648
0
        DCHECK(!is_column_const(*src_physical_col)) << src_physical_col->dump_structure();
649
0
        DCHECK(!is_column_const(*src_logical_column)) << src_logical_column->dump_structure();
650
0
        const ColumnPtr from_col = remove_nullable(src_physical_col);
651
0
        const auto src_data = get_fixed_length_physical_data(*from_col, _type_length);
652
653
0
        IColumn* to_col = get_mutable_inner_column(src_logical_column);
654
0
        auto* to_varbinary_column = assert_cast<ColumnVarbinary*>(to_col);
655
0
        size_t num_values = src_data.rows;
656
0
        const auto* ptr = src_data.data;
657
658
0
        for (int i = 0; i < num_values; ++i) {
659
0
            auto offset = i * _type_length;
660
0
            const char* data_ptr = reinterpret_cast<const char*>(ptr + offset);
661
0
            to_varbinary_column->insert_data(data_ptr, _type_length);
662
0
        }
663
0
        return Status::OK();
664
0
    }
665
666
private:
667
    int _type_length;
668
};
669
670
template <PrimitiveType DecimalPType>
671
class FixedSizeToDecimal : public PhysicalToLogicalConverter {
672
public:
673
    using DecimalType = typename PrimitiveTypeTraits<DecimalPType>::CppType;
674
2
    FixedSizeToDecimal(int32_t type_length) : _type_length(type_length) {}
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EEC2Ei
_ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EEC2Ei
Line
Count
Source
674
2
    FixedSizeToDecimal(int32_t type_length) : _type_length(type_length) {}
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EEC2Ei
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EEC2Ei
675
676
2
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
677
2
        ColumnPtr src_col = remove_nullable(src_physical_col);
678
2
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
679
680
2
#define M(FixedTypeLength, ValueCopyType) \
681
2
    case FixedTypeLength:                 \
682
2
        return _convert_internal<FixedTypeLength, ValueCopyType>(src_col, dst_col);
683
684
2
#define APPLY_FOR_DECIMALS() \
685
2
    M(1, int64_t)            \
686
0
    M(2, int64_t)            \
687
0
    M(3, int64_t)            \
688
0
    M(4, int64_t)            \
689
1
    M(5, int64_t)            \
690
1
    M(6, int64_t)            \
691
0
    M(7, int64_t)            \
692
1
    M(8, int64_t)            \
693
1
    M(9, int128_t)           \
694
0
    M(10, int128_t)          \
695
0
    M(11, int128_t)          \
696
0
    M(12, int128_t)          \
697
0
    M(13, int128_t)          \
698
0
    M(14, int128_t)          \
699
0
    M(15, int128_t)          \
700
0
    M(16, int128_t)          \
701
0
    M(17, wide::Int256)      \
702
0
    M(18, wide::Int256)      \
703
0
    M(19, wide::Int256)      \
704
0
    M(20, wide::Int256)      \
705
0
    M(21, wide::Int256)      \
706
0
    M(22, wide::Int256)      \
707
0
    M(23, wide::Int256)      \
708
0
    M(24, wide::Int256)      \
709
0
    M(25, wide::Int256)      \
710
0
    M(26, wide::Int256)      \
711
0
    M(27, wide::Int256)      \
712
0
    M(28, wide::Int256)      \
713
0
    M(29, wide::Int256)      \
714
0
    M(30, wide::Int256)      \
715
0
    M(31, wide::Int256)      \
716
0
    M(32, wide::Int256)
717
718
2
        switch (_type_length) {
719
0
            APPLY_FOR_DECIMALS()
720
0
        default:
721
0
            throw Exception(Status::FatalError("__builtin_unreachable"));
722
2
        }
723
0
        return Status::OK();
724
2
#undef APPLY_FOR_DECIMALS
725
2
#undef M
726
2
    }
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
_ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Line
Count
Source
676
2
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
677
2
        ColumnPtr src_col = remove_nullable(src_physical_col);
678
2
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
679
680
2
#define M(FixedTypeLength, ValueCopyType) \
681
2
    case FixedTypeLength:                 \
682
2
        return _convert_internal<FixedTypeLength, ValueCopyType>(src_col, dst_col);
683
684
2
#define APPLY_FOR_DECIMALS() \
685
2
    M(1, int64_t)            \
686
2
    M(2, int64_t)            \
687
2
    M(3, int64_t)            \
688
2
    M(4, int64_t)            \
689
2
    M(5, int64_t)            \
690
2
    M(6, int64_t)            \
691
2
    M(7, int64_t)            \
692
2
    M(8, int64_t)            \
693
2
    M(9, int128_t)           \
694
2
    M(10, int128_t)          \
695
2
    M(11, int128_t)          \
696
2
    M(12, int128_t)          \
697
2
    M(13, int128_t)          \
698
2
    M(14, int128_t)          \
699
2
    M(15, int128_t)          \
700
2
    M(16, int128_t)          \
701
2
    M(17, wide::Int256)      \
702
2
    M(18, wide::Int256)      \
703
2
    M(19, wide::Int256)      \
704
2
    M(20, wide::Int256)      \
705
2
    M(21, wide::Int256)      \
706
2
    M(22, wide::Int256)      \
707
2
    M(23, wide::Int256)      \
708
2
    M(24, wide::Int256)      \
709
2
    M(25, wide::Int256)      \
710
2
    M(26, wide::Int256)      \
711
2
    M(27, wide::Int256)      \
712
2
    M(28, wide::Int256)      \
713
2
    M(29, wide::Int256)      \
714
2
    M(30, wide::Int256)      \
715
2
    M(31, wide::Int256)      \
716
2
    M(32, wide::Int256)
717
718
2
        switch (_type_length) {
719
0
            APPLY_FOR_DECIMALS()
720
0
        default:
721
0
            throw Exception(Status::FatalError("__builtin_unreachable"));
722
2
        }
723
0
        return Status::OK();
724
2
#undef APPLY_FOR_DECIMALS
725
2
#undef M
726
2
    }
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
727
728
    template <int fixed_type_length, typename ValueCopyType>
729
2
    Status _convert_internal(ColumnPtr& src_col, IColumn* dst_col) {
730
2
        const auto src_data = get_fixed_length_physical_data(*src_col, fixed_type_length);
731
2
        size_t rows = src_data.rows;
732
2
        const auto* buf = src_data.data;
733
2
        size_t start_idx = dst_col->size();
734
2
        dst_col->resize(start_idx + rows);
735
736
2
        auto& data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data();
737
2
        size_t offset = 0;
738
6
        for (int i = 0; i < rows; i++) {
739
            // When Decimal in parquet is stored in byte arrays, binary and fixed,
740
            // the unscaled number must be encoded as two's complement using big-endian byte order.
741
4
            ValueCopyType value = 0;
742
4
            memcpy(reinterpret_cast<char*>(&value), buf + offset, sizeof(value));
743
4
            offset += fixed_type_length;
744
4
            value = to_endian<std::endian::big>(value);
745
4
            value = value >> ((sizeof(value) - fixed_type_length) * 8);
746
4
            auto& v = reinterpret_cast<DecimalType&>(data[start_idx + i]);
747
4
            v = (DecimalType)value;
748
4
        }
749
750
2
        return Status::OK();
751
2
    }
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi1ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi2ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi3ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi4ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi5ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi6ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi7ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi8ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi9EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi10EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi11EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi12EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi13EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi14EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi15EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi16EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi17EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi18EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi19EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi20EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi21EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi22EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi23EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi24EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi25EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi26EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi27EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi28EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi29EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi30EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi31EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE28EE17_convert_internalILi32EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi1ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi2ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi3ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi4ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
_ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi5ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Line
Count
Source
729
1
    Status _convert_internal(ColumnPtr& src_col, IColumn* dst_col) {
730
1
        const auto src_data = get_fixed_length_physical_data(*src_col, fixed_type_length);
731
1
        size_t rows = src_data.rows;
732
1
        const auto* buf = src_data.data;
733
1
        size_t start_idx = dst_col->size();
734
1
        dst_col->resize(start_idx + rows);
735
736
1
        auto& data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data();
737
1
        size_t offset = 0;
738
3
        for (int i = 0; i < rows; i++) {
739
            // When Decimal in parquet is stored in byte arrays, binary and fixed,
740
            // the unscaled number must be encoded as two's complement using big-endian byte order.
741
2
            ValueCopyType value = 0;
742
2
            memcpy(reinterpret_cast<char*>(&value), buf + offset, sizeof(value));
743
2
            offset += fixed_type_length;
744
2
            value = to_endian<std::endian::big>(value);
745
2
            value = value >> ((sizeof(value) - fixed_type_length) * 8);
746
2
            auto& v = reinterpret_cast<DecimalType&>(data[start_idx + i]);
747
2
            v = (DecimalType)value;
748
2
        }
749
750
1
        return Status::OK();
751
1
    }
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi6ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi7ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
_ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi8ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Line
Count
Source
729
1
    Status _convert_internal(ColumnPtr& src_col, IColumn* dst_col) {
730
1
        const auto src_data = get_fixed_length_physical_data(*src_col, fixed_type_length);
731
1
        size_t rows = src_data.rows;
732
1
        const auto* buf = src_data.data;
733
1
        size_t start_idx = dst_col->size();
734
1
        dst_col->resize(start_idx + rows);
735
736
1
        auto& data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data();
737
1
        size_t offset = 0;
738
3
        for (int i = 0; i < rows; i++) {
739
            // When Decimal in parquet is stored in byte arrays, binary and fixed,
740
            // the unscaled number must be encoded as two's complement using big-endian byte order.
741
2
            ValueCopyType value = 0;
742
2
            memcpy(reinterpret_cast<char*>(&value), buf + offset, sizeof(value));
743
2
            offset += fixed_type_length;
744
2
            value = to_endian<std::endian::big>(value);
745
2
            value = value >> ((sizeof(value) - fixed_type_length) * 8);
746
2
            auto& v = reinterpret_cast<DecimalType&>(data[start_idx + i]);
747
2
            v = (DecimalType)value;
748
2
        }
749
750
1
        return Status::OK();
751
1
    }
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi9EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi10EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi11EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi12EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi13EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi14EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi15EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi16EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi17EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi18EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi19EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi20EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi21EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi22EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi23EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi24EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi25EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi26EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi27EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi28EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi29EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi30EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi31EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE29EE17_convert_internalILi32EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi1ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi2ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi3ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi4ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi5ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi6ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi7ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi8ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi9EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi10EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi11EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi12EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi13EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi14EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi15EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi16EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi17EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi18EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi19EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi20EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi21EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi22EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi23EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi24EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi25EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi26EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi27EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi28EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi29EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi30EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi31EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE30EE17_convert_internalILi32EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi1ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi2ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi3ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi4ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi5ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi6ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi7ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi8ElEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi9EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi10EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi11EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi12EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi13EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi14EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi15EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi16EnEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrIS7_EEPS7_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi17EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi18EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi19EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi20EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi21EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi22EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi23EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi24EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi25EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi26EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi27EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi28EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi29EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi30EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi31EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
Unexecuted instantiation: _ZN5doris7parquet18FixedSizeToDecimalILNS_13PrimitiveTypeE35EE17_convert_internalILi32EN4wide7integerILm256EiEEEENS_6StatusERNS_3COWINS_7IColumnEE13immutable_ptrISA_EEPSA_
752
753
private:
754
    int32_t _type_length;
755
};
756
757
template <PrimitiveType DecimalPType>
758
class StringToDecimal : public PhysicalToLogicalConverter {
759
    using DecimalType = typename PrimitiveTypeTraits<DecimalPType>::CppType;
760
0
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
761
0
        using ValueCopyType = DecimalType::NativeType;
762
0
        ColumnPtr src_col = remove_nullable(src_physical_col);
763
0
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
764
765
0
        size_t rows = src_col->size();
766
0
        auto buf = static_cast<const ColumnString*>(src_col.get())->get_chars().data();
767
0
        auto& offset = static_cast<const ColumnString*>(src_col.get())->get_offsets();
768
0
        size_t start_idx = dst_col->size();
769
0
        dst_col->resize(start_idx + rows);
770
771
0
        auto& data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data();
772
0
        for (int i = 0; i < rows; i++) {
773
0
            size_t len = offset[i] - offset[i - 1];
774
            // When Decimal in parquet is stored in byte arrays, binary and fixed,
775
            // the unscaled number must be encoded as two's complement using big-endian byte order.
776
0
            ValueCopyType value = 0;
777
0
            if (len > 0) {
778
0
                memcpy(reinterpret_cast<char*>(&value), buf + offset[i - 1], len);
779
0
                value = to_endian<std::endian::big>(value);
780
0
                value = value >> ((sizeof(value) - len) * 8);
781
0
            }
782
0
            auto& v = reinterpret_cast<DecimalType&>(data[start_idx + i]);
783
0
            v = (DecimalType)value;
784
0
        }
785
786
0
        return Status::OK();
787
0
    }
Unexecuted instantiation: _ZN5doris7parquet15StringToDecimalILNS_13PrimitiveTypeE28EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15StringToDecimalILNS_13PrimitiveTypeE29EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15StringToDecimalILNS_13PrimitiveTypeE30EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15StringToDecimalILNS_13PrimitiveTypeE35EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
788
};
789
790
template <PrimitiveType NumberType, PrimitiveType DecimalPType>
791
class NumberToDecimal : public PhysicalToLogicalConverter {
792
    using DecimalType = typename PrimitiveTypeTraits<DecimalPType>::CppType;
793
2
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
794
2
        using ValueCopyType = typename DecimalType::NativeType;
795
2
        ColumnPtr src_col = remove_nullable(src_physical_col);
796
2
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
797
798
2
        size_t rows = src_col->size();
799
2
        auto* src_data =
800
2
                static_cast<const ColumnVector<NumberType>*>(src_col.get())->get_data().data();
801
2
        size_t start_idx = dst_col->size();
802
2
        dst_col->resize(start_idx + rows);
803
804
2
        auto* data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data().data();
805
806
24
        for (int i = 0; i < rows; i++) {
807
22
            ValueCopyType value;
808
22
            if constexpr (std::is_same_v<DecimalType, Decimal256>) {
809
0
                value = src_data[i];
810
22
            } else {
811
22
                value = cast_set<ValueCopyType, typename PrimitiveTypeTraits<NumberType>::CppType,
812
22
                                 false>(src_data[i]);
813
22
            }
814
815
22
            data[start_idx + i] = (DecimalType)value;
816
22
        }
817
2
        return Status::OK();
818
2
    }
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE5ELS2_28EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE6ELS2_28EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE5ELS2_29EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
_ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE6ELS2_29EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Line
Count
Source
793
2
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
794
2
        using ValueCopyType = typename DecimalType::NativeType;
795
2
        ColumnPtr src_col = remove_nullable(src_physical_col);
796
2
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
797
798
2
        size_t rows = src_col->size();
799
2
        auto* src_data =
800
2
                static_cast<const ColumnVector<NumberType>*>(src_col.get())->get_data().data();
801
2
        size_t start_idx = dst_col->size();
802
2
        dst_col->resize(start_idx + rows);
803
804
2
        auto* data = static_cast<ColumnDecimal<DecimalPType>*>(dst_col)->get_data().data();
805
806
24
        for (int i = 0; i < rows; i++) {
807
22
            ValueCopyType value;
808
            if constexpr (std::is_same_v<DecimalType, Decimal256>) {
809
                value = src_data[i];
810
22
            } else {
811
22
                value = cast_set<ValueCopyType, typename PrimitiveTypeTraits<NumberType>::CppType,
812
22
                                 false>(src_data[i]);
813
22
            }
814
815
22
            data[start_idx + i] = (DecimalType)value;
816
22
        }
817
2
        return Status::OK();
818
2
    }
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE5ELS2_30EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE6ELS2_30EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE5ELS2_35EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
Unexecuted instantiation: _ZN5doris7parquet15NumberToDecimalILNS_13PrimitiveTypeE6ELS2_35EE16physical_convertERNS_3COWINS_7IColumnEE13immutable_ptrIS5_EES9_
819
};
820
821
class Int32ToDate : public PhysicalToLogicalConverter {
822
7
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
823
7
        ColumnPtr src_col = remove_nullable(src_physical_col);
824
7
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
825
826
7
        size_t rows = src_col->size();
827
7
        size_t start_idx = dst_col->size();
828
7
        dst_col->reserve(start_idx + rows);
829
830
7
        auto& src_data = static_cast<const ColumnInt32*>(src_col.get())->get_data();
831
7
        auto& data = static_cast<ColumnDateV2*>(dst_col)->get_data();
832
7
        date_day_offset_dict& date_dict = date_day_offset_dict::get();
833
834
59
        for (int i = 0; i < rows; i++) {
835
52
            data.push_back_without_reserve(date_dict[src_data[i]].to_date_int_val());
836
52
        }
837
838
7
        return Status::OK();
839
7
    }
840
};
841
842
struct Int64ToTimestamp : public PhysicalToLogicalConverter {
843
15
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
844
15
        ColumnPtr src_col = remove_nullable(src_physical_col);
845
15
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
846
847
15
        size_t rows = src_col->size();
848
15
        size_t start_idx = dst_col->size();
849
15
        dst_col->resize(start_idx + rows);
850
851
15
        auto src_data = static_cast<const ColumnInt64*>(src_col.get())->get_data().data();
852
15
        auto& data = static_cast<ColumnDateTimeV2*>(dst_col)->get_data();
853
854
71
        for (int i = 0; i < rows; i++) {
855
56
            int64_t x = src_data[i];
856
56
            auto& num = data[start_idx + i];
857
56
            auto& value = reinterpret_cast<DateV2Value<DateTimeV2ValueType>&>(num);
858
56
            const auto epoch_time = detail::split_epoch_time(x, _convert_params->second_mask,
859
56
                                                             _convert_params->scale_to_nano_factor);
860
56
            if (_convert_params->is_fixed_offset) {
861
56
                if (!detail::try_convert_timestamp_with_fixed_offset(
862
56
                            value, epoch_time.seconds, _convert_params->fixed_offset_seconds)) {
863
0
                    value.from_unixtime(epoch_time.seconds, *_convert_params->ctz);
864
0
                }
865
56
            } else if (!detail::try_convert_timestamp_with_lookup(value, epoch_time.seconds,
866
0
                                                                  *_convert_params->ctz)) {
867
0
                value.from_unixtime(epoch_time.seconds, *_convert_params->ctz);
868
0
            }
869
56
            value.set_microsecond(epoch_time.microseconds);
870
56
        }
871
15
        return Status::OK();
872
15
    }
873
};
874
875
struct Int64ToTimestampTz : public PhysicalToLogicalConverter {
876
1
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
877
1
        ColumnPtr src_col = remove_nullable(src_physical_col);
878
1
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
879
880
1
        size_t rows = src_col->size();
881
1
        size_t start_idx = dst_col->size();
882
1
        dst_col->resize(start_idx + rows);
883
884
1
        const auto& src_data = assert_cast<const ColumnInt64*>(src_col.get())->get_data();
885
1
        auto& dest_data = assert_cast<ColumnTimeStampTz*>(dst_col)->get_data();
886
1
        static const cctz::time_zone UTC = cctz::utc_time_zone();
887
888
2
        for (int i = 0; i < rows; i++) {
889
1
            int64_t x = src_data[i];
890
1
            auto& tz = dest_data[start_idx + i];
891
1
            const auto epoch_time = detail::split_epoch_time(x, _convert_params->second_mask,
892
1
                                                             _convert_params->scale_to_nano_factor);
893
1
            tz.from_unixtime(epoch_time.seconds, UTC);
894
1
            tz.set_microsecond(epoch_time.microseconds);
895
1
        }
896
1
        return Status::OK();
897
1
    }
898
};
899
900
struct Int96toTimestamp : public PhysicalToLogicalConverter {
901
1
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
902
1
        ColumnPtr src_col = remove_nullable(src_physical_col);
903
1
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
904
905
1
        size_t rows = src_col->size() / sizeof(ParquetInt96);
906
1
        auto& src_data = static_cast<const ColumnInt8*>(src_col.get())->get_data();
907
1
        auto ParquetInt96_data = (ParquetInt96*)src_data.data();
908
1
        size_t start_idx = dst_col->size();
909
1
        dst_col->resize(start_idx + rows);
910
1
        auto& data = static_cast<ColumnDateTimeV2*>(dst_col)->get_data();
911
912
2
        for (int i = 0; i < rows; i++) {
913
1
            ParquetInt96 src_cell_data = ParquetInt96_data[i];
914
1
            auto& dst_value =
915
1
                    reinterpret_cast<DateV2Value<DateTimeV2ValueType>&>(data[start_idx + i]);
916
917
1
            const auto epoch_time =
918
1
                    detail::split_epoch_time(src_cell_data.to_timestamp_micros(), 1000000, 1000);
919
1
            if (_convert_params->is_fixed_offset) {
920
1
                if (!detail::try_convert_timestamp_with_fixed_offset(
921
1
                            dst_value, epoch_time.seconds, _convert_params->fixed_offset_seconds)) {
922
0
                    dst_value.from_unixtime(epoch_time.seconds, *_convert_params->ctz);
923
0
                }
924
1
            } else if (!detail::try_convert_timestamp_with_lookup(dst_value, epoch_time.seconds,
925
0
                                                                  *_convert_params->ctz)) {
926
0
                dst_value.from_unixtime(epoch_time.seconds, *_convert_params->ctz);
927
0
            }
928
1
            dst_value.set_microsecond(epoch_time.microseconds);
929
1
        }
930
1
        return Status::OK();
931
1
    }
932
};
933
934
struct Int96toTimestampTz : public PhysicalToLogicalConverter {
935
1
    Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) override {
936
1
        ColumnPtr src_col = remove_nullable(src_physical_col);
937
1
        IColumn* dst_col = get_mutable_inner_column(src_logical_column);
938
939
1
        size_t rows = src_col->size() / sizeof(ParquetInt96);
940
1
        const auto& src_data = assert_cast<const ColumnInt8*>(src_col.get())->get_data();
941
1
        auto* ParquetInt96_data = (ParquetInt96*)src_data.data();
942
1
        size_t start_idx = dst_col->size();
943
1
        dst_col->resize(start_idx + rows);
944
1
        auto& data = assert_cast<ColumnTimeStampTz*>(dst_col)->get_data();
945
1
        static const cctz::time_zone UTC = cctz::utc_time_zone();
946
947
2
        for (int i = 0; i < rows; i++) {
948
1
            ParquetInt96 src_cell_data = ParquetInt96_data[i];
949
1
            auto& tz = data[start_idx + i];
950
1
            const auto epoch_time =
951
1
                    detail::split_epoch_time(src_cell_data.to_timestamp_micros(), 1000000, 1000);
952
1
            tz.from_unixtime(epoch_time.seconds, UTC);
953
1
            tz.set_microsecond(epoch_time.microseconds);
954
1
        }
955
1
        return Status::OK();
956
1
    }
957
};
958
959
} // namespace doris::parquet