Coverage Report

Created: 2026-07-12 14:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/core/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 "core/extended_types.h"
24
#include "core/packed_int128.h"
25
#include "core/value/decimalv2_value.h"
26
#include "core/value/timestamptz_value.h"
27
#include "core/value/vdatetime_value.h"
28
29
namespace doris {
30
template <typename C0, typename C1, typename T0, typename T1>
31
constexpr bool match_v = std::is_same_v<C0, C1> && std::is_same_v<T0, T1>;
32
33
static_assert(sizeof(DecimalV2Value) == sizeof(PackedInt128));
34
static_assert(sizeof(DecimalV2Value) == sizeof(__int128_t));
35
36
// similar to reinterpret_cast but won't break strict-aliasing rules. you can treat it as std::bit_cast with type checking
37
template <typename From, typename To>
38
25.8k
constexpr To binary_cast(const From& from) {
39
25.8k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
25.8k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
25.8k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
25.8k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
25.8k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
25.8k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
25.8k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
25.8k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
25.8k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
25.8k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
25.8k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
25.8k
    constexpr bool from_ui64_to_datetime_v2 =
54
25.8k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
25.8k
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
25.8k
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
25.8k
    constexpr bool from_datetime_v2_to_ui64 =
61
25.8k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
25.8k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
25.8k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
25.8k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
25.8k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
25.8k
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
25.8k
    return std::bit_cast<To>(from);
70
25.8k
}
Unexecuted instantiation: _ZN5doris11binary_castIldEET0_RKT_
Unexecuted instantiation: _ZN5doris11binary_castIdlEET0_RKT_
_ZN5doris11binary_castIjNS_11DateV2ValueINS_15DateV2ValueTypeEEEEET0_RKT_
Line
Count
Source
38
2.17k
constexpr To binary_cast(const From& from) {
39
2.17k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
2.17k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
2.17k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
2.17k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
2.17k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
2.17k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
2.17k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
2.17k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
2.17k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
2.17k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
2.17k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
2.17k
    constexpr bool from_ui64_to_datetime_v2 =
54
2.17k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
2.17k
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
2.17k
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
2.17k
    constexpr bool from_datetime_v2_to_ui64 =
61
2.17k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
2.17k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
2.17k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
2.17k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
2.17k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
2.17k
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
2.17k
    return std::bit_cast<To>(from);
70
2.17k
}
_ZN5doris11binary_castImNS_11DateV2ValueINS_19DateTimeV2ValueTypeEEEEET0_RKT_
Line
Count
Source
38
4.29k
constexpr To binary_cast(const From& from) {
39
4.29k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
4.29k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
4.29k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
4.29k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
4.29k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
4.29k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
4.29k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
4.29k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
4.29k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
4.29k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
4.29k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
4.29k
    constexpr bool from_ui64_to_datetime_v2 =
54
4.29k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
4.29k
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
4.29k
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
4.29k
    constexpr bool from_datetime_v2_to_ui64 =
61
4.29k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
4.29k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
4.29k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
4.29k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
4.29k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
4.29k
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
4.29k
    return std::bit_cast<To>(from);
70
4.29k
}
_ZN5doris11binary_castImNS_16TimestampTzValueEEET0_RKT_
Line
Count
Source
38
290
constexpr To binary_cast(const From& from) {
39
290
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
290
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
290
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
290
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
290
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
290
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
290
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
290
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
290
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
290
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
290
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
290
    constexpr bool from_ui64_to_datetime_v2 =
54
290
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
290
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
290
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
290
    constexpr bool from_datetime_v2_to_ui64 =
61
290
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
290
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
290
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
290
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
290
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
290
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
290
    return std::bit_cast<To>(from);
70
290
}
_ZN5doris11binary_castIlNS_16VecDateTimeValueEEET0_RKT_
Line
Count
Source
38
1.91k
constexpr To binary_cast(const From& from) {
39
1.91k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
1.91k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
1.91k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
1.91k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
1.91k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
1.91k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
1.91k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
1.91k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
1.91k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
1.91k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
1.91k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
1.91k
    constexpr bool from_ui64_to_datetime_v2 =
54
1.91k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
1.91k
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
1.91k
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
1.91k
    constexpr bool from_datetime_v2_to_ui64 =
61
1.91k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
1.91k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
1.91k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
1.91k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
1.91k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
1.91k
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
1.91k
    return std::bit_cast<To>(from);
70
1.91k
}
_ZN5doris11binary_castINS_14DecimalV2ValueEnEET0_RKT_
Line
Count
Source
38
116
constexpr To binary_cast(const From& from) {
39
116
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
116
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
116
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
116
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
116
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
116
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
116
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
116
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
116
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
116
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
116
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
116
    constexpr bool from_ui64_to_datetime_v2 =
54
116
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
116
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
116
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
116
    constexpr bool from_datetime_v2_to_ui64 =
61
116
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
116
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
116
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
116
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
116
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
116
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
116
    return std::bit_cast<To>(from);
70
116
}
_ZN5doris11binary_castINS_16VecDateTimeValueElEET0_RKT_
Line
Count
Source
38
16.9k
constexpr To binary_cast(const From& from) {
39
16.9k
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
16.9k
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
16.9k
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
16.9k
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
16.9k
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
16.9k
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
16.9k
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
16.9k
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
16.9k
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
16.9k
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
16.9k
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
16.9k
    constexpr bool from_ui64_to_datetime_v2 =
54
16.9k
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
16.9k
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
16.9k
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
16.9k
    constexpr bool from_datetime_v2_to_ui64 =
61
16.9k
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
16.9k
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
16.9k
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
16.9k
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
16.9k
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
16.9k
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
16.9k
    return std::bit_cast<To>(from);
70
16.9k
}
_ZN5doris11binary_castINS_11DateV2ValueINS_19DateTimeV2ValueTypeEEEmEET0_RKT_
Line
Count
Source
38
24
constexpr To binary_cast(const From& from) {
39
24
    constexpr bool from_u64_to_db = match_v<From, uint64_t, To, double>;
40
24
    constexpr bool from_i64_to_db = match_v<From, int64_t, To, double>;
41
24
    constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
42
24
    constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
43
24
    constexpr bool from_i64_to_vec_dt = match_v<From, __int64_t, To, doris::VecDateTimeValue>;
44
24
    constexpr bool from_vec_dt_to_i64 = match_v<From, doris::VecDateTimeValue, To, __int64_t>;
45
24
    constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
46
24
    constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
47
24
    constexpr bool from_decv2_to_i256 = match_v<From, DecimalV2Value, To, wide::Int256>;
48
49
24
    constexpr bool from_ui32_to_date_v2 = match_v<From, uint32_t, To, DateV2Value<DateV2ValueType>>;
50
51
24
    constexpr bool from_date_v2_to_ui32 = match_v<From, DateV2Value<DateV2ValueType>, To, uint32_t>;
52
53
24
    constexpr bool from_ui64_to_datetime_v2 =
54
24
            match_v<From, uint64_t, To, DateV2Value<DateTimeV2ValueType>>;
55
56
24
    constexpr bool from_ui64_to_timestamptz = match_v<From, uint64_t, To, TimestampTzValue>;
57
58
24
    constexpr bool from_timestamptz_to_ui64 = match_v<From, TimestampTzValue, To, uint64_t>;
59
60
24
    constexpr bool from_datetime_v2_to_ui64 =
61
24
            match_v<From, DateV2Value<DateTimeV2ValueType>, To, uint64_t>;
62
63
24
    static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
64
24
                  from_i64_to_vec_dt || from_vec_dt_to_i64 || from_i128_to_decv2 ||
65
24
                  from_decv2_to_i128 || from_decv2_to_i256 || from_ui32_to_date_v2 ||
66
24
                  from_date_v2_to_ui32 || from_ui64_to_datetime_v2 || from_ui64_to_timestamptz ||
67
24
                  from_timestamptz_to_ui64 || from_datetime_v2_to_ui64);
68
69
24
    return std::bit_cast<To>(from);
70
24
}
Unexecuted instantiation: _ZN5doris11binary_castInNS_14DecimalV2ValueEEET0_RKT_
Unexecuted instantiation: _ZN5doris11binary_castImdEET0_RKT_
71
72
} // namespace doris