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 | 420 | void init(const FieldSchema* field_schema_, const cctz::time_zone* ctz_) { |
173 | 420 | field_schema = field_schema_; |
174 | 420 | if (ctz_ != nullptr) { |
175 | 386 | ctz = ctz_; |
176 | 386 | } |
177 | 420 | const auto& schema = field_schema->parquet_schema; |
178 | 420 | 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 | 402 | } 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 | 420 | if (ctz != nullptr) { |
212 | 397 | is_fixed_offset = |
213 | 397 | TimezoneUtils::try_get_fixed_offset_seconds(*ctz, &fixed_offset_seconds); |
214 | 397 | } |
215 | 420 | is_type_compatibility = field_schema_->is_type_compatibility; |
216 | 420 | } |
217 | | }; |
218 | | |
219 | 74 | inline IColumn* get_mutable_inner_column(ColumnPtr& column) { |
220 | 74 | column = IColumn::mutate(std::move(column)); |
221 | 74 | auto mutable_column = column->assert_mutable(); |
222 | 74 | if (is_column_nullable(*mutable_column)) { |
223 | 56 | return &assert_cast<ColumnNullable*>(mutable_column.get())->get_nested_column(); |
224 | 56 | } |
225 | 18 | return mutable_column.get(); |
226 | 74 | } |
227 | | |
228 | 179 | inline size_t get_mutable_inner_column_size(const ColumnPtr& column) { |
229 | 179 | if (is_column_nullable(*column)) { |
230 | 164 | const auto* nullable = assert_cast<const ColumnNullable*>(column.get()); |
231 | 164 | return nullable->get_nested_column().size(); |
232 | 164 | } |
233 | 15 | return column->size(); |
234 | 179 | } |
235 | | |
236 | 104 | inline size_t get_null_map_size_or_inner_column_size(const ColumnPtr& column) { |
237 | 104 | if (is_column_nullable(*column)) { |
238 | 96 | const auto* nullable = assert_cast<const ColumnNullable*>(column.get()); |
239 | 96 | return nullable->get_null_map_column().size(); |
240 | 96 | } |
241 | 8 | return column->size(); |
242 | 104 | } |
243 | | |
244 | 104 | inline size_t get_appended_null_map_start(const ColumnPtr& column, size_t new_rows) { |
245 | 104 | if (!is_column_nullable(*column)) { |
246 | 12 | return 0; |
247 | 12 | } |
248 | 92 | const auto* nullable = assert_cast<const ColumnNullable*>(column.get()); |
249 | 92 | const size_t null_map_size = nullable->get_null_map_column().size(); |
250 | 92 | DCHECK_GE(null_map_size, new_rows); |
251 | 92 | return null_map_size - new_rows; |
252 | 104 | } |
253 | | |
254 | | inline void align_null_map(ColumnPtr& src_column, ColumnPtr& dst_column, size_t old_null_map_size, |
255 | 105 | size_t new_rows, size_t src_null_map_start = 0) { |
256 | 105 | if (!is_column_nullable(*dst_column)) { |
257 | 8 | return; |
258 | 8 | } |
259 | | |
260 | 97 | dst_column = IColumn::mutate(std::move(dst_column)); |
261 | 97 | auto* dst_nullable = assert_cast<ColumnNullable*>(dst_column->assert_mutable().get()); |
262 | 97 | auto& dst_null_map = dst_nullable->get_null_map_column(); |
263 | 97 | const size_t expected_rows = old_null_map_size + new_rows; |
264 | 97 | if (dst_null_map.size() == expected_rows) { |
265 | 26 | return; |
266 | 26 | } |
267 | 97 | DCHECK_EQ(dst_null_map.size(), old_null_map_size); |
268 | 71 | if (is_column_nullable(*src_column)) { |
269 | 67 | const auto* src_nullable = assert_cast<const ColumnNullable*>(src_column.get()); |
270 | 67 | DCHECK_GE(src_nullable->get_null_map_column().size(), src_null_map_start + new_rows); |
271 | 67 | dst_null_map.insert_range_from(src_nullable->get_null_map_column(), src_null_map_start, |
272 | 67 | new_rows); |
273 | 67 | } else { |
274 | 4 | dst_null_map.insert_many_vals(0, new_rows); |
275 | 4 | } |
276 | 71 | } |
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 | 416 | PhysicalToLogicalConverter() = default; |
344 | 416 | virtual ~PhysicalToLogicalConverter() = default; |
345 | | |
346 | 20 | virtual Status physical_convert(ColumnPtr& src_physical_col, ColumnPtr& src_logical_column) { |
347 | 20 | return Status::OK(); |
348 | 20 | } |
349 | | |
350 | | Status convert(ColumnPtr& src_physical_col, DataTypePtr src_logical_type, |
351 | | const DataTypePtr& dst_logical_type, ColumnPtr& dst_logical_col, |
352 | 456 | bool is_dict_filter) { |
353 | 456 | 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 | 456 | if (is_consistent() && _logical_converter->is_consistent()) { |
358 | 380 | dst_logical_col = std::move(src_physical_col); |
359 | 380 | return Status::OK(); |
360 | 380 | } |
361 | 76 | if (_logical_converter->is_consistent()) { |
362 | 49 | const size_t old_rows = get_mutable_inner_column_size(dst_logical_col); |
363 | 49 | const size_t old_null_map_size = |
364 | 49 | get_null_map_size_or_inner_column_size(dst_logical_col); |
365 | 49 | RETURN_IF_ERROR(physical_convert(src_physical_col, dst_logical_col)); |
366 | 49 | const size_t new_rows = get_mutable_inner_column_size(dst_logical_col) - old_rows; |
367 | 49 | align_null_map(src_physical_col, dst_logical_col, old_null_map_size, new_rows, |
368 | 49 | get_appended_null_map_start(src_physical_col, new_rows)); |
369 | 49 | return Status::OK(); |
370 | 49 | } |
371 | | |
372 | 27 | ColumnPtr src_logical_column; |
373 | 27 | if (is_consistent()) { |
374 | 20 | src_logical_column = src_physical_col; |
375 | 20 | } else { |
376 | 7 | src_logical_column = _logical_converter->get_column(src_logical_type, dst_logical_col, |
377 | 7 | dst_logical_type); |
378 | 7 | } |
379 | 27 | const size_t src_old_rows = get_mutable_inner_column_size(src_logical_column); |
380 | 27 | const size_t src_old_null_map_size = |
381 | 27 | get_null_map_size_or_inner_column_size(src_logical_column); |
382 | 27 | RETURN_IF_ERROR(physical_convert(src_physical_col, src_logical_column)); |
383 | 27 | const size_t src_new_rows = |
384 | 27 | get_mutable_inner_column_size(src_logical_column) - src_old_rows; |
385 | 27 | align_null_map(src_physical_col, src_logical_column, src_old_null_map_size, src_new_rows, |
386 | 27 | get_appended_null_map_start(src_physical_col, src_new_rows)); |
387 | | |
388 | 27 | dst_logical_col = IColumn::mutate(std::move(dst_logical_col)); |
389 | 27 | const size_t dst_old_null_map_size = |
390 | 27 | get_null_map_size_or_inner_column_size(dst_logical_col); |
391 | 27 | 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 | 27 | align_null_map(src_logical_column, dst_logical_col, dst_old_null_map_size, rows_to_convert, |
396 | 27 | get_appended_null_map_start(src_logical_column, rows_to_convert)); |
397 | 27 | auto converted_column = dst_logical_col->assert_mutable(); |
398 | 27 | RETURN_IF_ERROR(_logical_converter->convert(src_logical_column, converted_column)); |
399 | 26 | return Status::OK(); |
400 | 27 | } |
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 | 432 | DataTypePtr& get_physical_type() { return _cached_src_physical_type; } |
408 | | |
409 | 432 | bool read_directly_into_dst_logical_column() { |
410 | 432 | return !_convert_params->is_type_compatibility && is_consistent() && |
411 | 432 | _logical_converter->is_consistent(); |
412 | 432 | } |
413 | | |
414 | 156 | virtual bool is_consistent() { return false; } |
415 | | |
416 | 724 | 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.30k | 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 |