Coverage Report

Created: 2025-09-15 20:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/be/src/util/binary_cast.hpp
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 <cstdint>
21
#include <type_traits>
22
23
#include "runtime/decimalv2_value.h"
24
#include "util/types.h"
25
#include "vec/core/extended_types.h"
26
#include "vec/runtime/vdatetime_value.h"
27
28
namespace doris {
29
union TypeConverter {
30
    uint64_t u64;
31
    int64_t i64;
32
    uint32_t u32[2];
33
    int32_t i32[2];
34
    uint8_t u8[8];
35
    float flt[2];
36
    double dbl;
37
};
38
39
template <typename C0, typename C1, typename T0, typename T1>
40
constexpr bool match_v = std::is_same_v<C0, C1> && std::is_same_v<T0, T1>;
41
42
union DecimalInt128Union {
43
    DecimalV2Value decimal;
44
    PackedInt128 packed128;
45
    __int128_t i128;
46
};
47
48
static_assert(sizeof(DecimalV2Value) == sizeof(PackedInt128));
49
static_assert(sizeof(DecimalV2Value) == sizeof(__int128_t));
50
51
union VecDateTimeInt64Union {
52
    doris::VecDateTimeValue dt;
53
    __int64_t i64;
54
0
    ~VecDateTimeInt64Union() {}
55
};
56
57
union DateV2UInt32Union {
58
    DateV2Value<DateV2ValueType> dt;
59
    uint32_t ui32;
60
0
    ~DateV2UInt32Union() {}
61
};
62
63
union DateTimeV2UInt64Union {
64
    DateV2Value<DateTimeV2ValueType> dt;
65
    uint64_t ui64;
66
0
    ~DateTimeV2UInt64Union() {}
67
};
68
69
// similar to reinterpret_cast but won't break strict-aliasing rules. you can treat it as std::bit_cast with type checking
70
template <typename From, typename To>
71
610k
constexpr PURE To binary_cast(const From& from) {
72
610k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
610k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
610k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
610k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
610k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
610k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
610k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
610k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
610k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
610k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
610k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
610k
    constexpr bool from_ui64_to_datetime_v2 =
87
610k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
610k
    constexpr bool from_datetime_v2_to_ui64 =
90
610k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
610k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
610k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
610k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
610k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
610k
    return std::bit_cast<To>(from);
98
610k
}
Unexecuted instantiation: _ZN5doris11binary_castIldEET0_RKT_
Unexecuted instantiation: _ZN5doris11binary_castIdlEET0_RKT_
_ZN5doris11binary_castIjNS_11DateV2ValueINS_15DateV2ValueTypeEEEEET0_RKT_
Line
Count
Source
71
37.0k
constexpr PURE To binary_cast(const From& from) {
72
37.0k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
37.0k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
37.0k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
37.0k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
37.0k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
37.0k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
37.0k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
37.0k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
37.0k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
37.0k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
37.0k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
37.0k
    constexpr bool from_ui64_to_datetime_v2 =
87
37.0k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
37.0k
    constexpr bool from_datetime_v2_to_ui64 =
90
37.0k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
37.0k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
37.0k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
37.0k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
37.0k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
37.0k
    return std::bit_cast<To>(from);
98
37.0k
}
_ZN5doris11binary_castImNS_11DateV2ValueINS_19DateTimeV2ValueTypeEEEEET0_RKT_
Line
Count
Source
71
214k
constexpr PURE To binary_cast(const From& from) {
72
214k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
214k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
214k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
214k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
214k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
214k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
214k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
214k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
214k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
214k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
214k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
214k
    constexpr bool from_ui64_to_datetime_v2 =
87
214k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
214k
    constexpr bool from_datetime_v2_to_ui64 =
90
214k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
214k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
214k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
214k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
214k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
214k
    return std::bit_cast<To>(from);
98
214k
}
_ZN5doris11binary_castIlNS_16VecDateTimeValueEEET0_RKT_
Line
Count
Source
71
95.9k
constexpr PURE To binary_cast(const From& from) {
72
95.9k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
95.9k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
95.9k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
95.9k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
95.9k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
95.9k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
95.9k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
95.9k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
95.9k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
95.9k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
95.9k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
95.9k
    constexpr bool from_ui64_to_datetime_v2 =
87
95.9k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
95.9k
    constexpr bool from_datetime_v2_to_ui64 =
90
95.9k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
95.9k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
95.9k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
95.9k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
95.9k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
95.9k
    return std::bit_cast<To>(from);
98
95.9k
}
_ZN5doris11binary_castINS_16VecDateTimeValueElEET0_RKT_
Line
Count
Source
71
87.6k
constexpr PURE To binary_cast(const From& from) {
72
87.6k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
87.6k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
87.6k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
87.6k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
87.6k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
87.6k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
87.6k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
87.6k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
87.6k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
87.6k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
87.6k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
87.6k
    constexpr bool from_ui64_to_datetime_v2 =
87
87.6k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
87.6k
    constexpr bool from_datetime_v2_to_ui64 =
90
87.6k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
87.6k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
87.6k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
87.6k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
87.6k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
87.6k
    return std::bit_cast<To>(from);
98
87.6k
}
_ZN5doris11binary_castINS_11DateV2ValueINS_19DateTimeV2ValueTypeEEEmEET0_RKT_
Line
Count
Source
71
147k
constexpr PURE To binary_cast(const From& from) {
72
147k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
147k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
147k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
147k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
147k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
147k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
147k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
147k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
147k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
147k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
147k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
147k
    constexpr bool from_ui64_to_datetime_v2 =
87
147k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
147k
    constexpr bool from_datetime_v2_to_ui64 =
90
147k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
147k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
147k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
147k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
147k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
147k
    return std::bit_cast<To>(from);
98
147k
}
_ZN5doris11binary_castINS_11DateV2ValueINS_15DateV2ValueTypeEEEjEET0_RKT_
Line
Count
Source
71
27.0k
constexpr PURE To binary_cast(const From& from) {
72
27.0k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
27.0k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
27.0k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
27.0k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
27.0k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
27.0k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
27.0k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
27.0k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
27.0k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
27.0k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
27.0k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
27.0k
    constexpr bool from_ui64_to_datetime_v2 =
87
27.0k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
27.0k
    constexpr bool from_datetime_v2_to_ui64 =
90
27.0k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
27.0k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
27.0k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
27.0k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
27.0k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
27.0k
    return std::bit_cast<To>(from);
98
27.0k
}
_ZN5doris11binary_castINS_14DecimalV2ValueEnEET0_RKT_
Line
Count
Source
71
48
constexpr PURE To binary_cast(const From& from) {
72
48
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
73
48
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
74
48
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
75
48
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
76
48
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
77
48
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
78
48
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
79
48
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
80
48
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
81
82
48
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
83
84
48
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
85
86
48
    constexpr bool from_ui64_to_datetime_v2 =
87
48
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
88
89
48
    constexpr bool from_datetime_v2_to_ui64 =
90
48
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
91
92
48
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
93
48
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
94
48
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
95
48
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_datetime_v2_to_ui64);
96
97
48
    return std::bit_cast<To>(from);
98
48
}
Unexecuted instantiation: _ZN5doris11binary_castImdEET0_RKT_
Unexecuted instantiation: _ZN5doris11binary_castInNS_14DecimalV2ValueEEET0_RKT_
99
100
} // namespace doris