Coverage Report

Created: 2026-01-17 00:09

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