Coverage Report

Created: 2026-05-18 01:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/cast/cast_to_decimal.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 <cmath>
21
#include <type_traits>
22
23
#include "common/status.h"
24
#include "core/data_type/data_type_decimal.h"
25
#include "core/data_type/data_type_number.h"
26
#include "core/types.h"
27
#include "exprs/function/cast/cast_to_basic_number_common.h"
28
29
namespace doris {
30
31
#define DECIMAL_CONVERT_OVERFLOW_ERROR(value, from_type_name, precision, scale)                    \
32
2.14k
    Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,                                                  \
33
2.14k
           fmt::format(                                                                            \
34
2.14k
                   "Arithmetic overflow when converting value {} from type {} to decimal({}, {})", \
35
2.14k
                   value, from_type_name, precision, scale))
36
37
struct CastToDecimal {
38
    template <typename ToCppT>
39
        requires(IsDecimalNumber<ToCppT>)
40
    static inline bool from_string(const StringRef& from, ToCppT& to, UInt32 precision,
41
110k
                                   UInt32 scale, CastParameters& params) {
42
110k
        if constexpr (IsDecimalV2<ToCppT>) {
43
14
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
14
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
14
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
14
                    &result));
47
14
            return result == StringParser::PARSE_SUCCESS;
48
14
        }
49
50
29.7k
        if constexpr (IsDecimal32<ToCppT>) {
51
29.7k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
29.7k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
29.7k
                                                                       precision, scale, &result);
54
29.7k
            return result == StringParser::PARSE_SUCCESS;
55
29.7k
        }
56
57
26.9k
        if constexpr (IsDecimal64<ToCppT>) {
58
26.9k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
26.9k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
26.9k
                                                                       precision, scale, &result);
61
26.9k
            return result == StringParser::PARSE_SUCCESS;
62
26.9k
        }
63
64
26.9k
        if constexpr (IsDecimal128V3<ToCppT>) {
65
26.9k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
26.9k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
26.9k
                                                                         precision, scale, &result);
68
26.9k
            return result == StringParser::PARSE_SUCCESS;
69
26.9k
        }
70
71
26.8k
        if constexpr (IsDecimal256<ToCppT>) {
72
26.8k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
26.8k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
26.8k
                                                                        precision, scale, &result);
75
26.8k
            return result == StringParser::PARSE_SUCCESS;
76
26.8k
        }
77
110k
    }
_ZN5doris13CastToDecimal11from_stringINS_7DecimalIiEEQ15IsDecimalNumberIT_EEEbRKNS_9StringRefERS4_jjRNS_14CastParametersE
Line
Count
Source
41
29.7k
                                   UInt32 scale, CastParameters& params) {
42
        if constexpr (IsDecimalV2<ToCppT>) {
43
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
                    &result));
47
            return result == StringParser::PARSE_SUCCESS;
48
        }
49
50
29.7k
        if constexpr (IsDecimal32<ToCppT>) {
51
29.7k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
29.7k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
29.7k
                                                                       precision, scale, &result);
54
29.7k
            return result == StringParser::PARSE_SUCCESS;
55
29.7k
        }
56
57
        if constexpr (IsDecimal64<ToCppT>) {
58
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
                                                                       precision, scale, &result);
61
            return result == StringParser::PARSE_SUCCESS;
62
        }
63
64
        if constexpr (IsDecimal128V3<ToCppT>) {
65
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
                                                                         precision, scale, &result);
68
            return result == StringParser::PARSE_SUCCESS;
69
        }
70
71
        if constexpr (IsDecimal256<ToCppT>) {
72
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
                                                                        precision, scale, &result);
75
            return result == StringParser::PARSE_SUCCESS;
76
        }
77
29.7k
    }
_ZN5doris13CastToDecimal11from_stringINS_7DecimalIlEEQ15IsDecimalNumberIT_EEEbRKNS_9StringRefERS4_jjRNS_14CastParametersE
Line
Count
Source
41
26.9k
                                   UInt32 scale, CastParameters& params) {
42
        if constexpr (IsDecimalV2<ToCppT>) {
43
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
                    &result));
47
            return result == StringParser::PARSE_SUCCESS;
48
        }
49
50
        if constexpr (IsDecimal32<ToCppT>) {
51
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
                                                                       precision, scale, &result);
54
            return result == StringParser::PARSE_SUCCESS;
55
        }
56
57
26.9k
        if constexpr (IsDecimal64<ToCppT>) {
58
26.9k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
26.9k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
26.9k
                                                                       precision, scale, &result);
61
26.9k
            return result == StringParser::PARSE_SUCCESS;
62
26.9k
        }
63
64
        if constexpr (IsDecimal128V3<ToCppT>) {
65
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
                                                                         precision, scale, &result);
68
            return result == StringParser::PARSE_SUCCESS;
69
        }
70
71
        if constexpr (IsDecimal256<ToCppT>) {
72
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
                                                                        precision, scale, &result);
75
            return result == StringParser::PARSE_SUCCESS;
76
        }
77
26.9k
    }
_ZN5doris13CastToDecimal11from_stringINS_12Decimal128V3EQ15IsDecimalNumberIT_EEEbRKNS_9StringRefERS3_jjRNS_14CastParametersE
Line
Count
Source
41
26.9k
                                   UInt32 scale, CastParameters& params) {
42
        if constexpr (IsDecimalV2<ToCppT>) {
43
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
                    &result));
47
            return result == StringParser::PARSE_SUCCESS;
48
        }
49
50
        if constexpr (IsDecimal32<ToCppT>) {
51
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
                                                                       precision, scale, &result);
54
            return result == StringParser::PARSE_SUCCESS;
55
        }
56
57
        if constexpr (IsDecimal64<ToCppT>) {
58
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
                                                                       precision, scale, &result);
61
            return result == StringParser::PARSE_SUCCESS;
62
        }
63
64
26.9k
        if constexpr (IsDecimal128V3<ToCppT>) {
65
26.9k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
26.9k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
26.9k
                                                                         precision, scale, &result);
68
26.9k
            return result == StringParser::PARSE_SUCCESS;
69
26.9k
        }
70
71
        if constexpr (IsDecimal256<ToCppT>) {
72
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
                                                                        precision, scale, &result);
75
            return result == StringParser::PARSE_SUCCESS;
76
        }
77
26.9k
    }
_ZN5doris13CastToDecimal11from_stringINS_14DecimalV2ValueEQ15IsDecimalNumberIT_EEEbRKNS_9StringRefERS3_jjRNS_14CastParametersE
Line
Count
Source
41
14
                                   UInt32 scale, CastParameters& params) {
42
14
        if constexpr (IsDecimalV2<ToCppT>) {
43
14
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
14
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
14
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
14
                    &result));
47
14
            return result == StringParser::PARSE_SUCCESS;
48
14
        }
49
50
        if constexpr (IsDecimal32<ToCppT>) {
51
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
                                                                       precision, scale, &result);
54
            return result == StringParser::PARSE_SUCCESS;
55
        }
56
57
        if constexpr (IsDecimal64<ToCppT>) {
58
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
                                                                       precision, scale, &result);
61
            return result == StringParser::PARSE_SUCCESS;
62
        }
63
64
        if constexpr (IsDecimal128V3<ToCppT>) {
65
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
                                                                         precision, scale, &result);
68
            return result == StringParser::PARSE_SUCCESS;
69
        }
70
71
        if constexpr (IsDecimal256<ToCppT>) {
72
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
                                                                        precision, scale, &result);
75
            return result == StringParser::PARSE_SUCCESS;
76
        }
77
14
    }
_ZN5doris13CastToDecimal11from_stringINS_7DecimalIN4wide7integerILm256EiEEEEQ15IsDecimalNumberIT_EEEbRKNS_9StringRefERS7_jjRNS_14CastParametersE
Line
Count
Source
41
26.8k
                                   UInt32 scale, CastParameters& params) {
42
        if constexpr (IsDecimalV2<ToCppT>) {
43
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
44
            to = DecimalV2Value(StringParser::string_to_decimal<TYPE_DECIMALV2>(
45
                    from.data, (int)from.size, DecimalV2Value::PRECISION, DecimalV2Value::SCALE,
46
                    &result));
47
            return result == StringParser::PARSE_SUCCESS;
48
        }
49
50
        if constexpr (IsDecimal32<ToCppT>) {
51
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
52
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL32>(from.data, (int)from.size,
53
                                                                       precision, scale, &result);
54
            return result == StringParser::PARSE_SUCCESS;
55
        }
56
57
        if constexpr (IsDecimal64<ToCppT>) {
58
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
59
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL64>(from.data, (int)from.size,
60
                                                                       precision, scale, &result);
61
            return result == StringParser::PARSE_SUCCESS;
62
        }
63
64
        if constexpr (IsDecimal128V3<ToCppT>) {
65
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
66
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL128I>(from.data, (int)from.size,
67
                                                                         precision, scale, &result);
68
            return result == StringParser::PARSE_SUCCESS;
69
        }
70
71
26.8k
        if constexpr (IsDecimal256<ToCppT>) {
72
26.8k
            StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
73
26.8k
            to.value = StringParser::string_to_decimal<TYPE_DECIMAL256>(from.data, (int)from.size,
74
26.8k
                                                                        precision, scale, &result);
75
26.8k
            return result == StringParser::PARSE_SUCCESS;
76
26.8k
        }
77
26.8k
    }
78
79
    // cast int to decimal
80
    template <typename FromCppT, typename ToCppT,
81
              typename MaxNativeType =
82
                      std::conditional_t<(sizeof(FromCppT) > sizeof(typename ToCppT::NativeType)),
83
                                         FromCppT, typename ToCppT::NativeType>>
84
        requires(IsDecimalNumber<ToCppT> &&
85
                 (IsCppTypeInt<FromCppT> || std::is_same_v<FromCppT, UInt8>))
86
    static inline bool from_int(const FromCppT& from, ToCppT& to, UInt32 to_precision,
87
7
                                UInt32 to_scale, CastParameters& params) {
88
7
        MaxNativeType scale_multiplier =
89
7
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
7
        typename ToCppT::NativeType max_result =
91
7
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
7
        typename ToCppT::NativeType min_result = -max_result;
93
94
7
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
7
        constexpr UInt32 from_scale = 0;
96
7
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
7
        auto from_max_int_digit_count = from_precision - from_scale;
99
7
        auto to_max_int_digit_count = to_precision - to_scale;
100
7
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
7
        bool multiply_may_overflow = false;
102
7
        if (to_scale > from_scale) {
103
7
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
7
        }
105
7
        return std::visit(
106
7
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
7
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
7
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
7
                            max_result, params);
110
7
                },
_ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Line
Count
Source
106
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
2
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
2
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
2
                            max_result, params);
110
2
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
_ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Line
Count
Source
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
_ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Line
Count
Source
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
_ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Line
Count
Source
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIiEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIiEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIiEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
_ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIiEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Line
Count
Source
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIiEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIiEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIiEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
_ZZN5doris13CastToDecimal8from_intInNS_7DecimalIiEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Line
Count
Source
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIlEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIlEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIlEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIlEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIaNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIsNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIiNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intIlNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal8from_intInNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
111
7
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
7
    }
_ZN5doris13CastToDecimal8from_intIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
2
                                UInt32 to_scale, CastParameters& params) {
88
2
        MaxNativeType scale_multiplier =
89
2
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
2
        typename ToCppT::NativeType max_result =
91
2
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
2
        typename ToCppT::NativeType min_result = -max_result;
93
94
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
2
        constexpr UInt32 from_scale = 0;
96
2
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
2
        auto from_max_int_digit_count = from_precision - from_scale;
99
2
        auto to_max_int_digit_count = to_precision - to_scale;
100
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
2
        bool multiply_may_overflow = false;
102
2
        if (to_scale > from_scale) {
103
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
2
        }
105
2
        return std::visit(
106
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
2
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
2
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
2
                            max_result, params);
110
2
                },
111
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
2
    }
_ZN5doris13CastToDecimal8from_intIaNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
1
                                UInt32 to_scale, CastParameters& params) {
88
1
        MaxNativeType scale_multiplier =
89
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
1
        typename ToCppT::NativeType max_result =
91
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
1
        typename ToCppT::NativeType min_result = -max_result;
93
94
1
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
1
        constexpr UInt32 from_scale = 0;
96
1
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
1
        auto from_max_int_digit_count = from_precision - from_scale;
99
1
        auto to_max_int_digit_count = to_precision - to_scale;
100
1
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
1
        bool multiply_may_overflow = false;
102
1
        if (to_scale > from_scale) {
103
1
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
1
        }
105
1
        return std::visit(
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
111
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
1
    }
_ZN5doris13CastToDecimal8from_intIsNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
1
                                UInt32 to_scale, CastParameters& params) {
88
1
        MaxNativeType scale_multiplier =
89
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
1
        typename ToCppT::NativeType max_result =
91
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
1
        typename ToCppT::NativeType min_result = -max_result;
93
94
1
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
1
        constexpr UInt32 from_scale = 0;
96
1
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
1
        auto from_max_int_digit_count = from_precision - from_scale;
99
1
        auto to_max_int_digit_count = to_precision - to_scale;
100
1
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
1
        bool multiply_may_overflow = false;
102
1
        if (to_scale > from_scale) {
103
1
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
1
        }
105
1
        return std::visit(
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
111
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
1
    }
_ZN5doris13CastToDecimal8from_intIiNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
1
                                UInt32 to_scale, CastParameters& params) {
88
1
        MaxNativeType scale_multiplier =
89
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
1
        typename ToCppT::NativeType max_result =
91
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
1
        typename ToCppT::NativeType min_result = -max_result;
93
94
1
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
1
        constexpr UInt32 from_scale = 0;
96
1
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
1
        auto from_max_int_digit_count = from_precision - from_scale;
99
1
        auto to_max_int_digit_count = to_precision - to_scale;
100
1
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
1
        bool multiply_may_overflow = false;
102
1
        if (to_scale > from_scale) {
103
1
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
1
        }
105
1
        return std::visit(
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
111
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
1
    }
_ZN5doris13CastToDecimal8from_intIlNS_7DecimalIiEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
1
                                UInt32 to_scale, CastParameters& params) {
88
1
        MaxNativeType scale_multiplier =
89
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
1
        typename ToCppT::NativeType max_result =
91
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
1
        typename ToCppT::NativeType min_result = -max_result;
93
94
1
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
1
        constexpr UInt32 from_scale = 0;
96
1
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
1
        auto from_max_int_digit_count = from_precision - from_scale;
99
1
        auto to_max_int_digit_count = to_precision - to_scale;
100
1
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
1
        bool multiply_may_overflow = false;
102
1
        if (to_scale > from_scale) {
103
1
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
1
        }
105
1
        return std::visit(
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
111
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
1
    }
_ZN5doris13CastToDecimal8from_intInNS_7DecimalIiEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
87
1
                                UInt32 to_scale, CastParameters& params) {
88
1
        MaxNativeType scale_multiplier =
89
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
90
1
        typename ToCppT::NativeType max_result =
91
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
92
1
        typename ToCppT::NativeType min_result = -max_result;
93
94
1
        UInt32 from_precision = NumberTraits::max_ascii_len<FromCppT>();
95
1
        constexpr UInt32 from_scale = 0;
96
1
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
97
98
1
        auto from_max_int_digit_count = from_precision - from_scale;
99
1
        auto to_max_int_digit_count = to_precision - to_scale;
100
1
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
101
1
        bool multiply_may_overflow = false;
102
1
        if (to_scale > from_scale) {
103
1
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
104
1
        }
105
1
        return std::visit(
106
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
107
1
                    return _from_int<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
108
1
                            from, to, to_precision, to_scale, scale_multiplier, min_result,
109
1
                            max_result, params);
110
1
                },
111
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
112
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIaNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIsNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIiNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIlNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intInNS_7DecimalIlEEnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIaNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIsNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIiNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIlNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intInNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIaNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIsNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIiNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intIlNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal8from_intInNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRNS_14CastParametersE
113
114
    // cast bool to decimal
115
    template <typename FromCppT, typename ToCppT,
116
              typename MaxNativeType =
117
                      std::conditional_t<(sizeof(FromCppT) > sizeof(typename ToCppT::NativeType)),
118
                                         FromCppT, typename ToCppT::NativeType>>
119
        requires(IsDecimalNumber<ToCppT> && std::is_same_v<FromCppT, UInt8>)
120
    static inline bool from_bool(const FromCppT& from, ToCppT& to, UInt32 to_precision,
121
2
                                 UInt32 to_scale, CastParameters& params) {
122
2
        return from_int<FromCppT, ToCppT, MaxNativeType>(from, to, to_precision, to_scale, params);
123
2
    }
_ZN5doris13CastToDecimal9from_boolIhNS_7DecimalIiEEiQaa15IsDecimalNumberIT0_Esr3stdE9is_same_vIT_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
121
2
                                 UInt32 to_scale, CastParameters& params) {
122
2
        return from_int<FromCppT, ToCppT, MaxNativeType>(from, to, to_precision, to_scale, params);
123
2
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9from_boolIhNS_7DecimalIlEElQaa15IsDecimalNumberIT0_Esr3stdE9is_same_vIT_hEEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9from_boolIhNS_12Decimal128V3EnQaa15IsDecimalNumberIT0_Esr3stdE9is_same_vIT_hEEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9from_boolIhNS_7DecimalIN4wide7integerILm256EiEEEES5_Qaa15IsDecimalNumberIT0_Esr3stdE9is_same_vIT_hEEEbRKS8_RS7_jjRNS_14CastParametersE
124
125
    template <typename FromCppT, typename ToCppT>
126
        requires(IsDecimalNumber<ToCppT> && IsCppTypeFloat<FromCppT>)
127
    static inline bool from_float(const FromCppT& from, ToCppT& to, UInt32 to_precision,
128
2
                                  UInt32 to_scale, CastParameters& params) {
129
2
        typename ToCppT::NativeType scale_multiplier =
130
2
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
131
2
        typename ToCppT::NativeType max_result =
132
2
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
133
2
        typename ToCppT::NativeType min_result = -max_result;
134
135
2
        return _from_float(from, to, to_precision, to_scale, scale_multiplier, min_result,
136
2
                           max_result, params);
137
2
    }
_ZN5doris13CastToDecimal10from_floatIdNS_7DecimalIiEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
128
1
                                  UInt32 to_scale, CastParameters& params) {
129
1
        typename ToCppT::NativeType scale_multiplier =
130
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
131
1
        typename ToCppT::NativeType max_result =
132
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
133
1
        typename ToCppT::NativeType min_result = -max_result;
134
135
1
        return _from_float(from, to, to_precision, to_scale, scale_multiplier, min_result,
136
1
                           max_result, params);
137
1
    }
_ZN5doris13CastToDecimal10from_floatIfNS_7DecimalIiEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS5_RS4_jjRNS_14CastParametersE
Line
Count
Source
128
1
                                  UInt32 to_scale, CastParameters& params) {
129
1
        typename ToCppT::NativeType scale_multiplier =
130
1
                DataTypeDecimal<ToCppT::PType>::get_scale_multiplier(to_scale);
131
1
        typename ToCppT::NativeType max_result =
132
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
133
1
        typename ToCppT::NativeType min_result = -max_result;
134
135
1
        return _from_float(from, to, to_precision, to_scale, scale_multiplier, min_result,
136
1
                           max_result, params);
137
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIdNS_7DecimalIlEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIfNS_7DecimalIlEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS5_RS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIdNS_12Decimal128V3EQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIfNS_12Decimal128V3EQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS4_RS3_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIdNS_7DecimalIN4wide7integerILm256EiEEEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS8_RS7_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal10from_floatIfNS_7DecimalIN4wide7integerILm256EiEEEEQaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_EEEbRKS8_RS7_jjRNS_14CastParametersE
138
139
    template <typename FromCppT, typename ToCppT,
140
              typename MaxFieldType = std::conditional_t<
141
                      (sizeof(FromCppT) == sizeof(ToCppT)) &&
142
                              (std::is_same_v<ToCppT, Decimal128V3> ||
143
                               std::is_same_v<FromCppT, Decimal128V3>),
144
                      Decimal128V3,
145
                      std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)), FromCppT, ToCppT>>>
146
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
147
    static inline bool from_decimal(const FromCppT& from, const UInt32 from_precision,
148
                                    const UInt32 from_scale, ToCppT& to, UInt32 to_precision,
149
5
                                    UInt32 to_scale, CastParameters& params) {
150
5
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
5
                                                               to_precision, to_scale, params);
152
5
    }
_ZN5doris13CastToDecimal12from_decimalINS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersE
Line
Count
Source
149
1
                                    UInt32 to_scale, CastParameters& params) {
150
1
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
1
                                                               to_precision, to_scale, params);
152
1
    }
_ZN5doris13CastToDecimal12from_decimalINS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Line
Count
Source
149
1
                                    UInt32 to_scale, CastParameters& params) {
150
1
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
1
                                                               to_precision, to_scale, params);
152
1
    }
_ZN5doris13CastToDecimal12from_decimalINS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Line
Count
Source
149
1
                                    UInt32 to_scale, CastParameters& params) {
150
1
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
1
                                                               to_precision, to_scale, params);
152
1
    }
_ZN5doris13CastToDecimal12from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Line
Count
Source
149
1
                                    UInt32 to_scale, CastParameters& params) {
150
1
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
1
                                                               to_precision, to_scale, params);
152
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
_ZN5doris13CastToDecimal12from_decimalINS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersE
Line
Count
Source
149
1
                                    UInt32 to_scale, CastParameters& params) {
150
1
        return _from_decimalv3<FromCppT, ToCppT, MaxFieldType>(from, from_precision, from_scale, to,
151
1
                                                               to_precision, to_scale, params);
152
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal12from_decimalINS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersE
153
154
    template <typename FromCppT, typename ToCppT,
155
              typename MaxFieldType = std::conditional_t<
156
                      (sizeof(FromCppT) == sizeof(ToCppT)) &&
157
                              (std::is_same_v<ToCppT, Decimal128V3> ||
158
                               std::is_same_v<FromCppT, Decimal128V3>),
159
                      Decimal128V3,
160
                      std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)), FromCppT, ToCppT>>>
161
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
162
    static inline bool _from_decimalv3(const FromCppT& from, const UInt32 from_precision,
163
                                       const UInt32 from_scale, ToCppT& to, UInt32 to_precision,
164
5
                                       UInt32 to_scale, CastParameters& params) {
165
5
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
5
        auto from_max_int_digit_count = from_precision - from_scale;
168
5
        auto to_max_int_digit_count = to_precision - to_scale;
169
5
        bool narrow_integral =
170
5
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
5
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
5
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
5
        bool multiply_may_overflow = false;
175
5
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
5
        typename ToCppT::NativeType max_result =
180
5
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
5
        typename ToCppT::NativeType min_result = -max_result;
182
183
5
        MaxNativeType multiplier {};
184
5
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
5
        } else if (from_scale > to_scale) {
188
3
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
3
                                                                                    to_scale);
190
3
        }
191
192
5
        return std::visit(
193
5
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
5
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
5
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
5
                            min_result, max_result, multiplier, params);
197
5
                },
_ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Line
Count
Source
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
_ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Line
Count
Source
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
_ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Line
Count
Source
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
_ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Line
Count
Source
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb0EESD_IbLb1EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESD_IbLb0EEEEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersEENKUlS5_S4_E_clISt17integral_constantIbLb1EESE_EEDaS5_S4_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESF_EEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb0EESE_IbLb1EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESE_IbLb0EEEEDaS6_S5_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersEENKUlS6_S5_E_clISt17integral_constantIbLb1EESF_EEDaS6_S5_
_ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESD_EEDaS4_S3_
Line
Count
Source
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb0EESC_IbLb1EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESC_IbLb0EEEEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersEENKUlS4_S3_E_clISt17integral_constantIbLb1EESD_EEDaS4_S3_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb0EESH_IbLb1EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESH_IbLb0EEEEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersEENKUlS9_S8_E_clISt17integral_constantIbLb1EESI_EEDaS9_S8_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESH_EEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb0EESG_IbLb1EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESG_IbLb0EEEEDaS8_S7_
Unexecuted instantiation: _ZZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersEENKUlS8_S7_E_clISt17integral_constantIbLb1EESH_EEDaS8_S7_
198
5
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
5
    }
_ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersE
Line
Count
Source
164
1
                                       UInt32 to_scale, CastParameters& params) {
165
1
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
1
        auto from_max_int_digit_count = from_precision - from_scale;
168
1
        auto to_max_int_digit_count = to_precision - to_scale;
169
1
        bool narrow_integral =
170
1
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
1
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
1
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
1
        bool multiply_may_overflow = false;
175
1
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
1
        typename ToCppT::NativeType max_result =
180
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
1
        typename ToCppT::NativeType min_result = -max_result;
182
183
1
        MaxNativeType multiplier {};
184
1
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
1
        } else if (from_scale > to_scale) {
188
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
0
                                                                                    to_scale);
190
0
        }
191
192
1
        return std::visit(
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
198
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
1
    }
_ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IiEES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Line
Count
Source
164
1
                                       UInt32 to_scale, CastParameters& params) {
165
1
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
1
        auto from_max_int_digit_count = from_precision - from_scale;
168
1
        auto to_max_int_digit_count = to_precision - to_scale;
169
1
        bool narrow_integral =
170
1
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
1
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
1
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
1
        bool multiply_may_overflow = false;
175
1
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
1
        typename ToCppT::NativeType max_result =
180
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
1
        typename ToCppT::NativeType min_result = -max_result;
182
183
1
        MaxNativeType multiplier {};
184
1
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
1
        } else if (from_scale > to_scale) {
188
1
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
1
                                                                                    to_scale);
190
1
        }
191
192
1
        return std::visit(
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
198
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
1
    }
_ZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIiEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Line
Count
Source
164
1
                                       UInt32 to_scale, CastParameters& params) {
165
1
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
1
        auto from_max_int_digit_count = from_precision - from_scale;
168
1
        auto to_max_int_digit_count = to_precision - to_scale;
169
1
        bool narrow_integral =
170
1
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
1
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
1
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
1
        bool multiply_may_overflow = false;
175
1
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
1
        typename ToCppT::NativeType max_result =
180
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
1
        typename ToCppT::NativeType min_result = -max_result;
182
183
1
        MaxNativeType multiplier {};
184
1
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
1
        } else if (from_scale > to_scale) {
188
1
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
1
                                                                                    to_scale);
190
1
        }
191
192
1
        return std::visit(
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
198
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
1
    }
_ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Line
Count
Source
164
1
                                       UInt32 to_scale, CastParameters& params) {
165
1
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
1
        auto from_max_int_digit_count = from_precision - from_scale;
168
1
        auto to_max_int_digit_count = to_precision - to_scale;
169
1
        bool narrow_integral =
170
1
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
1
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
1
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
1
        bool multiply_may_overflow = false;
175
1
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
1
        typename ToCppT::NativeType max_result =
180
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
1
        typename ToCppT::NativeType min_result = -max_result;
182
183
1
        MaxNativeType multiplier {};
184
1
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
1
        } else if (from_scale > to_scale) {
188
1
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
1
                                                                                    to_scale);
190
1
        }
191
192
1
        return std::visit(
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
198
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IlEES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEES3_S3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIlEES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS_12Decimal128V3ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRNS_14CastParametersE
_ZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ES2_S2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRNS_14CastParametersE
Line
Count
Source
164
1
                                       UInt32 to_scale, CastParameters& params) {
165
1
        using MaxNativeType = typename MaxFieldType::NativeType;
166
167
1
        auto from_max_int_digit_count = from_precision - from_scale;
168
1
        auto to_max_int_digit_count = to_precision - to_scale;
169
1
        bool narrow_integral =
170
1
                (to_max_int_digit_count < from_max_int_digit_count) ||
171
1
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
172
173
1
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
174
1
        bool multiply_may_overflow = false;
175
1
        if (to_scale > from_scale) {
176
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
177
0
        }
178
179
1
        typename ToCppT::NativeType max_result =
180
1
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
181
1
        typename ToCppT::NativeType min_result = -max_result;
182
183
1
        MaxNativeType multiplier {};
184
1
        if (from_scale < to_scale) {
185
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
186
0
                                                                                    from_scale);
187
1
        } else if (from_scale > to_scale) {
188
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
189
0
                                                                                    to_scale);
190
0
        }
191
192
1
        return std::visit(
193
1
                [&](auto multiply_may_overflow, auto narrow_integral) {
194
1
                    return _from_decimal<FromCppT, ToCppT, multiply_may_overflow, narrow_integral>(
195
1
                            from, from_precision, from_scale, to, to_precision, to_scale,
196
1
                            min_result, max_result, multiplier, params);
197
1
                },
198
1
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
199
1
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal15_from_decimalv3INS_7DecimalIN4wide7integerILm256EiEEEES6_S6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRNS_14CastParametersE
200
201
    template <typename FromCppT, typename ToCppT, bool multiply_may_overflow, bool narrow_integral,
202
              typename MaxFieldType = std::conditional_t<
203
                      (sizeof(FromCppT) == sizeof(ToCppT)) &&
204
                              (std::is_same_v<ToCppT, Decimal128V3> ||
205
                               std::is_same_v<FromCppT, Decimal128V3>),
206
                      Decimal128V3,
207
                      std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)), FromCppT, ToCppT>>>
208
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
209
    static inline bool _from_decimal(const FromCppT& from, const UInt32 from_precision,
210
                                     const UInt32 from_scale, ToCppT& to, UInt32 to_precision,
211
                                     UInt32 to_scale, const ToCppT::NativeType& min_result,
212
                                     const ToCppT::NativeType& max_result,
213
                                     const typename MaxFieldType::NativeType& scale_multiplier,
214
14.8k
                                     CastParameters& params) {
215
14.8k
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
14.8k
        if (from_scale < to_scale) {
218
4.59k
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
4.59k
                                               narrow_integral>(
220
4.59k
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
4.59k
                    min_result, max_result, params);
222
10.2k
        } else if (from_scale == to_scale) {
223
1.86k
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
1.86k
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
1.86k
                    max_result, params);
226
8.38k
        } else {
227
8.38k
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
8.38k
                                              narrow_integral>(
229
8.38k
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
8.38k
                    min_result, max_result, params);
231
8.38k
        }
232
0
        return true;
233
14.8k
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEES3_Lb0ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
134
                                     CastParameters& params) {
215
134
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
134
        if (from_scale < to_scale) {
218
14
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
14
                                               narrow_integral>(
220
14
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
14
                    min_result, max_result, params);
222
120
        } else if (from_scale == to_scale) {
223
8
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
8
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
8
                    max_result, params);
226
112
        } else {
227
112
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
112
                                              narrow_integral>(
229
112
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
112
                    min_result, max_result, params);
231
112
        }
232
0
        return true;
233
134
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEES3_Lb0ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
108
                                     CastParameters& params) {
215
108
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
108
        if (from_scale < to_scale) {
218
7
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
7
                                               narrow_integral>(
220
7
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
7
                    min_result, max_result, params);
222
101
        } else if (from_scale == to_scale) {
223
19
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
19
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
19
                    max_result, params);
226
82
        } else {
227
82
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
82
                                              narrow_integral>(
229
82
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
82
                    min_result, max_result, params);
231
82
        }
232
0
        return true;
233
108
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEES3_Lb1ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEES3_Lb1ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
84
                                     CastParameters& params) {
215
84
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
84
        if (from_scale < to_scale) {
218
84
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
84
                                               narrow_integral>(
220
84
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
84
                    min_result, max_result, params);
222
84
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
84
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IiEELb0ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
160
                                     CastParameters& params) {
215
160
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
160
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
160
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
160
        } else {
227
160
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
160
                                              narrow_integral>(
229
160
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
160
                    min_result, max_result, params);
231
160
        }
232
0
        return true;
233
160
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IiEELb0ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
459
                                     CastParameters& params) {
215
459
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
459
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
459
        } else if (from_scale == to_scale) {
223
136
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
136
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
136
                    max_result, params);
226
323
        } else {
227
323
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
323
                                              narrow_integral>(
229
323
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
323
                    min_result, max_result, params);
231
323
        }
232
0
        return true;
233
459
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IiEELb1ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IiEELb1ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
126
                                     CastParameters& params) {
215
126
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
126
        if (from_scale < to_scale) {
218
126
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
126
                                               narrow_integral>(
220
126
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
126
                    min_result, max_result, params);
222
126
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
126
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIiEELb0ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
160
                                     CastParameters& params) {
215
160
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
160
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
160
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
160
        } else {
227
160
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
160
                                              narrow_integral>(
229
160
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
160
                    min_result, max_result, params);
231
160
        }
232
0
        return true;
233
160
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIiEELb0ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
479
                                     CastParameters& params) {
215
479
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
479
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
479
        } else if (from_scale == to_scale) {
223
122
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
122
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
122
                    max_result, params);
226
357
        } else {
227
357
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
357
                                              narrow_integral>(
229
357
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
357
                    min_result, max_result, params);
231
357
        }
232
0
        return true;
233
479
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIiEELb1ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIiEELb1ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
126
                                     CastParameters& params) {
215
126
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
126
        if (from_scale < to_scale) {
218
126
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
126
                                               narrow_integral>(
220
126
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
126
                    min_result, max_result, params);
222
126
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
126
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
160
                                     CastParameters& params) {
215
160
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
160
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
160
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
160
        } else {
227
160
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
160
                                              narrow_integral>(
229
160
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
160
                    min_result, max_result, params);
231
160
        }
232
0
        return true;
233
160
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
479
                                     CastParameters& params) {
215
479
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
479
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
479
        } else if (from_scale == to_scale) {
223
122
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
122
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
122
                    max_result, params);
226
357
        } else {
227
357
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
357
                                              narrow_integral>(
229
357
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
357
                    min_result, max_result, params);
231
357
        }
232
0
        return true;
233
479
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
126
                                     CastParameters& params) {
215
126
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
126
        if (from_scale < to_scale) {
218
126
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
126
                                               narrow_integral>(
220
126
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
126
                    min_result, max_result, params);
222
126
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
126
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IlEELb0ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
378
                                     CastParameters& params) {
215
378
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
378
        if (from_scale < to_scale) {
218
112
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
112
                                               narrow_integral>(
220
112
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
112
                    min_result, max_result, params);
222
266
        } else if (from_scale == to_scale) {
223
82
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
82
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
82
                    max_result, params);
226
184
        } else {
227
184
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
184
                                              narrow_integral>(
229
184
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
184
                    min_result, max_result, params);
231
184
        }
232
0
        return true;
233
378
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IlEELb0ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
58
                                     CastParameters& params) {
215
58
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
58
        if (from_scale < to_scale) {
218
58
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
58
                                               narrow_integral>(
220
58
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
58
                    min_result, max_result, params);
222
58
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
58
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IlEELb1ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IlEELb1ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
72
                                     CastParameters& params) {
215
72
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
72
        if (from_scale < to_scale) {
218
72
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
72
                                               narrow_integral>(
220
72
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
72
                    min_result, max_result, params);
222
72
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
72
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEES3_Lb0ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
428
                                     CastParameters& params) {
215
428
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
428
        if (from_scale < to_scale) {
218
46
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
46
                                               narrow_integral>(
220
46
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
46
                    min_result, max_result, params);
222
382
        } else if (from_scale == to_scale) {
223
30
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
30
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
30
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
428
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEES3_Lb0ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
182
                                     CastParameters& params) {
215
182
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
182
        if (from_scale < to_scale) {
218
44
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
44
                                               narrow_integral>(
220
44
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
44
                    min_result, max_result, params);
222
138
        } else if (from_scale == to_scale) {
223
42
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
42
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
42
                    max_result, params);
226
96
        } else {
227
96
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
96
                                              narrow_integral>(
229
96
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
96
                    min_result, max_result, params);
231
96
        }
232
0
        return true;
233
182
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEES3_Lb1ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEES3_Lb1ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
210
                                     CastParameters& params) {
215
210
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
210
        if (from_scale < to_scale) {
218
210
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
210
                                               narrow_integral>(
220
210
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
210
                    min_result, max_result, params);
222
210
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
210
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIlEELb0ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
288
                                     CastParameters& params) {
215
288
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
288
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
288
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
288
        } else {
227
288
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
288
                                              narrow_integral>(
229
288
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
288
                    min_result, max_result, params);
231
288
        }
232
0
        return true;
233
288
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIlEELb0ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
532
                                     CastParameters& params) {
215
532
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
532
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
532
        } else if (from_scale == to_scale) {
223
182
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
182
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
182
                    max_result, params);
226
350
        } else {
227
350
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
350
                                              narrow_integral>(
229
350
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
350
                    min_result, max_result, params);
231
350
        }
232
0
        return true;
233
532
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIlEELb1ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIlEELb1ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
224
                                     CastParameters& params) {
215
224
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
224
        if (from_scale < to_scale) {
218
224
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
224
                                               narrow_integral>(
220
224
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
224
                    min_result, max_result, params);
222
224
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
224
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
288
                                     CastParameters& params) {
215
288
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
288
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
288
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
288
        } else {
227
288
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
288
                                              narrow_integral>(
229
288
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
288
                    min_result, max_result, params);
231
288
        }
232
0
        return true;
233
288
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
552
                                     CastParameters& params) {
215
552
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
552
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
552
        } else if (from_scale == to_scale) {
223
168
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
168
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
168
                    max_result, params);
226
384
        } else {
227
384
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
384
                                              narrow_integral>(
229
384
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
384
                    min_result, max_result, params);
231
384
        }
232
0
        return true;
233
552
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
224
                                     CastParameters& params) {
215
224
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
224
        if (from_scale < to_scale) {
218
224
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
224
                                               narrow_integral>(
220
224
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
224
                    min_result, max_result, params);
222
224
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
224
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS_12Decimal128V3ELb0ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
378
                                     CastParameters& params) {
215
378
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
378
        if (from_scale < to_scale) {
218
120
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
120
                                               narrow_integral>(
220
120
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
120
                    min_result, max_result, params);
222
258
        } else if (from_scale == to_scale) {
223
74
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
74
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
74
                    max_result, params);
226
184
        } else {
227
184
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
184
                                              narrow_integral>(
229
184
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
184
                    min_result, max_result, params);
231
184
        }
232
0
        return true;
233
378
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS_12Decimal128V3ELb0ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
65
                                     CastParameters& params) {
215
65
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
65
        if (from_scale < to_scale) {
218
65
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
65
                                               narrow_integral>(
220
65
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
65
                    min_result, max_result, params);
222
65
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
65
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS_12Decimal128V3ELb1ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS_12Decimal128V3ELb1ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
65
                                     CastParameters& params) {
215
65
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
65
        if (from_scale < to_scale) {
218
65
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
65
                                               narrow_integral>(
220
65
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
65
                    min_result, max_result, params);
222
65
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
65
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS_12Decimal128V3ELb0ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
656
                                     CastParameters& params) {
215
656
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
656
        if (from_scale < to_scale) {
218
176
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
176
                                               narrow_integral>(
220
176
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
176
                    min_result, max_result, params);
222
480
        } else if (from_scale == to_scale) {
223
128
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
128
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
128
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
656
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS_12Decimal128V3ELb0ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
116
                                     CastParameters& params) {
215
116
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
116
        if (from_scale < to_scale) {
218
116
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
116
                                               narrow_integral>(
220
116
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
116
                    min_result, max_result, params);
222
116
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
116
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS_12Decimal128V3ELb1ELb0ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS_12Decimal128V3ELb1ELb1ES4_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
116
                                     CastParameters& params) {
215
116
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
116
        if (from_scale < to_scale) {
218
116
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
116
                                               narrow_integral>(
220
116
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
116
                    min_result, max_result, params);
222
116
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
116
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ES2_Lb0ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
429
                                     CastParameters& params) {
215
429
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
429
        if (from_scale < to_scale) {
218
46
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
46
                                               narrow_integral>(
220
46
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
46
                    min_result, max_result, params);
222
383
        } else if (from_scale == to_scale) {
223
31
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
31
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
31
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
429
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ES2_Lb0ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
208
                                     CastParameters& params) {
215
208
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
208
        if (from_scale < to_scale) {
218
70
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
70
                                               narrow_integral>(
220
70
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
70
                    min_result, max_result, params);
222
138
        } else if (from_scale == to_scale) {
223
42
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
42
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
42
                    max_result, params);
226
96
        } else {
227
96
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
96
                                              narrow_integral>(
229
96
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
96
                    min_result, max_result, params);
231
96
        }
232
0
        return true;
233
208
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ES2_Lb1ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ES2_Lb1ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
184
                                     CastParameters& params) {
215
184
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
184
        if (from_scale < to_scale) {
218
184
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
184
                                               narrow_integral>(
220
184
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
184
                    min_result, max_result, params);
222
184
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
184
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
288
                                     CastParameters& params) {
215
288
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
288
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
288
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
288
        } else {
227
288
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
288
                                              narrow_integral>(
229
288
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
288
                    min_result, max_result, params);
231
288
        }
232
0
        return true;
233
288
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
532
                                     CastParameters& params) {
215
532
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
532
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
532
        } else if (from_scale == to_scale) {
223
182
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
182
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
182
                    max_result, params);
226
350
        } else {
227
350
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
350
                                              narrow_integral>(
229
350
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
350
                    min_result, max_result, params);
231
350
        }
232
0
        return true;
233
532
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
224
                                     CastParameters& params) {
215
224
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
224
        if (from_scale < to_scale) {
218
224
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
224
                                               narrow_integral>(
220
224
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
224
                    min_result, max_result, params);
222
224
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
224
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
378
                                     CastParameters& params) {
215
378
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
378
        if (from_scale < to_scale) {
218
120
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
120
                                               narrow_integral>(
220
120
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
120
                    min_result, max_result, params);
222
258
        } else if (from_scale == to_scale) {
223
74
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
74
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
74
                    max_result, params);
226
184
        } else {
227
184
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
184
                                              narrow_integral>(
229
184
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
184
                    min_result, max_result, params);
231
184
        }
232
0
        return true;
233
378
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
65
                                     CastParameters& params) {
215
65
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
65
        if (from_scale < to_scale) {
218
65
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
65
                                               narrow_integral>(
220
65
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
65
                    min_result, max_result, params);
222
65
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
65
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
65
                                     CastParameters& params) {
215
65
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
65
        if (from_scale < to_scale) {
218
65
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
65
                                               narrow_integral>(
220
65
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
65
                    min_result, max_result, params);
222
65
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
65
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
656
                                     CastParameters& params) {
215
656
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
656
        if (from_scale < to_scale) {
218
184
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
184
                                               narrow_integral>(
220
184
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
184
                    min_result, max_result, params);
222
472
        } else if (from_scale == to_scale) {
223
120
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
120
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
120
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
656
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
116
                                     CastParameters& params) {
215
116
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
116
        if (from_scale < to_scale) {
218
116
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
116
                                               narrow_integral>(
220
116
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
116
                    min_result, max_result, params);
222
116
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
116
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
116
                                     CastParameters& params) {
215
116
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
116
        if (from_scale < to_scale) {
218
116
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
116
                                               narrow_integral>(
220
116
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
116
                    min_result, max_result, params);
222
116
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
116
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
656
                                     CastParameters& params) {
215
656
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
656
        if (from_scale < to_scale) {
218
176
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
176
                                               narrow_integral>(
220
176
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
176
                    min_result, max_result, params);
222
480
        } else if (from_scale == to_scale) {
223
128
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
128
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
128
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
656
    }
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
109
                                     CastParameters& params) {
215
109
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
109
        if (from_scale < to_scale) {
218
109
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
109
                                               narrow_integral>(
220
109
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
109
                    min_result, max_result, params);
222
109
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
109
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
123
                                     CastParameters& params) {
215
123
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
123
        if (from_scale < to_scale) {
218
123
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
123
                                               narrow_integral>(
220
123
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
123
                    min_result, max_result, params);
222
123
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
123
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
428
                                     CastParameters& params) {
215
428
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
428
        if (from_scale < to_scale) {
218
46
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
46
                                               narrow_integral>(
220
46
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
46
                    min_result, max_result, params);
222
382
        } else if (from_scale == to_scale) {
223
30
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
30
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
30
                    max_result, params);
226
352
        } else {
227
352
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
352
                                              narrow_integral>(
229
352
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
352
                    min_result, max_result, params);
231
352
        }
232
0
        return true;
233
428
    }
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
182
                                     CastParameters& params) {
215
182
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
182
        if (from_scale < to_scale) {
218
44
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
44
                                               narrow_integral>(
220
44
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
44
                    min_result, max_result, params);
222
138
        } else if (from_scale == to_scale) {
223
42
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
42
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
42
                    max_result, params);
226
96
        } else {
227
96
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
96
                                              narrow_integral>(
229
96
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
96
                    min_result, max_result, params);
231
96
        }
232
0
        return true;
233
182
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
210
                                     CastParameters& params) {
215
210
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
210
        if (from_scale < to_scale) {
218
210
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
210
                                               narrow_integral>(
220
210
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
210
                    min_result, max_result, params);
222
210
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
210
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
36
                                     CastParameters& params) {
215
36
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
36
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
36
        } else if (from_scale == to_scale) {
223
4
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
4
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
4
                    max_result, params);
226
32
        } else {
227
32
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
32
                                              narrow_integral>(
229
32
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
32
                    min_result, max_result, params);
231
32
        }
232
0
        return true;
233
36
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
470
                                     CastParameters& params) {
215
470
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
470
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
470
        } else if (from_scale == to_scale) {
223
35
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
35
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
35
                    max_result, params);
226
435
        } else {
227
435
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
435
                                              narrow_integral>(
229
435
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
435
                    min_result, max_result, params);
231
435
        }
232
0
        return true;
233
470
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
131
                                     CastParameters& params) {
215
131
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
131
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
131
        } else if (from_scale == to_scale) {
223
7
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
7
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
7
                    max_result, params);
226
124
        } else {
227
124
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
124
                                              narrow_integral>(
229
124
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
124
                    min_result, max_result, params);
231
124
        }
232
0
        return true;
233
131
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
414
                                     CastParameters& params) {
215
414
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
414
        if (from_scale < to_scale) {
218
0
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
0
                                               narrow_integral>(
220
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
0
                    min_result, max_result, params);
222
414
        } else if (from_scale == to_scale) {
223
60
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
60
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
60
                    max_result, params);
226
354
        } else {
227
354
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
354
                                              narrow_integral>(
229
354
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
354
                    min_result, max_result, params);
231
354
        }
232
0
        return true;
233
414
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb0ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
15
                                     CastParameters& params) {
215
15
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
15
        if (from_scale < to_scale) {
218
15
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
15
                                               narrow_integral>(
220
15
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
15
                    min_result, max_result, params);
222
15
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
15
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb1ES2_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
130
                                     CastParameters& params) {
215
130
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
130
        if (from_scale < to_scale) {
218
130
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
130
                                               narrow_integral>(
220
130
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
130
                    min_result, max_result, params);
222
130
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
130
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
375
                                     CastParameters& params) {
215
375
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
375
        if (from_scale < to_scale) {
218
11
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
11
                                               narrow_integral>(
220
11
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
11
                    min_result, max_result, params);
222
364
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
364
        } else {
227
364
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
364
                                              narrow_integral>(
229
364
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
364
                    min_result, max_result, params);
231
364
        }
232
0
        return true;
233
375
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
145
                                     CastParameters& params) {
215
145
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
145
        if (from_scale < to_scale) {
218
95
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
95
                                               narrow_integral>(
220
95
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
95
                    min_result, max_result, params);
222
95
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
50
        } else {
227
50
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
50
                                              narrow_integral>(
229
50
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
50
                    min_result, max_result, params);
231
50
        }
232
0
        return true;
233
145
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb0ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
11
                                     CastParameters& params) {
215
11
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
11
        if (from_scale < to_scale) {
218
11
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
11
                                               narrow_integral>(
220
11
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
11
                    min_result, max_result, params);
222
11
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
11
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb1ES3_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
95
                                     CastParameters& params) {
215
95
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
95
        if (from_scale < to_scale) {
218
95
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
95
                                               narrow_integral>(
220
95
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
95
                    min_result, max_result, params);
222
95
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
95
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
423
                                     CastParameters& params) {
215
423
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
423
        if (from_scale < to_scale) {
218
11
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
11
                                               narrow_integral>(
220
11
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
11
                    min_result, max_result, params);
222
412
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
412
        } else {
227
412
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
412
                                              narrow_integral>(
229
412
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
412
                    min_result, max_result, params);
231
412
        }
232
0
        return true;
233
423
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
95
                                     CastParameters& params) {
215
95
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
95
        if (from_scale < to_scale) {
218
95
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
95
                                               narrow_integral>(
220
95
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
95
                    min_result, max_result, params);
222
95
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
95
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
11
                                     CastParameters& params) {
215
11
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
11
        if (from_scale < to_scale) {
218
11
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
11
                                               narrow_integral>(
220
11
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
11
                    min_result, max_result, params);
222
11
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
11
    }
_ZN5doris13CastToDecimal13_from_decimalINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES7_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RKNT3_10NativeTypeERNS_14CastParametersE
Line
Count
Source
214
95
                                     CastParameters& params) {
215
95
        using MaxNativeType = typename MaxFieldType::NativeType;
216
217
95
        if (from_scale < to_scale) {
218
95
            return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
219
95
                                               narrow_integral>(
220
95
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
221
95
                    min_result, max_result, params);
222
95
        } else if (from_scale == to_scale) {
223
0
            return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType, narrow_integral>(
224
0
                    from, from_precision, from_scale, to, to_precision, to_scale, min_result,
225
0
                    max_result, params);
226
0
        } else {
227
0
            return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
228
0
                                              narrow_integral>(
229
0
                    from, from_precision, from_scale, to, to_precision, to_scale, scale_multiplier,
230
0
                    min_result, max_result, params);
231
0
        }
232
0
        return true;
233
95
    }
234
235
    template <typename FromCppT, typename ToCppT>
236
        requires(IsDecimalNumber<ToCppT> && IsCppTypeFloat<FromCppT> && !IsDecimal128V2<ToCppT>)
237
    static inline bool _from_float(const FromCppT& from, ToCppT& to, UInt32 to_precision,
238
                                   UInt32 to_scale,
239
                                   const typename ToCppT::NativeType& scale_multiplier,
240
                                   const typename ToCppT::NativeType& min_result,
241
                                   const typename ToCppT::NativeType& max_result,
242
3.35k
                                   CastParameters& params) {
243
3.35k
        if (!std::isfinite(from)) {
244
196
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
196
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
196
                                   "to decimal");
247
196
            return false;
248
196
        }
249
3.15k
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
3.15k
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
3.15k
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
92
            if (params.is_strict) {
253
46
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
46
                                                               to_scale);
255
46
            }
256
92
            return false;
257
92
        }
258
3.06k
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
3.06k
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
3.06k
        return true;
261
3.15k
    }
_ZN5doris13CastToDecimal11_from_floatIdNS_7DecimalIiEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS4_EEEbRKS5_RS4_jjRKNS4_10NativeTypeESB_SB_RNS_14CastParametersE
Line
Count
Source
242
441
                                   CastParameters& params) {
243
441
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
417
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
417
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
417
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
405
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
405
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
405
        return true;
261
417
    }
_ZN5doris13CastToDecimal11_from_floatIfNS_7DecimalIiEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS4_EEEbRKS5_RS4_jjRKNS4_10NativeTypeESB_SB_RNS_14CastParametersE
Line
Count
Source
242
429
                                   CastParameters& params) {
243
429
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
405
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
405
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
405
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
393
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
393
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
393
        return true;
261
405
    }
_ZN5doris13CastToDecimal11_from_floatIdNS_7DecimalIlEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS4_EEEbRKS5_RS4_jjRKNS4_10NativeTypeESB_SB_RNS_14CastParametersE
Line
Count
Source
242
428
                                   CastParameters& params) {
243
428
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
404
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
404
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
404
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
392
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
392
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
392
        return true;
261
404
    }
_ZN5doris13CastToDecimal11_from_floatIfNS_7DecimalIlEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS4_EEEbRKS5_RS4_jjRKNS4_10NativeTypeESB_SB_RNS_14CastParametersE
Line
Count
Source
242
380
                                   CastParameters& params) {
243
380
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
356
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
356
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
356
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
344
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
344
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
344
        return true;
261
356
    }
_ZN5doris13CastToDecimal11_from_floatIdNS_12Decimal128V3EQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS3_EEEbRKS4_RS3_jjRKNS3_10NativeTypeESA_SA_RNS_14CastParametersE
Line
Count
Source
242
372
                                   CastParameters& params) {
243
372
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
348
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
348
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
348
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
336
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
336
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
336
        return true;
261
348
    }
_ZN5doris13CastToDecimal11_from_floatIfNS_12Decimal128V3EQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS3_EEEbRKS4_RS3_jjRKNS3_10NativeTypeESA_SA_RNS_14CastParametersE
Line
Count
Source
242
444
                                   CastParameters& params) {
243
444
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
420
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
420
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
420
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
408
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
408
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
408
        return true;
261
420
    }
_ZN5doris13CastToDecimal11_from_floatIdNS_7DecimalIN4wide7integerILm256EiEEEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS7_EEEbRKS8_RS7_jjRKNS7_10NativeTypeESE_SE_RNS_14CastParametersE
Line
Count
Source
242
436
                                   CastParameters& params) {
243
436
        if (!std::isfinite(from)) {
244
24
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
24
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
24
                                   "to decimal");
247
24
            return false;
248
24
        }
249
412
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
412
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
412
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
12
            if (params.is_strict) {
253
6
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
6
                                                               to_scale);
255
6
            }
256
12
            return false;
257
12
        }
258
400
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
400
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
400
        return true;
261
412
    }
_ZN5doris13CastToDecimal11_from_floatIfNS_7DecimalIN4wide7integerILm256EiEEEEQaaaa15IsDecimalNumberIT0_E14IsCppTypeFloatIT_Ent14IsDecimal128V2IS7_EEEbRKS8_RS7_jjRKNS7_10NativeTypeESE_SE_RNS_14CastParametersE
Line
Count
Source
242
424
                                   CastParameters& params) {
243
424
        if (!std::isfinite(from)) {
244
28
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
245
28
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
246
28
                                   "to decimal");
247
28
            return false;
248
28
        }
249
396
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
250
396
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
251
396
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
252
8
            if (params.is_strict) {
253
4
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
254
4
                                                               to_scale);
255
4
            }
256
8
            return false;
257
8
        }
258
388
        to.value = static_cast<typename ToCppT::NativeType>(static_cast<double>(
259
388
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5)));
260
388
        return true;
261
396
    }
262
263
    template <typename FromCppT, typename ToCppT>
264
        requires(IsDecimal128V2<ToCppT> && IsCppTypeFloat<FromCppT>)
265
    static inline bool _from_float(const FromCppT& from, ToCppT& to, UInt32 to_precision,
266
                                   UInt32 to_scale,
267
                                   const typename ToCppT::NativeType& scale_multiplier,
268
                                   const typename ToCppT::NativeType& min_result,
269
                                   const typename ToCppT::NativeType& max_result,
270
0
                                   CastParameters& params) {
271
0
        if (!std::isfinite(from)) {
272
0
            params.status = Status(ErrorCode::ARITHMETIC_OVERFLOW_ERRROR,
273
0
                                   "Decimal convert overflow. Cannot convert infinity or NaN "
274
0
                                   "to decimal");
275
0
            return false;
276
0
        }
277
0
        using DoubleType = std::conditional_t<IsDecimal256<ToCppT>, long double, double>;
278
0
        DoubleType tmp = from * static_cast<DoubleType>(scale_multiplier);
279
0
        if (tmp <= DoubleType(min_result) || tmp >= DoubleType(max_result)) {
280
0
            if (params.is_strict) {
281
0
                params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, "float/double", to_precision,
282
0
                                                               to_scale);
283
0
            }
284
0
            return false;
285
0
        }
286
0
        to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(static_cast<double>(
287
0
                from * static_cast<DoubleType>(scale_multiplier) + ((from >= 0) ? 0.5 : -0.5))));
288
0
        return true;
289
0
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal11_from_floatIfNS_14DecimalV2ValueEQaa14IsDecimal128V2IT0_E14IsCppTypeFloatIT_EEEbRKS4_RS3_jjRKNS3_10NativeTypeESA_SA_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal11_from_floatIdNS_14DecimalV2ValueEQaa14IsDecimal128V2IT0_E14IsCppTypeFloatIT_EEEbRKS4_RS3_jjRKNS3_10NativeTypeESA_SA_RNS_14CastParametersE
290
291
    template <typename FromCppT, typename ToCppT,
292
              typename MaxFieldType = std::conditional_t<
293
                      (sizeof(FromCppT) == sizeof(ToCppT)) &&
294
                              (std::is_same_v<ToCppT, Decimal128V3> ||
295
                               std::is_same_v<FromCppT, Decimal128V3>),
296
                      Decimal128V3,
297
                      std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)), FromCppT, ToCppT>>>
298
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
299
    static inline bool from_decimal(const FromCppT& from, const UInt32 from_precision,
300
                                    const UInt32 from_scale, UInt32 from_original_precision,
301
                                    UInt32 from_original_scale, ToCppT& to, UInt32 to_precision,
302
                                    UInt32 to_scale, CastParameters& params) {
303
        return _from_decimalv2<FromCppT, ToCppT, MaxFieldType>(
304
                from, from_precision, from_scale, from_original_precision, from_original_scale, to,
305
                to_precision, to_scale, params);
306
    }
307
308
    template <typename FromCppT, typename ToCppT,
309
              typename MaxFieldType = std::conditional_t<
310
                      (sizeof(FromCppT) == sizeof(ToCppT)) &&
311
                              (std::is_same_v<ToCppT, Decimal128V3> ||
312
                               std::is_same_v<FromCppT, Decimal128V3>),
313
                      Decimal128V3,
314
                      std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)), FromCppT, ToCppT>>>
315
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
316
    static inline bool _from_decimalv2(const FromCppT& from, const UInt32 from_precision,
317
                                       const UInt32 from_scale, UInt32 from_original_precision,
318
                                       UInt32 from_original_scale, ToCppT& to, UInt32 to_precision,
319
                                       UInt32 to_scale, CastParameters& params) {
320
        using MaxNativeType = typename MaxFieldType::NativeType;
321
322
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
323
        auto to_max_int_digit_count = to_precision - to_scale;
324
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
325
                               (to_max_int_digit_count == from_max_int_digit_count &&
326
                                to_scale < from_original_scale);
327
328
        constexpr UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToCppT::NativeType>();
329
        bool multiply_may_overflow = false;
330
        if (to_scale > from_scale) {
331
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
332
        }
333
334
        typename ToCppT::NativeType max_result =
335
                DataTypeDecimal<ToCppT::PType>::get_max_digits_number(to_precision);
336
        typename ToCppT::NativeType min_result = -max_result;
337
338
        return std::visit(
339
                [&](auto multiply_may_overflow, auto narrow_integral) {
340
                    if (from_scale < to_scale) {
341
                        MaxNativeType multiplier =
342
                                DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(
343
                                        to_scale - from_scale);
344
                        return _from_decimal_smaller_scale<FromCppT, ToCppT, multiply_may_overflow,
345
                                                           narrow_integral>(
346
                                from, from_precision, from_scale, to, to_precision, to_scale,
347
                                multiplier, min_result, max_result, params);
348
                    } else if (from_scale == to_scale) {
349
                        return _from_decimal_same_scale<FromCppT, ToCppT, MaxNativeType,
350
                                                        narrow_integral>(
351
                                from, from_precision, from_scale, to, to_precision, to_scale,
352
                                min_result, max_result, params);
353
                    } else {
354
                        MaxNativeType multiplier =
355
                                DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(
356
                                        from_scale - to_scale);
357
                        return _from_decimal_bigger_scale<FromCppT, ToCppT, multiply_may_overflow,
358
                                                          narrow_integral>(
359
                                from, from_precision, from_scale, to, to_precision, to_scale,
360
                                multiplier, min_result, max_result, params);
361
                    }
362
                    return true;
363
                },
364
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral));
365
    }
366
367
    template <typename FromCppT, typename ToCppT, bool multiply_may_overflow, bool narrow_integral,
368
              typename MaxNativeType =
369
                      std::conditional_t<(sizeof(FromCppT) > sizeof(typename ToCppT::NativeType)),
370
                                         FromCppT, typename ToCppT::NativeType>>
371
        requires(IsDecimalNumber<ToCppT> && !IsDecimal128V2<ToCppT> &&
372
                 (IsCppTypeInt<FromCppT> || std::is_same_v<FromCppT, UInt8>))
373
    static inline bool _from_int(const FromCppT& from, ToCppT& to, UInt32 precision, UInt32 scale,
374
                                 const MaxNativeType& scale_multiplier,
375
                                 const typename ToCppT::NativeType& min_result,
376
                                 const typename ToCppT::NativeType& max_result,
377
3.33k
                                 CastParameters& params) {
378
3.33k
        MaxNativeType tmp;
379
3.33k
        if constexpr (multiply_may_overflow) {
380
1.05k
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
154
                if (params.is_strict) {
382
76
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
76
                                                                   precision, scale);
384
76
                }
385
154
                return false;
386
154
            }
387
901
            if constexpr (narrow_integral) {
388
901
                if (tmp < min_result || tmp > max_result) {
389
177
                    if (params.is_strict) {
390
88
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
88
                                from, int_type_name<FromCppT>, precision, scale);
392
88
                    }
393
177
                    return false;
394
177
                }
395
901
            }
396
724
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
2.28k
        } else {
398
2.28k
            tmp = scale_multiplier * from;
399
2.28k
            if constexpr (narrow_integral) {
400
1.42k
                if (tmp < min_result || tmp > max_result) {
401
433
                    if (params.is_strict) {
402
216
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
216
                                from, int_type_name<FromCppT>, precision, scale);
404
216
                    }
405
433
                    return false;
406
433
                }
407
1.42k
            }
408
988
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
2.28k
        }
410
411
0
        return true;
412
3.33k
    }
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIiEELb0ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
10
                                 CastParameters& params) {
378
10
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
10
        } else {
398
10
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
10
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
10
        }
410
411
10
        return true;
412
10
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIiEELb0ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIiEELb1ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIiEELb1ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
4
                                 CastParameters& params) {
378
4
        MaxNativeType tmp;
379
4
        if constexpr (multiply_may_overflow) {
380
4
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
0
                if (params.is_strict) {
382
0
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
0
                                                                   precision, scale);
384
0
                }
385
0
                return false;
386
0
            }
387
4
            if constexpr (narrow_integral) {
388
4
                if (tmp < min_result || tmp > max_result) {
389
2
                    if (params.is_strict) {
390
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
1
                                from, int_type_name<FromCppT>, precision, scale);
392
1
                    }
393
2
                    return false;
394
2
                }
395
4
            }
396
2
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
4
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIiEELb0ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
55
                                 CastParameters& params) {
378
55
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
55
        } else {
398
55
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
55
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
55
        }
410
411
55
        return true;
412
55
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIiEELb0ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
74
                                 CastParameters& params) {
378
74
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
74
        } else {
398
74
            tmp = scale_multiplier * from;
399
74
            if constexpr (narrow_integral) {
400
74
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
74
            }
408
50
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
74
        }
410
411
0
        return true;
412
74
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIiEELb1ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIiEELb1ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIiEELb0ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
36
                                 CastParameters& params) {
378
36
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
36
        } else {
398
36
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
36
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
36
        }
410
411
36
        return true;
412
36
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIiEELb0ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
109
                                 CastParameters& params) {
378
109
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
109
        } else {
398
109
            tmp = scale_multiplier * from;
399
109
            if constexpr (narrow_integral) {
400
109
                if (tmp < min_result || tmp > max_result) {
401
33
                    if (params.is_strict) {
402
16
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
16
                                from, int_type_name<FromCppT>, precision, scale);
404
16
                    }
405
33
                    return false;
406
33
                }
407
109
            }
408
76
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
109
        }
410
411
0
        return true;
412
109
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIiEELb1ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIiEELb1ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIiEELb0ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIiEELb0ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIiEELb1ELb0EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIiEELb1ELb1EiQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
109
                                 CastParameters& params) {
378
109
        MaxNativeType tmp;
379
109
        if constexpr (multiply_may_overflow) {
380
109
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
17
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
17
                return false;
386
17
            }
387
92
            if constexpr (narrow_integral) {
388
92
                if (tmp < min_result || tmp > max_result) {
389
16
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
16
                    return false;
394
16
                }
395
92
            }
396
76
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
109
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIiEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIiEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIiEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIiEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
109
                                 CastParameters& params) {
378
109
        MaxNativeType tmp;
379
109
        if constexpr (multiply_may_overflow) {
380
109
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
17
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
17
                return false;
386
17
            }
387
92
            if constexpr (narrow_integral) {
388
92
                if (tmp < min_result || tmp > max_result) {
389
16
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
16
                    return false;
394
16
                }
395
92
            }
396
76
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
109
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_7DecimalIiEELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIiEELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_7DecimalIiEELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIiEELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
109
                                 CastParameters& params) {
378
109
        MaxNativeType tmp;
379
109
        if constexpr (multiply_may_overflow) {
380
109
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
16
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
16
                return false;
386
16
            }
387
93
            if constexpr (narrow_integral) {
388
93
                if (tmp < min_result || tmp > max_result) {
389
17
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
17
                    return false;
394
17
                }
395
93
            }
396
76
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
109
    }
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIlEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
8
                                 CastParameters& params) {
378
8
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
8
        } else {
398
8
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
8
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
8
        }
410
411
8
        return true;
412
8
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIlEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIlEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIlEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
4
                                 CastParameters& params) {
378
4
        MaxNativeType tmp;
379
4
        if constexpr (multiply_may_overflow) {
380
4
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
0
                if (params.is_strict) {
382
0
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
0
                                                                   precision, scale);
384
0
                }
385
0
                return false;
386
0
            }
387
4
            if constexpr (narrow_integral) {
388
4
                if (tmp < min_result || tmp > max_result) {
389
2
                    if (params.is_strict) {
390
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
1
                                from, int_type_name<FromCppT>, precision, scale);
392
1
                    }
393
2
                    return false;
394
2
                }
395
4
            }
396
2
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
4
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIlEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIlEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIlEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIlEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIlEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIlEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIlEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIlEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIlEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
18
                                 CastParameters& params) {
378
18
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
18
        } else {
398
18
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
18
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
18
        }
410
411
18
        return true;
412
18
    }
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIlEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
112
                                 CastParameters& params) {
378
112
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
112
        } else {
398
112
            tmp = scale_multiplier * from;
399
112
            if constexpr (narrow_integral) {
400
112
                if (tmp < min_result || tmp > max_result) {
401
32
                    if (params.is_strict) {
402
16
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
16
                                from, int_type_name<FromCppT>, precision, scale);
404
16
                    }
405
32
                    return false;
406
32
                }
407
112
            }
408
80
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
112
        }
410
411
0
        return true;
412
112
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIlEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIlEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
56
                                 CastParameters& params) {
378
56
        MaxNativeType tmp;
379
56
        if constexpr (multiply_may_overflow) {
380
56
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
52
            if constexpr (narrow_integral) {
388
52
                if (tmp < min_result || tmp > max_result) {
389
12
                    if (params.is_strict) {
390
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
6
                                from, int_type_name<FromCppT>, precision, scale);
392
6
                    }
393
12
                    return false;
394
12
                }
395
52
            }
396
40
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
56
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIlEELb0ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIlEELb0ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIlEELb1ELb0ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIlEELb1ELb1ElQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
112
                                 CastParameters& params) {
378
112
        MaxNativeType tmp;
379
112
        if constexpr (multiply_may_overflow) {
380
112
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
16
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
16
                return false;
386
16
            }
387
96
            if constexpr (narrow_integral) {
388
96
                if (tmp < min_result || tmp > max_result) {
389
16
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
16
                    return false;
394
16
                }
395
96
            }
396
80
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
112
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_7DecimalIlEELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIlEELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_7DecimalIlEELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIlEELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS4_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS5_hEEEbRKS5_RS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
377
112
                                 CastParameters& params) {
378
112
        MaxNativeType tmp;
379
112
        if constexpr (multiply_may_overflow) {
380
112
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
16
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
16
                return false;
386
16
            }
387
96
            if constexpr (narrow_integral) {
388
96
                if (tmp < min_result || tmp > max_result) {
389
16
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
16
                    return false;
394
16
                }
395
96
            }
396
80
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
112
    }
_ZN5doris13CastToDecimal9_from_intIhNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
8
                                 CastParameters& params) {
378
8
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
8
        } else {
398
8
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
8
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
8
        }
410
411
8
        return true;
412
8
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIhNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
4
                                 CastParameters& params) {
378
4
        MaxNativeType tmp;
379
4
        if constexpr (multiply_may_overflow) {
380
4
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
0
                if (params.is_strict) {
382
0
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
0
                                                                   precision, scale);
384
0
                }
385
0
                return false;
386
0
            }
387
4
            if constexpr (narrow_integral) {
388
4
                if (tmp < min_result || tmp > max_result) {
389
2
                    if (params.is_strict) {
390
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
1
                                from, int_type_name<FromCppT>, precision, scale);
392
1
                    }
393
2
                    return false;
394
2
                }
395
4
            }
396
2
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
4
    }
_ZN5doris13CastToDecimal9_from_intIaNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIaNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIaNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIsNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIsNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIsNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIiNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIiNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIiNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIlNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
54
                                 CastParameters& params) {
378
54
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
54
        } else {
398
54
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
54
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
54
        }
410
411
54
        return true;
412
54
    }
_ZN5doris13CastToDecimal9_from_intIlNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
78
                                 CastParameters& params) {
378
78
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
78
        } else {
398
78
            tmp = scale_multiplier * from;
399
78
            if constexpr (narrow_integral) {
400
78
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
78
            }
408
54
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
78
        }
410
411
0
        return true;
412
78
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_12Decimal128V3ELb0ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_12Decimal128V3ELb0ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
90
                                 CastParameters& params) {
378
90
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
90
        } else {
398
90
            tmp = scale_multiplier * from;
399
90
            if constexpr (narrow_integral) {
400
90
                if (tmp < min_result || tmp > max_result) {
401
24
                    if (params.is_strict) {
402
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
12
                                from, int_type_name<FromCppT>, precision, scale);
404
12
                    }
405
24
                    return false;
406
24
                }
407
90
            }
408
66
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
90
        }
410
411
0
        return true;
412
90
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_12Decimal128V3ELb1ELb0EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_12Decimal128V3ELb1ELb1EnQaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS3_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
377
112
                                 CastParameters& params) {
378
112
        MaxNativeType tmp;
379
112
        if constexpr (multiply_may_overflow) {
380
112
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
16
                if (params.is_strict) {
382
8
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
8
                                                                   precision, scale);
384
8
                }
385
16
                return false;
386
16
            }
387
96
            if constexpr (narrow_integral) {
388
96
                if (tmp < min_result || tmp > max_result) {
389
16
                    if (params.is_strict) {
390
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
8
                                from, int_type_name<FromCppT>, precision, scale);
392
8
                    }
393
16
                    return false;
394
16
                }
395
96
            }
396
80
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
112
    }
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
8
                                 CastParameters& params) {
378
8
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
8
        } else {
398
8
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
8
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
8
        }
410
411
8
        return true;
412
8
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIhNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
4
                                 CastParameters& params) {
378
4
        MaxNativeType tmp;
379
4
        if constexpr (multiply_may_overflow) {
380
4
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
0
                if (params.is_strict) {
382
0
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
0
                                                                   precision, scale);
384
0
                }
385
0
                return false;
386
0
            }
387
4
            if constexpr (narrow_integral) {
388
4
                if (tmp < min_result || tmp > max_result) {
389
2
                    if (params.is_strict) {
390
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
1
                                from, int_type_name<FromCppT>, precision, scale);
392
1
                    }
393
2
                    return false;
394
2
                }
395
4
            }
396
2
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
4
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIaNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIsNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIiNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
72
                                 CastParameters& params) {
378
72
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
72
        } else {
398
72
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
72
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
72
        }
410
411
72
        return true;
412
72
    }
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
44
                                 CastParameters& params) {
378
44
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
44
        } else {
398
44
            tmp = scale_multiplier * from;
399
44
            if constexpr (narrow_integral) {
400
44
                if (tmp < min_result || tmp > max_result) {
401
16
                    if (params.is_strict) {
402
8
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
8
                                from, int_type_name<FromCppT>, precision, scale);
404
8
                    }
405
16
                    return false;
406
16
                }
407
44
            }
408
28
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
44
        }
410
411
0
        return true;
412
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intIlNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
22
                                 CastParameters& params) {
378
22
        MaxNativeType tmp;
379
22
        if constexpr (multiply_may_overflow) {
380
22
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
18
            if constexpr (narrow_integral) {
388
18
                if (tmp < min_result || tmp > max_result) {
389
4
                    if (params.is_strict) {
390
2
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
2
                                from, int_type_name<FromCppT>, precision, scale);
392
2
                    }
393
4
                    return false;
394
4
                }
395
18
            }
396
14
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
22
    }
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
18
                                 CastParameters& params) {
378
18
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
18
        } else {
398
18
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
18
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
18
        }
410
411
18
        return true;
412
18
    }
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
112
                                 CastParameters& params) {
378
112
        MaxNativeType tmp;
379
        if constexpr (multiply_may_overflow) {
380
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
                if (params.is_strict) {
382
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
                                                                   precision, scale);
384
                }
385
                return false;
386
            }
387
            if constexpr (narrow_integral) {
388
                if (tmp < min_result || tmp > max_result) {
389
                    if (params.is_strict) {
390
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
                                from, int_type_name<FromCppT>, precision, scale);
392
                    }
393
                    return false;
394
                }
395
            }
396
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
112
        } else {
398
112
            tmp = scale_multiplier * from;
399
112
            if constexpr (narrow_integral) {
400
112
                if (tmp < min_result || tmp > max_result) {
401
32
                    if (params.is_strict) {
402
16
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
16
                                from, int_type_name<FromCppT>, precision, scale);
404
16
                    }
405
32
                    return false;
406
32
                }
407
112
            }
408
80
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
112
        }
410
411
0
        return true;
412
112
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal9_from_intInNS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES5_Qaaaa15IsDecimalNumberIT0_Ent14IsDecimal128V2IS7_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS8_hEEEbRKS8_RS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
377
56
                                 CastParameters& params) {
378
56
        MaxNativeType tmp;
379
56
        if constexpr (multiply_may_overflow) {
380
56
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
381
4
                if (params.is_strict) {
382
2
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
383
2
                                                                   precision, scale);
384
2
                }
385
4
                return false;
386
4
            }
387
52
            if constexpr (narrow_integral) {
388
52
                if (tmp < min_result || tmp > max_result) {
389
12
                    if (params.is_strict) {
390
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
391
6
                                from, int_type_name<FromCppT>, precision, scale);
392
6
                    }
393
12
                    return false;
394
12
                }
395
52
            }
396
40
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
397
        } else {
398
            tmp = scale_multiplier * from;
399
            if constexpr (narrow_integral) {
400
                if (tmp < min_result || tmp > max_result) {
401
                    if (params.is_strict) {
402
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
403
                                from, int_type_name<FromCppT>, precision, scale);
404
                    }
405
                    return false;
406
                }
407
            }
408
            to.value = static_cast<typename ToCppT::NativeType>(tmp);
409
        }
410
411
0
        return true;
412
56
    }
413
414
    template <typename FromCppT, typename ToCppT, bool multiply_may_overflow, bool narrow_integral,
415
              typename MaxNativeType =
416
                      std::conditional_t<(sizeof(FromCppT) > sizeof(typename ToCppT::NativeType)),
417
                                         FromCppT, typename ToCppT::NativeType>>
418
        requires(IsDecimalV2<ToCppT> && (IsCppTypeInt<FromCppT> || std::is_same_v<FromCppT, UInt8>))
419
    static inline bool _from_int(const FromCppT& from, ToCppT& to, UInt32 precision, UInt32 scale,
420
                                 const MaxNativeType& scale_multiplier,
421
                                 const typename ToCppT::NativeType& min_result,
422
                                 const typename ToCppT::NativeType& max_result,
423
6
                                 CastParameters& params) {
424
6
        MaxNativeType tmp;
425
6
        if constexpr (multiply_may_overflow) {
426
0
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
427
0
                if (params.is_strict) {
428
0
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
429
0
                                                                   precision, scale);
430
0
                }
431
0
                return false;
432
0
            }
433
0
            if constexpr (narrow_integral) {
434
0
                if (tmp < min_result || tmp > max_result) {
435
0
                    if (params.is_strict) {
436
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
437
0
                                from, int_type_name<FromCppT>, precision, scale);
438
0
                    }
439
0
                    return false;
440
0
                }
441
0
            }
442
0
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
443
6
        } else {
444
6
            tmp = scale_multiplier * from;
445
6
            if constexpr (narrow_integral) {
446
4
                if (tmp < min_result || tmp > max_result) {
447
2
                    if (params.is_strict) {
448
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
449
1
                                from, int_type_name<FromCppT>, precision, scale);
450
1
                    }
451
2
                    return false;
452
2
                }
453
4
            }
454
2
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
455
6
        }
456
457
0
        return true;
458
6
    }
_ZN5doris13CastToDecimal9_from_intIhNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
423
2
                                 CastParameters& params) {
424
2
        MaxNativeType tmp;
425
        if constexpr (multiply_may_overflow) {
426
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
427
                if (params.is_strict) {
428
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
429
                                                                   precision, scale);
430
                }
431
                return false;
432
            }
433
            if constexpr (narrow_integral) {
434
                if (tmp < min_result || tmp > max_result) {
435
                    if (params.is_strict) {
436
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
437
                                from, int_type_name<FromCppT>, precision, scale);
438
                    }
439
                    return false;
440
                }
441
            }
442
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
443
2
        } else {
444
2
            tmp = scale_multiplier * from;
445
            if constexpr (narrow_integral) {
446
                if (tmp < min_result || tmp > max_result) {
447
                    if (params.is_strict) {
448
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
449
                                from, int_type_name<FromCppT>, precision, scale);
450
                    }
451
                    return false;
452
                }
453
            }
454
2
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
455
2
        }
456
457
2
        return true;
458
2
    }
_ZN5doris13CastToDecimal9_from_intIhNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
423
4
                                 CastParameters& params) {
424
4
        MaxNativeType tmp;
425
        if constexpr (multiply_may_overflow) {
426
            if (common::mul_overflow(static_cast<MaxNativeType>(from), scale_multiplier, tmp)) {
427
                if (params.is_strict) {
428
                    params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(from, int_type_name<FromCppT>,
429
                                                                   precision, scale);
430
                }
431
                return false;
432
            }
433
            if constexpr (narrow_integral) {
434
                if (tmp < min_result || tmp > max_result) {
435
                    if (params.is_strict) {
436
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
437
                                from, int_type_name<FromCppT>, precision, scale);
438
                    }
439
                    return false;
440
                }
441
            }
442
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
443
4
        } else {
444
4
            tmp = scale_multiplier * from;
445
4
            if constexpr (narrow_integral) {
446
4
                if (tmp < min_result || tmp > max_result) {
447
2
                    if (params.is_strict) {
448
1
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
449
1
                                from, int_type_name<FromCppT>, precision, scale);
450
1
                    }
451
2
                    return false;
452
2
                }
453
4
            }
454
2
            to = DecimalV2Value(static_cast<typename ToCppT::NativeType>(tmp));
455
4
        }
456
457
0
        return true;
458
4
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIhNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIaNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIsNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIiNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intIlNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_14DecimalV2ValueELb0ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_14DecimalV2ValueELb0ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_14DecimalV2ValueELb1ELb0EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal9_from_intInNS_14DecimalV2ValueELb1ELb1EnQaa11IsDecimalV2IT0_Eoo12IsCppTypeIntIT_Esr3stdE9is_same_vIS4_hEEEbRKS4_RS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
459
460
    template <
461
            typename FromCppT, typename ToCppT, bool multiply_may_overflow, bool narrow_integral,
462
            typename MaxNativeType = std::conditional_t<
463
                    (sizeof(FromCppT) == sizeof(ToCppT)) &&
464
                            (std::is_same_v<ToCppT, Decimal128V3> ||
465
                             std::is_same_v<FromCppT, Decimal128V3>),
466
                    Decimal128V3::NativeType,
467
                    std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)),
468
                                       typename FromCppT::NativeType, typename ToCppT::NativeType>>>
469
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
470
    static inline bool _from_decimal_smaller_scale(
471
            const FromCppT& from, const UInt32 precision_from, const UInt32 scale_from, ToCppT& to,
472
            UInt32 precision_to, UInt32 scale_to, const MaxNativeType& scale_multiplier,
473
            const typename ToCppT::NativeType& min_result,
474
4.59k
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
4.59k
        MaxNativeType res;
476
4.59k
        if constexpr (multiply_may_overflow) {
477
2.65k
            if constexpr (IsDecimal128V2<FromCppT>) {
478
357
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
357
                                         res)) {
480
28
                    if (params.is_strict) {
481
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
6
                                decimal_to_string(from.value(), scale_from),
483
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
6
                                precision_to, scale_to);
485
6
                    }
486
28
                    return false;
487
329
                } else {
488
329
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
80
                        if (params.is_strict) {
490
48
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
48
                                    decimal_to_string(from.value(), scale_from),
492
48
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
48
                                    precision_to, scale_to);
494
48
                        }
495
80
                        return false;
496
249
                    } else {
497
249
                        to = ToCppT(res);
498
249
                    }
499
329
                }
500
2.29k
            } else {
501
2.29k
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
2.29k
                                         res)) {
503
359
                    if (params.is_strict) {
504
30
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
30
                                decimal_to_string(from.value, scale_from),
506
30
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
30
                                precision_to, scale_to);
508
30
                    }
509
359
                    return false;
510
1.93k
                } else {
511
1.93k
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
889
                        if (params.is_strict) {
513
594
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
594
                                    decimal_to_string(from.value, scale_from),
515
594
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
594
                                    precision_to, scale_to);
517
594
                        }
518
889
                        return false;
519
1.04k
                    } else {
520
1.04k
                        to = ToCppT(res);
521
1.04k
                    }
522
1.93k
                }
523
2.29k
            }
524
2.65k
        } else {
525
1.94k
            if constexpr (IsDecimal128V2<FromCppT>) {
526
212
                res = from.value() * scale_multiplier;
527
1.73k
            } else {
528
1.73k
                res = from.value * scale_multiplier;
529
1.73k
            }
530
1.94k
            if constexpr (narrow_integral) {
531
884
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
414
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
60
                        if (params.is_strict) {
534
30
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
30
                                    decimal_to_string(from.value(), scale_from),
536
30
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
30
                                    precision_to, scale_to);
538
30
                        }
539
354
                    } else {
540
354
                        if (params.is_strict) {
541
177
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
177
                                    decimal_to_string(from.value, scale_from),
543
177
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
177
                                    precision_to, scale_to);
545
177
                        }
546
354
                    }
547
414
                    return false;
548
414
                }
549
884
            }
550
470
            to = ToCppT(res);
551
1.94k
        }
552
1.29k
        return true;
553
4.59k
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEES3_Lb0ELb0EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
14
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
14
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
14
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
14
            } else {
528
14
                res = from.value * scale_multiplier;
529
14
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
14
            to = ToCppT(res);
551
14
        }
552
14
        return true;
553
14
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEES3_Lb0ELb1EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
7
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
7
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
7
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
7
            } else {
528
7
                res = from.value * scale_multiplier;
529
7
            }
530
7
            if constexpr (narrow_integral) {
531
7
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
6
                    } else {
540
6
                        if (params.is_strict) {
541
3
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
3
                                    decimal_to_string(from.value, scale_from),
543
3
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
3
                                    precision_to, scale_to);
545
3
                        }
546
6
                    }
547
6
                    return false;
548
6
                }
549
7
            }
550
1
            to = ToCppT(res);
551
7
        }
552
0
        return true;
553
7
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEES3_Lb1ELb0EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEES3_Lb1ELb1EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
84
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
84
        MaxNativeType res;
476
84
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
84
            } else {
501
84
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
84
                                         res)) {
503
16
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
16
                    return false;
510
68
                } else {
511
68
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
32
                        if (params.is_strict) {
513
24
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
24
                                    decimal_to_string(from.value, scale_from),
515
24
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
24
                                    precision_to, scale_to);
517
24
                        }
518
32
                        return false;
519
36
                    } else {
520
36
                        to = ToCppT(res);
521
36
                    }
522
68
                }
523
84
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
36
        return true;
553
84
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IiEELb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IiEELb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IiEELb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IiEELb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
126
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
126
        MaxNativeType res;
476
126
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
126
            } else {
501
126
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
126
                                         res)) {
503
14
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
14
                    return false;
510
112
                } else {
511
112
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
58
                        if (params.is_strict) {
513
36
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
36
                                    decimal_to_string(from.value, scale_from),
515
36
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
36
                                    precision_to, scale_to);
517
36
                        }
518
58
                        return false;
519
58
                    } else {
520
54
                        to = ToCppT(res);
521
54
                    }
522
112
                }
523
126
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
54
        return true;
553
126
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIiEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIiEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIiEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIiEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
126
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
126
        MaxNativeType res;
476
126
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
126
            } else {
501
126
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
126
                                         res)) {
503
12
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
12
                    return false;
510
114
                } else {
511
114
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
60
                        if (params.is_strict) {
513
36
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
36
                                    decimal_to_string(from.value, scale_from),
515
36
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
36
                                    precision_to, scale_to);
517
36
                        }
518
60
                        return false;
519
60
                    } else {
520
54
                        to = ToCppT(res);
521
54
                    }
522
114
                }
523
126
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
54
        return true;
553
126
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
126
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
126
        MaxNativeType res;
476
126
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
126
            } else {
501
126
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
126
                                         res)) {
503
12
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
12
                    return false;
510
114
                } else {
511
114
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
60
                        if (params.is_strict) {
513
36
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
36
                                    decimal_to_string(from.value, scale_from),
515
36
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
36
                                    precision_to, scale_to);
517
36
                        }
518
60
                        return false;
519
60
                    } else {
520
54
                        to = ToCppT(res);
521
54
                    }
522
114
                }
523
126
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
54
        return true;
553
126
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IlEELb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
112
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
112
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
112
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
112
            } else {
528
112
                res = from.value * scale_multiplier;
529
112
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
112
            to = ToCppT(res);
551
112
        }
552
112
        return true;
553
112
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IlEELb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
58
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
58
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
58
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
58
            } else {
528
58
                res = from.value * scale_multiplier;
529
58
            }
530
58
            if constexpr (narrow_integral) {
531
58
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
30
                    } else {
540
30
                        if (params.is_strict) {
541
15
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
15
                                    decimal_to_string(from.value, scale_from),
543
15
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
15
                                    precision_to, scale_to);
545
15
                        }
546
30
                    }
547
30
                    return false;
548
30
                }
549
58
            }
550
28
            to = ToCppT(res);
551
58
        }
552
0
        return true;
553
58
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IlEELb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IlEELb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
72
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
72
        MaxNativeType res;
476
72
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
72
            } else {
501
72
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
72
                                         res)) {
503
11
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
11
                    return false;
510
61
                } else {
511
61
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
31
                        if (params.is_strict) {
513
21
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
21
                                    decimal_to_string(from.value, scale_from),
515
21
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
21
                                    precision_to, scale_to);
517
21
                        }
518
31
                        return false;
519
31
                    } else {
520
30
                        to = ToCppT(res);
521
30
                    }
522
61
                }
523
72
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
30
        return true;
553
72
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEES3_Lb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
46
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
46
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
46
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
46
            } else {
528
46
                res = from.value * scale_multiplier;
529
46
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
46
            to = ToCppT(res);
551
46
        }
552
46
        return true;
553
46
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEES3_Lb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
44
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
44
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
44
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
44
            } else {
528
44
                res = from.value * scale_multiplier;
529
44
            }
530
44
            if constexpr (narrow_integral) {
531
44
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
18
                    } else {
540
18
                        if (params.is_strict) {
541
9
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
9
                                    decimal_to_string(from.value, scale_from),
543
9
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
9
                                    precision_to, scale_to);
545
9
                        }
546
18
                    }
547
18
                    return false;
548
18
                }
549
44
            }
550
26
            to = ToCppT(res);
551
44
        }
552
0
        return true;
553
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEES3_Lb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEES3_Lb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
210
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
210
        MaxNativeType res;
476
210
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
210
            } else {
501
210
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
210
                                         res)) {
503
36
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
36
                    return false;
510
174
                } else {
511
174
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
78
                        if (params.is_strict) {
513
57
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
57
                                    decimal_to_string(from.value, scale_from),
515
57
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
57
                                    precision_to, scale_to);
517
57
                        }
518
78
                        return false;
519
96
                    } else {
520
96
                        to = ToCppT(res);
521
96
                    }
522
174
                }
523
210
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
96
        return true;
553
210
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIlEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIlEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIlEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIlEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
224
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
224
        MaxNativeType res;
476
224
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
224
            } else {
501
224
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
224
                                         res)) {
503
20
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
20
                    return false;
510
204
                } else {
511
204
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
100
                        if (params.is_strict) {
513
60
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
60
                                    decimal_to_string(from.value, scale_from),
515
60
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
60
                                    precision_to, scale_to);
517
60
                        }
518
100
                        return false;
519
104
                    } else {
520
104
                        to = ToCppT(res);
521
104
                    }
522
204
                }
523
224
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
104
        return true;
553
224
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
224
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
224
        MaxNativeType res;
476
224
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
224
            } else {
501
224
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
224
                                         res)) {
503
20
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
20
                    return false;
510
204
                } else {
511
204
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
100
                        if (params.is_strict) {
513
60
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
60
                                    decimal_to_string(from.value, scale_from),
515
60
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
60
                                    precision_to, scale_to);
517
60
                        }
518
100
                        return false;
519
104
                    } else {
520
104
                        to = ToCppT(res);
521
104
                    }
522
204
                }
523
224
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
104
        return true;
553
224
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
120
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
120
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
120
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
120
            } else {
528
120
                res = from.value * scale_multiplier;
529
120
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
120
            to = ToCppT(res);
551
120
        }
552
120
        return true;
553
120
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
65
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
65
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
65
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
65
            } else {
528
65
                res = from.value * scale_multiplier;
529
65
            }
530
65
            if constexpr (narrow_integral) {
531
65
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
36
                    } else {
540
36
                        if (params.is_strict) {
541
18
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
18
                                    decimal_to_string(from.value, scale_from),
543
18
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
18
                                    precision_to, scale_to);
545
18
                        }
546
36
                    }
547
36
                    return false;
548
36
                }
549
65
            }
550
29
            to = ToCppT(res);
551
65
        }
552
0
        return true;
553
65
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
65
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
65
        MaxNativeType res;
476
65
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
65
            } else {
501
65
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
65
                                         res)) {
503
20
                    if (params.is_strict) {
504
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
6
                                decimal_to_string(from.value, scale_from),
506
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
6
                                precision_to, scale_to);
508
6
                    }
509
20
                    return false;
510
45
                } else {
511
45
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
16
                        if (params.is_strict) {
513
12
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
12
                                    decimal_to_string(from.value, scale_from),
515
12
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
12
                                    precision_to, scale_to);
517
12
                        }
518
16
                        return false;
519
29
                    } else {
520
29
                        to = ToCppT(res);
521
29
                    }
522
45
                }
523
65
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
29
        return true;
553
65
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
176
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
176
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
176
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
176
            } else {
528
176
                res = from.value * scale_multiplier;
529
176
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
176
            to = ToCppT(res);
551
176
        }
552
176
        return true;
553
176
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
116
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
116
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
116
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
116
            } else {
528
116
                res = from.value * scale_multiplier;
529
116
            }
530
116
            if constexpr (narrow_integral) {
531
116
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
60
                    } else {
540
60
                        if (params.is_strict) {
541
30
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
30
                                    decimal_to_string(from.value, scale_from),
543
30
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
30
                                    precision_to, scale_to);
545
30
                        }
546
60
                    }
547
60
                    return false;
548
60
                }
549
116
            }
550
56
            to = ToCppT(res);
551
116
        }
552
0
        return true;
553
116
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
116
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
116
        MaxNativeType res;
476
116
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
116
            } else {
501
116
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
116
                                         res)) {
503
36
                    if (params.is_strict) {
504
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
12
                                decimal_to_string(from.value, scale_from),
506
12
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
12
                                precision_to, scale_to);
508
12
                    }
509
36
                    return false;
510
80
                } else {
511
80
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
24
                        if (params.is_strict) {
513
18
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
18
                                    decimal_to_string(from.value, scale_from),
515
18
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
18
                                    precision_to, scale_to);
517
18
                        }
518
24
                        return false;
519
56
                    } else {
520
56
                        to = ToCppT(res);
521
56
                    }
522
80
                }
523
116
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
56
        return true;
553
116
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ES2_Lb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
474
46
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
46
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
46
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
46
            } else {
528
46
                res = from.value * scale_multiplier;
529
46
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
46
            to = ToCppT(res);
551
46
        }
552
46
        return true;
553
46
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ES2_Lb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
474
70
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
70
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
70
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
70
            } else {
528
70
                res = from.value * scale_multiplier;
529
70
            }
530
70
            if constexpr (narrow_integral) {
531
70
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
36
                    } else {
540
36
                        if (params.is_strict) {
541
18
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
18
                                    decimal_to_string(from.value, scale_from),
543
18
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
18
                                    precision_to, scale_to);
545
18
                        }
546
36
                    }
547
36
                    return false;
548
36
                }
549
70
            }
550
34
            to = ToCppT(res);
551
70
        }
552
0
        return true;
553
70
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ES2_Lb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ES2_Lb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
474
184
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
184
        MaxNativeType res;
476
184
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
184
            } else {
501
184
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
184
                                         res)) {
503
48
                    if (params.is_strict) {
504
12
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
12
                                decimal_to_string(from.value, scale_from),
506
12
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
12
                                precision_to, scale_to);
508
12
                    }
509
48
                    return false;
510
136
                } else {
511
136
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
48
                        if (params.is_strict) {
513
36
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
36
                                    decimal_to_string(from.value, scale_from),
515
36
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
36
                                    precision_to, scale_to);
517
36
                        }
518
48
                        return false;
519
88
                    } else {
520
88
                        to = ToCppT(res);
521
88
                    }
522
136
                }
523
184
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
88
        return true;
553
184
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
224
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
224
        MaxNativeType res;
476
224
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
224
            } else {
501
224
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
224
                                         res)) {
503
22
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
22
                    return false;
510
202
                } else {
511
202
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
98
                        if (params.is_strict) {
513
60
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
60
                                    decimal_to_string(from.value, scale_from),
515
60
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
60
                                    precision_to, scale_to);
517
60
                        }
518
98
                        return false;
519
104
                    } else {
520
104
                        to = ToCppT(res);
521
104
                    }
522
202
                }
523
224
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
104
        return true;
553
224
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
120
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
120
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
120
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
120
            } else {
528
120
                res = from.value * scale_multiplier;
529
120
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
120
            to = ToCppT(res);
551
120
        }
552
120
        return true;
553
120
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
65
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
65
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
65
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
65
            } else {
528
65
                res = from.value * scale_multiplier;
529
65
            }
530
65
            if constexpr (narrow_integral) {
531
65
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
36
                    } else {
540
36
                        if (params.is_strict) {
541
18
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
18
                                    decimal_to_string(from.value, scale_from),
543
18
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
18
                                    precision_to, scale_to);
545
18
                        }
546
36
                    }
547
36
                    return false;
548
36
                }
549
65
            }
550
29
            to = ToCppT(res);
551
65
        }
552
0
        return true;
553
65
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
65
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
65
        MaxNativeType res;
476
65
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
65
            } else {
501
65
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
65
                                         res)) {
503
12
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
12
                    return false;
510
53
                } else {
511
53
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
24
                        if (params.is_strict) {
513
18
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
18
                                    decimal_to_string(from.value, scale_from),
515
18
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
18
                                    precision_to, scale_to);
517
18
                        }
518
24
                        return false;
519
29
                    } else {
520
29
                        to = ToCppT(res);
521
29
                    }
522
53
                }
523
65
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
29
        return true;
553
65
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
184
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
184
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
184
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
184
            } else {
528
184
                res = from.value * scale_multiplier;
529
184
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
184
            to = ToCppT(res);
551
184
        }
552
184
        return true;
553
184
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
116
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
116
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
116
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
116
            } else {
528
116
                res = from.value * scale_multiplier;
529
116
            }
530
116
            if constexpr (narrow_integral) {
531
116
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
60
                    } else {
540
60
                        if (params.is_strict) {
541
30
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
30
                                    decimal_to_string(from.value, scale_from),
543
30
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
30
                                    precision_to, scale_to);
545
30
                        }
546
60
                    }
547
60
                    return false;
548
60
                }
549
116
            }
550
56
            to = ToCppT(res);
551
116
        }
552
0
        return true;
553
116
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
116
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
116
        MaxNativeType res;
476
116
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
116
            } else {
501
116
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
116
                                         res)) {
503
20
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
20
                    return false;
510
96
                } else {
511
96
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
40
                        if (params.is_strict) {
513
30
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
30
                                    decimal_to_string(from.value, scale_from),
515
30
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
30
                                    precision_to, scale_to);
517
30
                        }
518
40
                        return false;
519
56
                    } else {
520
56
                        to = ToCppT(res);
521
56
                    }
522
96
                }
523
116
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
56
        return true;
553
116
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
176
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
176
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
176
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
176
            } else {
528
176
                res = from.value * scale_multiplier;
529
176
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
176
            to = ToCppT(res);
551
176
        }
552
176
        return true;
553
176
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
109
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
109
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
109
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
109
            } else {
528
109
                res = from.value * scale_multiplier;
529
109
            }
530
109
            if constexpr (narrow_integral) {
531
109
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
54
                    } else {
540
54
                        if (params.is_strict) {
541
27
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
27
                                    decimal_to_string(from.value, scale_from),
543
27
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
27
                                    precision_to, scale_to);
545
27
                        }
546
54
                    }
547
54
                    return false;
548
54
                }
549
109
            }
550
55
            to = ToCppT(res);
551
109
        }
552
0
        return true;
553
109
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
123
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
123
        MaxNativeType res;
476
123
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
123
            } else {
501
123
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
123
                                         res)) {
503
22
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
22
                    return false;
510
101
                } else {
511
101
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
44
                        if (params.is_strict) {
513
33
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
33
                                    decimal_to_string(from.value, scale_from),
515
33
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
33
                                    precision_to, scale_to);
517
33
                        }
518
44
                        return false;
519
57
                    } else {
520
57
                        to = ToCppT(res);
521
57
                    }
522
101
                }
523
123
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
57
        return true;
553
123
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
474
46
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
46
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
46
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
46
            } else {
528
46
                res = from.value * scale_multiplier;
529
46
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
46
            to = ToCppT(res);
551
46
        }
552
46
        return true;
553
46
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
474
44
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
44
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
44
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
44
            } else {
528
44
                res = from.value * scale_multiplier;
529
44
            }
530
44
            if constexpr (narrow_integral) {
531
44
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
18
                    } else {
540
18
                        if (params.is_strict) {
541
9
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
9
                                    decimal_to_string(from.value, scale_from),
543
9
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
9
                                    precision_to, scale_to);
545
9
                        }
546
18
                    }
547
18
                    return false;
548
18
                }
549
44
            }
550
26
            to = ToCppT(res);
551
44
        }
552
0
        return true;
553
44
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
474
210
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
210
        MaxNativeType res;
476
210
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
210
            } else {
501
210
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
210
                                         res)) {
503
38
                    if (params.is_strict) {
504
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
0
                                decimal_to_string(from.value, scale_from),
506
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
0
                                precision_to, scale_to);
508
0
                    }
509
38
                    return false;
510
172
                } else {
511
172
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
76
                        if (params.is_strict) {
513
57
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
57
                                    decimal_to_string(from.value, scale_from),
515
57
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
57
                                    precision_to, scale_to);
517
57
                        }
518
76
                        return false;
519
96
                    } else {
520
96
                        to = ToCppT(res);
521
96
                    }
522
172
                }
523
210
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
96
        return true;
553
210
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
15
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
15
        MaxNativeType res;
476
15
        if constexpr (multiply_may_overflow) {
477
15
            if constexpr (IsDecimal128V2<FromCppT>) {
478
15
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
15
                                         res)) {
480
0
                    if (params.is_strict) {
481
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
0
                                decimal_to_string(from.value(), scale_from),
483
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
0
                                precision_to, scale_to);
485
0
                    }
486
0
                    return false;
487
15
                } else {
488
15
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
0
                        if (params.is_strict) {
490
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
0
                                    decimal_to_string(from.value(), scale_from),
492
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
0
                                    precision_to, scale_to);
494
0
                        }
495
0
                        return false;
496
15
                    } else {
497
15
                        to = ToCppT(res);
498
15
                    }
499
15
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
15
        return true;
553
15
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
474
130
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
130
        MaxNativeType res;
476
130
        if constexpr (multiply_may_overflow) {
477
130
            if constexpr (IsDecimal128V2<FromCppT>) {
478
130
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
130
                                         res)) {
480
0
                    if (params.is_strict) {
481
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
0
                                decimal_to_string(from.value(), scale_from),
483
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
0
                                precision_to, scale_to);
485
0
                    }
486
0
                    return false;
487
130
                } else {
488
130
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
48
                        if (params.is_strict) {
490
24
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
24
                                    decimal_to_string(from.value(), scale_from),
492
24
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
24
                                    precision_to, scale_to);
494
24
                        }
495
48
                        return false;
496
82
                    } else {
497
82
                        to = ToCppT(res);
498
82
                    }
499
130
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
82
        return true;
553
130
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
11
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
11
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
11
        } else {
525
11
            if constexpr (IsDecimal128V2<FromCppT>) {
526
11
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
11
            to = ToCppT(res);
551
11
        }
552
11
        return true;
553
11
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
95
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
95
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
95
        } else {
525
95
            if constexpr (IsDecimal128V2<FromCppT>) {
526
95
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
95
            if constexpr (narrow_integral) {
531
95
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
30
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
30
                        if (params.is_strict) {
534
15
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
15
                                    decimal_to_string(from.value(), scale_from),
536
15
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
15
                                    precision_to, scale_to);
538
15
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
30
                    return false;
548
30
                }
549
95
            }
550
65
            to = ToCppT(res);
551
95
        }
552
0
        return true;
553
95
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
11
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
11
        MaxNativeType res;
476
11
        if constexpr (multiply_may_overflow) {
477
11
            if constexpr (IsDecimal128V2<FromCppT>) {
478
11
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
11
                                         res)) {
480
0
                    if (params.is_strict) {
481
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
0
                                decimal_to_string(from.value(), scale_from),
483
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
0
                                precision_to, scale_to);
485
0
                    }
486
0
                    return false;
487
11
                } else {
488
11
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
0
                        if (params.is_strict) {
490
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
0
                                    decimal_to_string(from.value(), scale_from),
492
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
0
                                    precision_to, scale_to);
494
0
                        }
495
0
                        return false;
496
11
                    } else {
497
11
                        to = ToCppT(res);
498
11
                    }
499
11
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
11
        return true;
553
11
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
474
95
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
95
        MaxNativeType res;
476
95
        if constexpr (multiply_may_overflow) {
477
95
            if constexpr (IsDecimal128V2<FromCppT>) {
478
95
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
95
                                         res)) {
480
18
                    if (params.is_strict) {
481
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
6
                                decimal_to_string(from.value(), scale_from),
483
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
6
                                precision_to, scale_to);
485
6
                    }
486
18
                    return false;
487
77
                } else {
488
77
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
12
                        if (params.is_strict) {
490
9
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
9
                                    decimal_to_string(from.value(), scale_from),
492
9
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
9
                                    precision_to, scale_to);
494
9
                        }
495
12
                        return false;
496
65
                    } else {
497
65
                        to = ToCppT(res);
498
65
                    }
499
77
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
65
        return true;
553
95
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
11
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
11
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
11
        } else {
525
11
            if constexpr (IsDecimal128V2<FromCppT>) {
526
11
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
11
            to = ToCppT(res);
551
11
        }
552
11
        return true;
553
11
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
95
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
95
        MaxNativeType res;
476
        if constexpr (multiply_may_overflow) {
477
            if constexpr (IsDecimal128V2<FromCppT>) {
478
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
                                         res)) {
480
                    if (params.is_strict) {
481
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
                                decimal_to_string(from.value(), scale_from),
483
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
                                precision_to, scale_to);
485
                    }
486
                    return false;
487
                } else {
488
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
                        if (params.is_strict) {
490
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
                                    decimal_to_string(from.value(), scale_from),
492
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
                                    precision_to, scale_to);
494
                        }
495
                        return false;
496
                    } else {
497
                        to = ToCppT(res);
498
                    }
499
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
95
        } else {
525
95
            if constexpr (IsDecimal128V2<FromCppT>) {
526
95
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
95
            if constexpr (narrow_integral) {
531
95
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
30
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
30
                        if (params.is_strict) {
534
15
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
15
                                    decimal_to_string(from.value(), scale_from),
536
15
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
15
                                    precision_to, scale_to);
538
15
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
30
                    return false;
548
30
                }
549
95
            }
550
65
            to = ToCppT(res);
551
95
        }
552
0
        return true;
553
95
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
11
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
11
        MaxNativeType res;
476
11
        if constexpr (multiply_may_overflow) {
477
11
            if constexpr (IsDecimal128V2<FromCppT>) {
478
11
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
11
                                         res)) {
480
0
                    if (params.is_strict) {
481
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
0
                                decimal_to_string(from.value(), scale_from),
483
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
0
                                precision_to, scale_to);
485
0
                    }
486
0
                    return false;
487
11
                } else {
488
11
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
0
                        if (params.is_strict) {
490
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
0
                                    decimal_to_string(from.value(), scale_from),
492
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
0
                                    precision_to, scale_to);
494
0
                        }
495
0
                        return false;
496
11
                    } else {
497
11
                        to = ToCppT(res);
498
11
                    }
499
11
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
11
        return true;
553
11
    }
_ZN5doris13CastToDecimal27_from_decimal_smaller_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
474
95
            const typename ToCppT::NativeType& max_result, CastParameters& params) {
475
95
        MaxNativeType res;
476
95
        if constexpr (multiply_may_overflow) {
477
95
            if constexpr (IsDecimal128V2<FromCppT>) {
478
95
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value()), scale_multiplier,
479
95
                                         res)) {
480
10
                    if (params.is_strict) {
481
0
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
482
0
                                decimal_to_string(from.value(), scale_from),
483
0
                                fmt::format("decimal({}, {})", precision_from, scale_from),
484
0
                                precision_to, scale_to);
485
0
                    }
486
10
                    return false;
487
85
                } else {
488
85
                    if (UNLIKELY(res > max_result || res < -max_result)) {
489
20
                        if (params.is_strict) {
490
15
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
491
15
                                    decimal_to_string(from.value(), scale_from),
492
15
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
493
15
                                    precision_to, scale_to);
494
15
                        }
495
20
                        return false;
496
65
                    } else {
497
65
                        to = ToCppT(res);
498
65
                    }
499
85
                }
500
            } else {
501
                if (common::mul_overflow(static_cast<MaxNativeType>(from.value), scale_multiplier,
502
                                         res)) {
503
                    if (params.is_strict) {
504
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
505
                                decimal_to_string(from.value, scale_from),
506
                                fmt::format("decimal({}, {})", precision_from, scale_from),
507
                                precision_to, scale_to);
508
                    }
509
                    return false;
510
                } else {
511
                    if (UNLIKELY(res > max_result || res < -max_result)) {
512
                        if (params.is_strict) {
513
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
514
                                    decimal_to_string(from.value, scale_from),
515
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
516
                                    precision_to, scale_to);
517
                        }
518
                        return false;
519
                    } else {
520
                        to = ToCppT(res);
521
                    }
522
                }
523
            }
524
        } else {
525
            if constexpr (IsDecimal128V2<FromCppT>) {
526
                res = from.value() * scale_multiplier;
527
            } else {
528
                res = from.value * scale_multiplier;
529
            }
530
            if constexpr (narrow_integral) {
531
                if (UNLIKELY(res > max_result || res < -max_result)) {
532
                    if constexpr (IsDecimal128V2<FromCppT>) {
533
                        if (params.is_strict) {
534
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
535
                                    decimal_to_string(from.value(), scale_from),
536
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
537
                                    precision_to, scale_to);
538
                        }
539
                    } else {
540
                        if (params.is_strict) {
541
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
542
                                    decimal_to_string(from.value, scale_from),
543
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
544
                                    precision_to, scale_to);
545
                        }
546
                    }
547
                    return false;
548
                }
549
            }
550
            to = ToCppT(res);
551
        }
552
65
        return true;
553
95
    }
554
555
    template <typename FromCppT, typename ToCppT, typename ScaleT, bool narrow_integral>
556
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
557
    static inline bool _from_decimal_same_scale(const FromCppT& from, const UInt32 precision_from,
558
                                                const UInt32 scale_from, ToCppT& to,
559
                                                UInt32 precision_to, UInt32 scale_to,
560
                                                const typename ToCppT::NativeType& min_result,
561
                                                const typename ToCppT::NativeType& max_result,
562
1.86k
                                                CastParameters& params) {
563
1.86k
        if constexpr (IsDecimal128V2<FromCppT>) {
564
106
            if constexpr (narrow_integral) {
565
95
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
30
                    if (params.is_strict) {
567
15
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
15
                                decimal_to_string(from.value(), scale_from),
569
15
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
15
                                precision_to, scale_to);
571
15
                    }
572
30
                    return false;
573
30
                }
574
95
            }
575
65
            to = ToCppT(from.value());
576
1.76k
        } else {
577
1.76k
            if constexpr (narrow_integral) {
578
1.05k
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
354
                    if (params.is_strict) {
580
177
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
177
                                decimal_to_string(from.value, scale_from),
582
177
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
177
                                precision_to, scale_to);
584
177
                    }
585
354
                    return false;
586
354
                }
587
1.05k
            }
588
703
            to = ToCppT(from.value);
589
1.76k
        }
590
0
        return true;
591
1.86k
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEES3_iLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Line
Count
Source
562
8
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
8
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
8
            to = ToCppT(from.value);
589
8
        }
590
8
        return true;
591
8
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEES3_iLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Line
Count
Source
562
19
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
19
        } else {
577
19
            if constexpr (narrow_integral) {
578
19
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
12
                    if (params.is_strict) {
580
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
6
                                decimal_to_string(from.value, scale_from),
582
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
6
                                precision_to, scale_to);
584
6
                    }
585
12
                    return false;
586
12
                }
587
19
            }
588
7
            to = ToCppT(from.value);
589
19
        }
590
0
        return true;
591
19
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS2_IiEElLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS2_IiEElLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
136
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
136
        } else {
577
136
            if constexpr (narrow_integral) {
578
136
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
54
                    if (params.is_strict) {
580
27
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
27
                                decimal_to_string(from.value, scale_from),
582
27
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
27
                                precision_to, scale_to);
584
27
                    }
585
54
                    return false;
586
54
                }
587
136
            }
588
82
            to = ToCppT(from.value);
589
136
        }
590
0
        return true;
591
136
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIiEEnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIiEEnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
122
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
122
        } else {
577
122
            if constexpr (narrow_integral) {
578
122
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
48
                    if (params.is_strict) {
580
24
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
24
                                decimal_to_string(from.value, scale_from),
582
24
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
24
                                precision_to, scale_to);
584
24
                    }
585
48
                    return false;
586
48
                }
587
122
            }
588
74
            to = ToCppT(from.value);
589
122
        }
590
0
        return true;
591
122
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES5_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEES5_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
122
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
122
        } else {
577
122
            if constexpr (narrow_integral) {
578
122
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
48
                    if (params.is_strict) {
580
24
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
24
                                decimal_to_string(from.value, scale_from),
582
24
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
24
                                precision_to, scale_to);
584
24
                    }
585
48
                    return false;
586
48
                }
587
122
            }
588
74
            to = ToCppT(from.value);
589
122
        }
590
0
        return true;
591
122
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS2_IlEElLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
82
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
82
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
82
            to = ToCppT(from.value);
589
82
        }
590
82
        return true;
591
82
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS2_IlEElLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEES3_lLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Line
Count
Source
562
30
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
30
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
30
            to = ToCppT(from.value);
589
30
        }
590
30
        return true;
591
30
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEES3_lLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Line
Count
Source
562
42
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
42
        } else {
577
42
            if constexpr (narrow_integral) {
578
42
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
12
                    if (params.is_strict) {
580
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
6
                                decimal_to_string(from.value, scale_from),
582
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
6
                                precision_to, scale_to);
584
6
                    }
585
12
                    return false;
586
12
                }
587
42
            }
588
30
            to = ToCppT(from.value);
589
42
        }
590
0
        return true;
591
42
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIlEEnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIlEEnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
182
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
182
        } else {
577
182
            if constexpr (narrow_integral) {
578
182
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
54
                    if (params.is_strict) {
580
27
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
27
                                decimal_to_string(from.value, scale_from),
582
27
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
27
                                precision_to, scale_to);
584
27
                    }
585
54
                    return false;
586
54
                }
587
182
            }
588
128
            to = ToCppT(from.value);
589
182
        }
590
0
        return true;
591
182
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES5_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEES5_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
168
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
168
        } else {
577
168
            if constexpr (narrow_integral) {
578
168
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
48
                    if (params.is_strict) {
580
24
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
24
                                decimal_to_string(from.value, scale_from),
582
24
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
24
                                precision_to, scale_to);
584
24
                    }
585
48
                    return false;
586
48
                }
587
168
            }
588
120
            to = ToCppT(from.value);
589
168
        }
590
0
        return true;
591
168
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS_12Decimal128V3EnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
74
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
74
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
74
            to = ToCppT(from.value);
589
74
        }
590
74
        return true;
591
74
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS_12Decimal128V3EnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS_12Decimal128V3EnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
128
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
128
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
128
            to = ToCppT(from.value);
589
128
        }
590
128
        return true;
591
128
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS_12Decimal128V3EnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ES2_nLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RNS_14CastParametersE
Line
Count
Source
562
31
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
31
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
31
            to = ToCppT(from.value);
589
31
        }
590
31
        return true;
591
31
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ES2_nLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKNS3_10NativeTypeESA_RNS_14CastParametersE
Line
Count
Source
562
42
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
42
        } else {
577
42
            if constexpr (narrow_integral) {
578
42
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
12
                    if (params.is_strict) {
580
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
6
                                decimal_to_string(from.value, scale_from),
582
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
6
                                precision_to, scale_to);
584
6
                    }
585
12
                    return false;
586
12
                }
587
42
            }
588
30
            to = ToCppT(from.value);
589
42
        }
590
0
        return true;
591
42
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES5_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ES5_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
182
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
182
        } else {
577
182
            if constexpr (narrow_integral) {
578
182
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
54
                    if (params.is_strict) {
580
27
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
27
                                decimal_to_string(from.value, scale_from),
582
27
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
27
                                precision_to, scale_to);
584
27
                    }
585
54
                    return false;
586
54
                }
587
182
            }
588
128
            to = ToCppT(from.value);
589
182
        }
590
0
        return true;
591
182
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES6_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
74
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
74
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
74
            to = ToCppT(from.value);
589
74
        }
590
74
        return true;
591
74
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEES6_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES6_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
120
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
120
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
120
            to = ToCppT(from.value);
589
120
        }
590
120
        return true;
591
120
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEES6_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
562
128
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
128
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
128
            to = ToCppT(from.value);
589
128
        }
590
128
        return true;
591
128
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_S5_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
562
30
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
30
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
30
            to = ToCppT(from.value);
589
30
        }
590
30
        return true;
591
30
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_S5_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKNS7_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
562
42
                                                CastParameters& params) {
563
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
            to = ToCppT(from.value());
576
42
        } else {
577
42
            if constexpr (narrow_integral) {
578
42
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
12
                    if (params.is_strict) {
580
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
6
                                decimal_to_string(from.value, scale_from),
582
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
6
                                precision_to, scale_to);
584
6
                    }
585
12
                    return false;
586
12
                }
587
42
            }
588
30
            to = ToCppT(from.value);
589
42
        }
590
0
        return true;
591
42
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIiEEnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
4
                                                CastParameters& params) {
563
4
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
4
            to = ToCppT(from.value());
576
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
            to = ToCppT(from.value);
589
        }
590
4
        return true;
591
4
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIiEEnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
35
                                                CastParameters& params) {
563
35
        if constexpr (IsDecimal128V2<FromCppT>) {
564
35
            if constexpr (narrow_integral) {
565
35
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
18
                    if (params.is_strict) {
567
9
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
9
                                decimal_to_string(from.value(), scale_from),
569
9
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
9
                                precision_to, scale_to);
571
9
                    }
572
18
                    return false;
573
18
                }
574
35
            }
575
17
            to = ToCppT(from.value());
576
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
            to = ToCppT(from.value);
589
        }
590
0
        return true;
591
35
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIlEEnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
7
                                                CastParameters& params) {
563
7
        if constexpr (IsDecimal128V2<FromCppT>) {
564
            if constexpr (narrow_integral) {
565
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
                    if (params.is_strict) {
567
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
                                decimal_to_string(from.value(), scale_from),
569
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
                                precision_to, scale_to);
571
                    }
572
                    return false;
573
                }
574
            }
575
7
            to = ToCppT(from.value());
576
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
            to = ToCppT(from.value);
589
        }
590
7
        return true;
591
7
    }
_ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIlEEnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKNS5_10NativeTypeESC_RNS_14CastParametersE
Line
Count
Source
562
60
                                                CastParameters& params) {
563
60
        if constexpr (IsDecimal128V2<FromCppT>) {
564
60
            if constexpr (narrow_integral) {
565
60
                if (UNLIKELY(from.value() > max_result || from.value() < -max_result)) {
566
12
                    if (params.is_strict) {
567
6
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
568
6
                                decimal_to_string(from.value(), scale_from),
569
6
                                fmt::format("decimal({}, {})", precision_from, scale_from),
570
6
                                precision_to, scale_to);
571
6
                    }
572
12
                    return false;
573
12
                }
574
60
            }
575
48
            to = ToCppT(from.value());
576
        } else {
577
            if constexpr (narrow_integral) {
578
                if (UNLIKELY(from.value > max_result || from.value < -max_result)) {
579
                    if (params.is_strict) {
580
                        params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
581
                                decimal_to_string(from.value, scale_from),
582
                                fmt::format("decimal({}, {})", precision_from, scale_from),
583
                                precision_to, scale_to);
584
                    }
585
                    return false;
586
                }
587
            }
588
            to = ToCppT(from.value);
589
        }
590
0
        return true;
591
60
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_12Decimal128V3EnLb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_12Decimal128V3EnLb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKNS4_10NativeTypeESB_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal24_from_decimal_same_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1EQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKNS8_10NativeTypeESF_RNS_14CastParametersE
592
593
    template <
594
            typename FromCppT, typename ToCppT, bool multiply_may_overflow, bool narrow_integral,
595
            typename MaxNativeType = std::conditional_t<
596
                    (sizeof(FromCppT) == sizeof(ToCppT)) &&
597
                            (std::is_same_v<ToCppT, Decimal128V3> ||
598
                             std::is_same_v<FromCppT, Decimal128V3>),
599
                    Decimal128V3::NativeType,
600
                    std::conditional_t<(sizeof(FromCppT) > sizeof(ToCppT)),
601
                                       typename FromCppT::NativeType, typename ToCppT::NativeType>>>
602
        requires(IsDecimalNumber<ToCppT> && IsDecimalNumber<FromCppT>)
603
    static inline bool _from_decimal_bigger_scale(const FromCppT& from, const UInt32 precision_from,
604
                                                  const UInt32 scale_from, ToCppT& to,
605
                                                  UInt32 precision_to, UInt32 scale_to,
606
                                                  const MaxNativeType& scale_multiplier,
607
                                                  const typename ToCppT::NativeType& min_result,
608
                                                  const typename ToCppT::NativeType& max_result,
609
8.38k
                                                  CastParameters& params) {
610
8.38k
        MaxNativeType res;
611
8.38k
        if (from >= FromCppT(0)) {
612
8.38k
            if constexpr (narrow_integral) {
613
3.33k
                if constexpr (IsDecimal128V2<FromCppT>) {
614
839
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
839
                    if (UNLIKELY(res > max_result)) {
616
244
                        if (params.is_strict) {
617
122
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
122
                                    decimal_to_string(from.value(), scale_from),
619
122
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
122
                                    precision_to, scale_to);
621
122
                        }
622
244
                        return false;
623
244
                    }
624
2.49k
                } else {
625
2.49k
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
2.49k
                    if (UNLIKELY(res > max_result)) {
627
1.03k
                        if (params.is_strict) {
628
518
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
518
                                    decimal_to_string(from.value, scale_from),
630
518
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
518
                                    precision_to, scale_to);
632
518
                        }
633
1.03k
                        return false;
634
1.03k
                    }
635
2.49k
                }
636
2.04k
                to = ToCppT(res);
637
5.05k
            } else {
638
5.05k
                if constexpr (IsDecimal128V2<FromCppT>) {
639
932
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
4.12k
                } else {
641
4.12k
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
4.12k
                }
643
5.05k
            }
644
8.38k
        } else {
645
0
            if constexpr (narrow_integral) {
646
0
                if constexpr (IsDecimal128V2<FromCppT>) {
647
0
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
0
                    if (UNLIKELY(res < -max_result)) {
649
0
                        if (params.is_strict) {
650
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
0
                                    decimal_to_string(from.value(), scale_from),
652
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
0
                                    precision_to, scale_to);
654
0
                        }
655
0
                        return false;
656
0
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
0
            } else {
671
0
                if constexpr (IsDecimal128V2<FromCppT>) {
672
0
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
0
        return true;
679
8.38k
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEES3_Lb0ELb0EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
112
                                                  CastParameters& params) {
610
112
        MaxNativeType res;
611
112
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
112
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
112
                } else {
641
112
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
112
                }
643
112
            }
644
112
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
112
        return true;
679
112
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEES3_Lb0ELb1EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
82
                                                  CastParameters& params) {
610
82
        MaxNativeType res;
611
82
        if (from >= FromCppT(0)) {
612
82
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
82
                } else {
625
82
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
82
                    if (UNLIKELY(res > max_result)) {
627
40
                        if (params.is_strict) {
628
20
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
20
                                    decimal_to_string(from.value, scale_from),
630
20
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
20
                                    precision_to, scale_to);
632
20
                        }
633
40
                        return false;
634
40
                    }
635
82
                }
636
42
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
82
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
82
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEES3_Lb1ELb0EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEES3_Lb1ELb1EiQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IiEELb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
160
                                                  CastParameters& params) {
610
160
        MaxNativeType res;
611
160
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
160
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
160
                } else {
641
160
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
160
                }
643
160
            }
644
160
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
160
        return true;
679
160
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IiEELb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
323
                                                  CastParameters& params) {
610
323
        MaxNativeType res;
611
323
        if (from >= FromCppT(0)) {
612
323
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
323
                } else {
625
323
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
323
                    if (UNLIKELY(res > max_result)) {
627
133
                        if (params.is_strict) {
628
66
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
66
                                    decimal_to_string(from.value, scale_from),
630
66
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
66
                                    precision_to, scale_to);
632
66
                        }
633
133
                        return false;
634
133
                    }
635
323
                }
636
190
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
323
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
323
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IiEELb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IiEELb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIiEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
160
                                                  CastParameters& params) {
610
160
        MaxNativeType res;
611
160
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
160
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
160
                } else {
641
160
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
160
                }
643
160
            }
644
160
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
160
        return true;
679
160
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIiEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
357
                                                  CastParameters& params) {
610
357
        MaxNativeType res;
611
357
        if (from >= FromCppT(0)) {
612
357
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
357
                } else {
625
357
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
357
                    if (UNLIKELY(res > max_result)) {
627
161
                        if (params.is_strict) {
628
80
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
80
                                    decimal_to_string(from.value, scale_from),
630
80
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
80
                                    precision_to, scale_to);
632
80
                        }
633
161
                        return false;
634
161
                    }
635
357
                }
636
196
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
357
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
357
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIiEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIiEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
160
                                                  CastParameters& params) {
610
160
        MaxNativeType res;
611
160
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
160
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
160
                } else {
641
160
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
160
                }
643
160
            }
644
160
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
160
        return true;
679
160
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
357
                                                  CastParameters& params) {
610
357
        MaxNativeType res;
611
357
        if (from >= FromCppT(0)) {
612
357
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
357
                } else {
625
357
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
357
                    if (UNLIKELY(res > max_result)) {
627
161
                        if (params.is_strict) {
628
80
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
80
                                    decimal_to_string(from.value, scale_from),
630
80
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
80
                                    precision_to, scale_to);
632
80
                        }
633
161
                        return false;
634
161
                    }
635
357
                }
636
196
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
357
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
357
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IiEELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IlEELb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
184
                                                  CastParameters& params) {
610
184
        MaxNativeType res;
611
184
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
184
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
184
                } else {
641
184
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
184
                }
643
184
            }
644
184
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
184
        return true;
679
184
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IlEELb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IlEELb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IlEELb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEES3_Lb0ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEES3_Lb0ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
96
                                                  CastParameters& params) {
610
96
        MaxNativeType res;
611
96
        if (from >= FromCppT(0)) {
612
96
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
96
                } else {
625
96
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
96
                    if (UNLIKELY(res > max_result)) {
627
40
                        if (params.is_strict) {
628
20
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
20
                                    decimal_to_string(from.value, scale_from),
630
20
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
20
                                    precision_to, scale_to);
632
20
                        }
633
40
                        return false;
634
40
                    }
635
96
                }
636
56
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
96
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
96
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEES3_Lb1ELb0ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEES3_Lb1ELb1ElQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIlEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
288
                                                  CastParameters& params) {
610
288
        MaxNativeType res;
611
288
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
288
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
288
                } else {
641
288
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
288
                }
643
288
            }
644
288
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
288
        return true;
679
288
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIlEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
350
                                                  CastParameters& params) {
610
350
        MaxNativeType res;
611
350
        if (from >= FromCppT(0)) {
612
350
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
350
                } else {
625
350
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
350
                    if (UNLIKELY(res > max_result)) {
627
132
                        if (params.is_strict) {
628
66
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
66
                                    decimal_to_string(from.value, scale_from),
630
66
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
66
                                    precision_to, scale_to);
632
66
                        }
633
132
                        return false;
634
132
                    }
635
350
                }
636
218
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
350
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
350
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIlEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIlEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
288
                                                  CastParameters& params) {
610
288
        MaxNativeType res;
611
288
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
288
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
288
                } else {
641
288
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
288
                }
643
288
            }
644
288
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
288
        return true;
679
288
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
384
                                                  CastParameters& params) {
610
384
        MaxNativeType res;
611
384
        if (from >= FromCppT(0)) {
612
384
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
384
                } else {
625
384
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
384
                    if (UNLIKELY(res > max_result)) {
627
160
                        if (params.is_strict) {
628
80
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
80
                                    decimal_to_string(from.value, scale_from),
630
80
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
80
                                    precision_to, scale_to);
632
80
                        }
633
160
                        return false;
634
160
                    }
635
384
                }
636
224
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
384
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
384
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS2_IlEELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
184
                                                  CastParameters& params) {
610
184
        MaxNativeType res;
611
184
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
184
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
184
                } else {
641
184
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
184
                }
643
184
            }
644
184
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
184
        return true;
679
184
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ES2_Lb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ES2_Lb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Line
Count
Source
609
96
                                                  CastParameters& params) {
610
96
        MaxNativeType res;
611
96
        if (from >= FromCppT(0)) {
612
96
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
96
                } else {
625
96
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
96
                    if (UNLIKELY(res > max_result)) {
627
40
                        if (params.is_strict) {
628
20
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
20
                                    decimal_to_string(from.value, scale_from),
630
20
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
20
                                    precision_to, scale_to);
632
20
                        }
633
40
                        return false;
634
40
                    }
635
96
                }
636
56
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
96
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
96
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ES2_Lb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ES2_Lb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS4_jjRS3_jjRKT3_RKNS3_10NativeTypeESD_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
288
                                                  CastParameters& params) {
610
288
        MaxNativeType res;
611
288
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
288
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
288
                } else {
641
288
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
288
                }
643
288
            }
644
288
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
288
        return true;
679
288
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
350
                                                  CastParameters& params) {
610
350
        MaxNativeType res;
611
350
        if (from >= FromCppT(0)) {
612
350
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
350
                } else {
625
350
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
350
                    if (UNLIKELY(res > max_result)) {
627
132
                        if (params.is_strict) {
628
66
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
66
                                    decimal_to_string(from.value, scale_from),
630
66
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
66
                                    precision_to, scale_to);
632
66
                        }
633
132
                        return false;
634
132
                    }
635
350
                }
636
218
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
350
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
350
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEENS_12Decimal128V3ELb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
184
                                                  CastParameters& params) {
610
184
        MaxNativeType res;
611
184
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
184
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
184
                } else {
641
184
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
184
                }
643
184
            }
644
184
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
184
        return true;
679
184
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIiEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIlEENS2_IN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_12Decimal128V3ENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
609
352
                                                  CastParameters& params) {
610
352
        MaxNativeType res;
611
352
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
352
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
352
                } else {
641
352
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
352
                }
643
352
            }
644
352
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
0
                } else {
674
0
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
0
                }
676
0
            }
677
0
        }
678
352
        return true;
679
352
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb0ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Line
Count
Source
609
96
                                                  CastParameters& params) {
610
96
        MaxNativeType res;
611
96
        if (from >= FromCppT(0)) {
612
96
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
96
                } else {
625
96
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
96
                    if (UNLIKELY(res > max_result)) {
627
40
                        if (params.is_strict) {
628
20
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
20
                                    decimal_to_string(from.value, scale_from),
630
20
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
20
                                    precision_to, scale_to);
632
20
                        }
633
40
                        return false;
634
40
                    }
635
96
                }
636
56
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
96
        } else {
645
0
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
0
                } else {
658
0
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
0
                    if (UNLIKELY(res < -max_result)) {
660
0
                        if (params.is_strict) {
661
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
0
                                    decimal_to_string(from.value, scale_from),
663
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
0
                                    precision_to, scale_to);
665
0
                        }
666
0
                        return false;
667
0
                    }
668
0
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
96
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb0ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_7DecimalIN4wide7integerILm256EiEEEES6_Lb1ELb1ES5_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS8_jjRS7_jjRKT3_RKNS7_10NativeTypeESH_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
32
                                                  CastParameters& params) {
610
32
        MaxNativeType res;
611
32
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
32
            } else {
638
32
                if constexpr (IsDecimal128V2<FromCppT>) {
639
32
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
32
            }
644
32
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
0
                if constexpr (IsDecimal128V2<FromCppT>) {
672
0
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
0
            }
677
0
        }
678
32
        return true;
679
32
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
435
                                                  CastParameters& params) {
610
435
        MaxNativeType res;
611
435
        if (from >= FromCppT(0)) {
612
435
            if constexpr (narrow_integral) {
613
435
                if constexpr (IsDecimal128V2<FromCppT>) {
614
435
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
435
                    if (UNLIKELY(res > max_result)) {
616
156
                        if (params.is_strict) {
617
78
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
78
                                    decimal_to_string(from.value(), scale_from),
619
78
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
78
                                    precision_to, scale_to);
621
78
                        }
622
156
                        return false;
623
156
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
279
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
435
        } else {
645
0
            if constexpr (narrow_integral) {
646
0
                if constexpr (IsDecimal128V2<FromCppT>) {
647
0
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
0
                    if (UNLIKELY(res < -max_result)) {
649
0
                        if (params.is_strict) {
650
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
0
                                    decimal_to_string(from.value(), scale_from),
652
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
0
                                    precision_to, scale_to);
654
0
                        }
655
0
                        return false;
656
0
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
435
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIiEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
124
                                                  CastParameters& params) {
610
124
        MaxNativeType res;
611
124
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
124
            } else {
638
124
                if constexpr (IsDecimal128V2<FromCppT>) {
639
124
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
124
            }
644
124
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
0
                if constexpr (IsDecimal128V2<FromCppT>) {
672
0
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
0
            }
677
0
        }
678
124
        return true;
679
124
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Line
Count
Source
609
354
                                                  CastParameters& params) {
610
354
        MaxNativeType res;
611
354
        if (from >= FromCppT(0)) {
612
354
            if constexpr (narrow_integral) {
613
354
                if constexpr (IsDecimal128V2<FromCppT>) {
614
354
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
354
                    if (UNLIKELY(res > max_result)) {
616
84
                        if (params.is_strict) {
617
42
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
42
                                    decimal_to_string(from.value(), scale_from),
619
42
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
42
                                    precision_to, scale_to);
621
42
                        }
622
84
                        return false;
623
84
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
270
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
354
        } else {
645
0
            if constexpr (narrow_integral) {
646
0
                if constexpr (IsDecimal128V2<FromCppT>) {
647
0
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
0
                    if (UNLIKELY(res < -max_result)) {
649
0
                        if (params.is_strict) {
650
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
0
                                    decimal_to_string(from.value(), scale_from),
652
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
0
                                    precision_to, scale_to);
654
0
                        }
655
0
                        return false;
656
0
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
354
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIlEELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS6_jjRS5_jjRKT3_RKNS5_10NativeTypeESF_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
364
                                                  CastParameters& params) {
610
364
        MaxNativeType res;
611
364
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
364
            } else {
638
364
                if constexpr (IsDecimal128V2<FromCppT>) {
639
364
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
364
            }
644
364
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
0
                if constexpr (IsDecimal128V2<FromCppT>) {
672
0
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
0
            }
677
0
        }
678
364
        return true;
679
364
    }
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb0ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Line
Count
Source
609
50
                                                  CastParameters& params) {
610
50
        MaxNativeType res;
611
50
        if (from >= FromCppT(0)) {
612
50
            if constexpr (narrow_integral) {
613
50
                if constexpr (IsDecimal128V2<FromCppT>) {
614
50
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
50
                    if (UNLIKELY(res > max_result)) {
616
4
                        if (params.is_strict) {
617
2
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
2
                                    decimal_to_string(from.value(), scale_from),
619
2
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
2
                                    precision_to, scale_to);
621
2
                        }
622
4
                        return false;
623
4
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
46
                to = ToCppT(res);
637
            } else {
638
                if constexpr (IsDecimal128V2<FromCppT>) {
639
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
            }
644
50
        } else {
645
0
            if constexpr (narrow_integral) {
646
0
                if constexpr (IsDecimal128V2<FromCppT>) {
647
0
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
0
                    if (UNLIKELY(res < -max_result)) {
649
0
                        if (params.is_strict) {
650
0
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
0
                                    decimal_to_string(from.value(), scale_from),
652
0
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
0
                                    precision_to, scale_to);
654
0
                        }
655
0
                        return false;
656
0
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
0
                to = ToCppT(res);
670
            } else {
671
                if constexpr (IsDecimal128V2<FromCppT>) {
672
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
            }
677
0
        }
678
0
        return true;
679
50
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb0EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_12Decimal128V3ELb1ELb1EnQaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS5_jjRS4_jjRKT3_RKNS4_10NativeTypeESE_RNS_14CastParametersE
_ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Line
Count
Source
609
412
                                                  CastParameters& params) {
610
412
        MaxNativeType res;
611
412
        if (from >= FromCppT(0)) {
612
            if constexpr (narrow_integral) {
613
                if constexpr (IsDecimal128V2<FromCppT>) {
614
                    res = (from.value() + scale_multiplier / 2) / scale_multiplier;
615
                    if (UNLIKELY(res > max_result)) {
616
                        if (params.is_strict) {
617
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
618
                                    decimal_to_string(from.value(), scale_from),
619
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
620
                                    precision_to, scale_to);
621
                        }
622
                        return false;
623
                    }
624
                } else {
625
                    res = (from.value + scale_multiplier / 2) / scale_multiplier;
626
                    if (UNLIKELY(res > max_result)) {
627
                        if (params.is_strict) {
628
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
629
                                    decimal_to_string(from.value, scale_from),
630
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
631
                                    precision_to, scale_to);
632
                        }
633
                        return false;
634
                    }
635
                }
636
                to = ToCppT(res);
637
412
            } else {
638
412
                if constexpr (IsDecimal128V2<FromCppT>) {
639
412
                    to = ToCppT((from.value() + scale_multiplier / 2) / scale_multiplier);
640
                } else {
641
                    to = ToCppT((from.value + scale_multiplier / 2) / scale_multiplier);
642
                }
643
412
            }
644
412
        } else {
645
            if constexpr (narrow_integral) {
646
                if constexpr (IsDecimal128V2<FromCppT>) {
647
                    res = (from.value() - scale_multiplier / 2) / scale_multiplier;
648
                    if (UNLIKELY(res < -max_result)) {
649
                        if (params.is_strict) {
650
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
651
                                    decimal_to_string(from.value(), scale_from),
652
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
653
                                    precision_to, scale_to);
654
                        }
655
                        return false;
656
                    }
657
                } else {
658
                    res = (from.value - scale_multiplier / 2) / scale_multiplier;
659
                    if (UNLIKELY(res < -max_result)) {
660
                        if (params.is_strict) {
661
                            params.status = DECIMAL_CONVERT_OVERFLOW_ERROR(
662
                                    decimal_to_string(from.value, scale_from),
663
                                    fmt::format("decimal({}, {})", precision_from, scale_from),
664
                                    precision_to, scale_to);
665
                        }
666
                        return false;
667
                    }
668
                }
669
                to = ToCppT(res);
670
0
            } else {
671
0
                if constexpr (IsDecimal128V2<FromCppT>) {
672
0
                    to = ToCppT((from.value() - scale_multiplier / 2) / scale_multiplier);
673
                } else {
674
                    to = ToCppT((from.value - scale_multiplier / 2) / scale_multiplier);
675
                }
676
0
            }
677
0
        }
678
412
        return true;
679
412
    }
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb0ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb0ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
Unexecuted instantiation: _ZN5doris13CastToDecimal26_from_decimal_bigger_scaleINS_14DecimalV2ValueENS_7DecimalIN4wide7integerILm256EiEEEELb1ELb1ES6_Qaa15IsDecimalNumberIT0_E15IsDecimalNumberIT_EEEbRKS9_jjRS8_jjRKT3_RKNS8_10NativeTypeESI_RNS_14CastParametersE
680
};
681
682
// Casting from string to decimal types.
683
template <CastModeType Mode, typename ToDataType>
684
    requires(IsDataTypeDecimal<ToDataType>)
685
class CastToImpl<Mode, DataTypeString, ToDataType> : public CastToBase {
686
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
687
                        uint32_t result, size_t input_rows_count,
688
5.86k
                        const NullMap::value_type* null_map = nullptr) const override {
689
5.86k
        const auto& named_from = block.get_by_position(arguments[0]);
690
5.86k
        const auto* col_from =
691
5.86k
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
5.86k
        const NullMap::value_type* source_null_map = null_map;
693
5.86k
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
5.86k
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
5.86k
        auto to_type = block.get_by_position(result).type;
708
5.86k
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
5.86k
        MutableColumnPtr column_to = to_type->create_column();
712
5.86k
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
5.86k
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
5.86k
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
2.90k
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
2.96k
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
2.96k
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
2.96k
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
5.86k
        if (source_null_map) {
726
5.46k
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
115k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
110k
                null_map_to[i] |= source_null_map[i];
729
110k
            }
730
5.46k
        }
731
732
5.86k
        block.get_by_position(result).column = std::move(nullable_col_to);
733
5.86k
        return Status::OK();
734
5.86k
    }
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
854
                        const NullMap::value_type* null_map = nullptr) const override {
689
854
        const auto& named_from = block.get_by_position(arguments[0]);
690
854
        const auto* col_from =
691
854
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
854
        const NullMap::value_type* source_null_map = null_map;
693
854
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
854
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
854
        auto to_type = block.get_by_position(result).type;
708
854
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
854
        MutableColumnPtr column_to = to_type->create_column();
712
854
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
854
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
854
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
854
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
854
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
854
        if (source_null_map) {
726
665
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
15.3k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
14.6k
                null_map_to[i] |= source_null_map[i];
729
14.6k
            }
730
665
        }
731
732
854
        block.get_by_position(result).column = std::move(nullable_col_to);
733
854
        return Status::OK();
734
854
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
782
                        const NullMap::value_type* null_map = nullptr) const override {
689
782
        const auto& named_from = block.get_by_position(arguments[0]);
690
782
        const auto* col_from =
691
782
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
782
        const NullMap::value_type* source_null_map = null_map;
693
782
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
782
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
782
        auto to_type = block.get_by_position(result).type;
708
782
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
782
        MutableColumnPtr column_to = to_type->create_column();
712
782
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
782
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
782
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
782
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
782
        if (source_null_map) {
726
782
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
15.6k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
14.8k
                null_map_to[i] |= source_null_map[i];
729
14.8k
            }
730
782
        }
731
732
782
        block.get_by_position(result).column = std::move(nullable_col_to);
733
782
        return Status::OK();
734
782
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
709
                        const NullMap::value_type* null_map = nullptr) const override {
689
709
        const auto& named_from = block.get_by_position(arguments[0]);
690
709
        const auto* col_from =
691
709
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
709
        const NullMap::value_type* source_null_map = null_map;
693
709
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
709
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
709
        auto to_type = block.get_by_position(result).type;
708
709
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
709
        MutableColumnPtr column_to = to_type->create_column();
712
709
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
709
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
709
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
709
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
709
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
709
        if (source_null_map) {
726
631
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.0k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.3k
                null_map_to[i] |= source_null_map[i];
729
13.3k
            }
730
631
        }
731
732
709
        block.get_by_position(result).column = std::move(nullable_col_to);
733
709
        return Status::OK();
734
709
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
709
                        const NullMap::value_type* null_map = nullptr) const override {
689
709
        const auto& named_from = block.get_by_position(arguments[0]);
690
709
        const auto* col_from =
691
709
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
709
        const NullMap::value_type* source_null_map = null_map;
693
709
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
709
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
709
        auto to_type = block.get_by_position(result).type;
708
709
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
709
        MutableColumnPtr column_to = to_type->create_column();
712
709
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
709
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
709
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
709
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
709
        if (source_null_map) {
726
709
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.1k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.4k
                null_map_to[i] |= source_null_map[i];
729
13.4k
            }
730
709
        }
731
732
709
        block.get_by_position(result).column = std::move(nullable_col_to);
733
709
        return Status::OK();
734
709
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
709
                        const NullMap::value_type* null_map = nullptr) const override {
689
709
        const auto& named_from = block.get_by_position(arguments[0]);
690
709
        const auto* col_from =
691
709
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
709
        const NullMap::value_type* source_null_map = null_map;
693
709
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
709
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
709
        auto to_type = block.get_by_position(result).type;
708
709
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
709
        MutableColumnPtr column_to = to_type->create_column();
712
709
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
709
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
709
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
709
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
709
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
709
        if (source_null_map) {
726
631
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.0k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.3k
                null_map_to[i] |= source_null_map[i];
729
13.3k
            }
730
631
        }
731
732
709
        block.get_by_position(result).column = std::move(nullable_col_to);
733
709
        return Status::OK();
734
709
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
716
                        const NullMap::value_type* null_map = nullptr) const override {
689
716
        const auto& named_from = block.get_by_position(arguments[0]);
690
716
        const auto* col_from =
691
716
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
716
        const NullMap::value_type* source_null_map = null_map;
693
716
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
716
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
716
        auto to_type = block.get_by_position(result).type;
708
716
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
716
        MutableColumnPtr column_to = to_type->create_column();
712
716
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
716
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
716
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
716
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
716
        if (source_null_map) {
726
716
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.1k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.4k
                null_map_to[i] |= source_null_map[i];
729
13.4k
            }
730
716
        }
731
732
716
        block.get_by_position(result).column = std::move(nullable_col_to);
733
716
        return Status::OK();
734
716
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
695
                        const NullMap::value_type* null_map = nullptr) const override {
689
695
        const auto& named_from = block.get_by_position(arguments[0]);
690
695
        const auto* col_from =
691
695
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
695
        const NullMap::value_type* source_null_map = null_map;
693
695
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
695
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
695
        auto to_type = block.get_by_position(result).type;
708
695
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
695
        MutableColumnPtr column_to = to_type->create_column();
712
695
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
695
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
695
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
695
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
695
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
695
        if (source_null_map) {
726
631
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.0k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.3k
                null_map_to[i] |= source_null_map[i];
729
13.3k
            }
730
631
        }
731
732
695
        block.get_by_position(result).column = std::move(nullable_col_to);
733
695
        return Status::OK();
734
695
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeStringENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
688
695
                        const NullMap::value_type* null_map = nullptr) const override {
689
695
        const auto& named_from = block.get_by_position(arguments[0]);
690
695
        const auto* col_from =
691
695
                check_and_get_column<DataTypeString::ColumnType>(named_from.column.get());
692
695
        const NullMap::value_type* source_null_map = null_map;
693
695
        if (!col_from) {
694
0
            const auto* nullable_col_from =
695
0
                    check_and_get_column<ColumnNullable>(named_from.column.get());
696
0
            if (nullable_col_from) {
697
0
                col_from = check_and_get_column<DataTypeString::ColumnType>(
698
0
                        &nullable_col_from->get_nested_column());
699
0
                source_null_map = nullable_col_from->get_null_map_data().data();
700
0
            }
701
0
        }
702
695
        if (!col_from) {
703
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
704
0
                                        named_from.column->get_name());
705
0
        }
706
707
695
        auto to_type = block.get_by_position(result).type;
708
695
        auto serde = remove_nullable(to_type)->get_serde();
709
710
        // by default framework, to_type is already unwrapped nullable
711
695
        MutableColumnPtr column_to = to_type->create_column();
712
695
        ColumnNullable::MutablePtr nullable_col_to = ColumnNullable::create(
713
695
                std::move(column_to), ColumnUInt8::create(input_rows_count, 0));
714
715
695
        if constexpr (Mode == CastModeType::NonStrictMode) {
716
            // may write nulls to nullable_col_to
717
695
            RETURN_IF_ERROR(serde->from_string_batch(*col_from, *nullable_col_to, {}));
718
        } else if constexpr (Mode == CastModeType::StrictMode) {
719
            // WON'T write nulls to nullable_col_to, just raise errors. null_map is only used to skip invalid rows
720
            RETURN_IF_ERROR(serde->from_string_strict_mode_batch(
721
                    *col_from, nullable_col_to->get_nested_column(), {}, source_null_map));
722
        } else {
723
            return Status::InternalError("Unsupported cast mode");
724
        }
725
695
        if (source_null_map) {
726
695
            auto& null_map_to = nullable_col_to->get_null_map_data();
727
14.1k
            for (size_t i = 0; i < input_rows_count; ++i) {
728
13.4k
                null_map_to[i] |= source_null_map[i];
729
13.4k
            }
730
695
        }
731
732
695
        block.get_by_position(result).column = std::move(nullable_col_to);
733
695
        return Status::OK();
734
695
    }
735
};
736
737
// cast bool and int to decimal. when may overflow, result column is nullable.
738
template <CastModeType CastMode, typename FromDataType, typename ToDataType>
739
    requires(IsDataTypeDecimal<ToDataType> &&
740
             (IsDataTypeInt<FromDataType> || IsDataTypeBool<FromDataType>))
741
class CastToImpl<CastMode, FromDataType, ToDataType> : public CastToBase {
742
public:
743
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
744
                        uint32_t result, size_t input_rows_count,
745
782
                        const NullMap::value_type* null_map = nullptr) const override {
746
782
        using FromFieldType = typename FromDataType::FieldType;
747
782
        using ToFieldType = typename ToDataType::FieldType;
748
782
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
782
        const auto* col_from =
750
782
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
782
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
782
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
782
        constexpr UInt32 from_scale = 0;
758
759
782
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
782
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
782
        UInt32 to_precision = to_decimal_type.get_precision();
762
782
        ToDataType::check_type_precision(to_precision);
763
782
        UInt32 to_scale = to_decimal_type.get_scale();
764
782
        ToDataType::check_type_scale(to_scale);
765
766
782
        auto from_max_int_digit_count = from_precision - from_scale;
767
782
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
782
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
782
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
782
        constexpr UInt32 to_max_digits =
774
782
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
782
        bool multiply_may_overflow = false;
776
782
        if (to_scale > from_scale) {
777
483
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
483
        }
779
782
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
782
                                                  sizeof(typename ToFieldType::NativeType)),
781
782
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
782
        MaxNativeType scale_multiplier =
783
782
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
782
        typename ToFieldType::NativeType max_result =
785
782
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
782
        typename ToFieldType::NativeType min_result = -max_result;
787
788
782
        ColumnUInt8::MutablePtr col_null_map_to;
789
782
        NullMap::value_type* null_map_data = nullptr;
790
782
        if (narrow_integral) {
791
673
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
673
            null_map_data = col_null_map_to->get_data().data();
793
673
        }
794
795
782
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
782
        const auto& vec_from = col_from->get_data();
797
782
        const auto* vec_from_data = vec_from.data();
798
782
        auto& vec_to = col_to->get_data();
799
782
        auto* vec_to_data = vec_to.data();
800
801
782
        CastParameters params;
802
782
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
782
        size_t size = vec_from.size();
804
805
782
        RETURN_IF_ERROR(std::visit(
806
782
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
782
                    for (size_t i = 0; i < size; i++) {
808
782
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
782
                                                      typename ToDataType::FieldType,
810
782
                                                      multiply_may_overflow, narrow_integral>(
811
782
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
782
                                    scale_multiplier, min_result, max_result, params)) {
813
782
                            if (set_nullable) {
814
782
                                null_map_data[i] = 1;
815
782
                            } else {
816
782
                                return params.status;
817
782
                            }
818
782
                        }
819
782
                    }
820
782
                    return Status::OK();
821
782
                },
822
782
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
401
        if (narrow_integral) {
825
292
            block.get_by_position(result).column =
826
292
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
292
        } else {
828
109
            block.get_by_position(result).column = std::move(col_to);
829
109
        }
830
401
        return Status::OK();
831
782
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
2
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
2
            null_map_data = col_null_map_to->get_data().data();
793
2
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
1
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
1
        return Status::OK();
831
2
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
1
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
1
            null_map_data = col_null_map_to->get_data().data();
793
1
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
2
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
1
            block.get_by_position(result).column = std::move(col_to);
829
1
        }
830
2
        return Status::OK();
831
2
    }
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
2
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
2
            null_map_data = col_null_map_to->get_data().data();
793
2
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
1
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
1
        return Status::OK();
831
2
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
5
                        const NullMap::value_type* null_map = nullptr) const override {
746
5
        using FromFieldType = typename FromDataType::FieldType;
747
5
        using ToFieldType = typename ToDataType::FieldType;
748
5
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
5
        const auto* col_from =
750
5
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
5
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
5
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
5
        constexpr UInt32 from_scale = 0;
758
759
5
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
5
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
5
        UInt32 to_precision = to_decimal_type.get_precision();
762
5
        ToDataType::check_type_precision(to_precision);
763
5
        UInt32 to_scale = to_decimal_type.get_scale();
764
5
        ToDataType::check_type_scale(to_scale);
765
766
5
        auto from_max_int_digit_count = from_precision - from_scale;
767
5
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
5
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
5
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
5
        constexpr UInt32 to_max_digits =
774
5
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
5
        bool multiply_may_overflow = false;
776
5
        if (to_scale > from_scale) {
777
4
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
4
        }
779
5
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
5
                                                  sizeof(typename ToFieldType::NativeType)),
781
5
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
5
        MaxNativeType scale_multiplier =
783
5
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
5
        typename ToFieldType::NativeType max_result =
785
5
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
5
        typename ToFieldType::NativeType min_result = -max_result;
787
788
5
        ColumnUInt8::MutablePtr col_null_map_to;
789
5
        NullMap::value_type* null_map_data = nullptr;
790
5
        if (narrow_integral) {
791
1
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
1
            null_map_data = col_null_map_to->get_data().data();
793
1
        }
794
795
5
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
5
        const auto& vec_from = col_from->get_data();
797
5
        const auto* vec_from_data = vec_from.data();
798
5
        auto& vec_to = col_to->get_data();
799
5
        auto* vec_to_data = vec_to.data();
800
801
5
        CastParameters params;
802
5
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
5
        size_t size = vec_from.size();
804
805
5
        RETURN_IF_ERROR(std::visit(
806
5
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
5
                    for (size_t i = 0; i < size; i++) {
808
5
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
5
                                                      typename ToDataType::FieldType,
810
5
                                                      multiply_may_overflow, narrow_integral>(
811
5
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
5
                                    scale_multiplier, min_result, max_result, params)) {
813
5
                            if (set_nullable) {
814
5
                                null_map_data[i] = 1;
815
5
                            } else {
816
5
                                return params.status;
817
5
                            }
818
5
                        }
819
5
                    }
820
5
                    return Status::OK();
821
5
                },
822
5
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
5
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
5
        return Status::OK();
831
5
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
23
                        const NullMap::value_type* null_map = nullptr) const override {
746
23
        using FromFieldType = typename FromDataType::FieldType;
747
23
        using ToFieldType = typename ToDataType::FieldType;
748
23
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
23
        const auto* col_from =
750
23
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
23
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
23
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
23
        constexpr UInt32 from_scale = 0;
758
759
23
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
23
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
23
        UInt32 to_precision = to_decimal_type.get_precision();
762
23
        ToDataType::check_type_precision(to_precision);
763
23
        UInt32 to_scale = to_decimal_type.get_scale();
764
23
        ToDataType::check_type_scale(to_scale);
765
766
23
        auto from_max_int_digit_count = from_precision - from_scale;
767
23
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
23
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
23
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
23
        constexpr UInt32 to_max_digits =
774
23
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
23
        bool multiply_may_overflow = false;
776
23
        if (to_scale > from_scale) {
777
16
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
16
        }
779
23
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
23
                                                  sizeof(typename ToFieldType::NativeType)),
781
23
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
23
        MaxNativeType scale_multiplier =
783
23
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
23
        typename ToFieldType::NativeType max_result =
785
23
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
23
        typename ToFieldType::NativeType min_result = -max_result;
787
788
23
        ColumnUInt8::MutablePtr col_null_map_to;
789
23
        NullMap::value_type* null_map_data = nullptr;
790
23
        if (narrow_integral) {
791
20
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
20
            null_map_data = col_null_map_to->get_data().data();
793
20
        }
794
795
23
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
23
        const auto& vec_from = col_from->get_data();
797
23
        const auto* vec_from_data = vec_from.data();
798
23
        auto& vec_to = col_to->get_data();
799
23
        auto* vec_to_data = vec_to.data();
800
801
23
        CastParameters params;
802
23
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
23
        size_t size = vec_from.size();
804
805
23
        RETURN_IF_ERROR(std::visit(
806
23
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
23
                    for (size_t i = 0; i < size; i++) {
808
23
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
23
                                                      typename ToDataType::FieldType,
810
23
                                                      multiply_may_overflow, narrow_integral>(
811
23
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
23
                                    scale_multiplier, min_result, max_result, params)) {
813
23
                            if (set_nullable) {
814
23
                                null_map_data[i] = 1;
815
23
                            } else {
816
23
                                return params.status;
817
23
                            }
818
23
                        }
819
23
                    }
820
23
                    return Status::OK();
821
23
                },
822
23
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
4
            block.get_by_position(result).column =
826
4
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
3
            block.get_by_position(result).column = std::move(col_to);
829
3
        }
830
7
        return Status::OK();
831
23
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
11
                        const NullMap::value_type* null_map = nullptr) const override {
746
11
        using FromFieldType = typename FromDataType::FieldType;
747
11
        using ToFieldType = typename ToDataType::FieldType;
748
11
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
11
        const auto* col_from =
750
11
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
11
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
11
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
11
        constexpr UInt32 from_scale = 0;
758
759
11
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
11
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
11
        UInt32 to_precision = to_decimal_type.get_precision();
762
11
        ToDataType::check_type_precision(to_precision);
763
11
        UInt32 to_scale = to_decimal_type.get_scale();
764
11
        ToDataType::check_type_scale(to_scale);
765
766
11
        auto from_max_int_digit_count = from_precision - from_scale;
767
11
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
11
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
11
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
11
        constexpr UInt32 to_max_digits =
774
11
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
11
        bool multiply_may_overflow = false;
776
11
        if (to_scale > from_scale) {
777
7
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
7
        }
779
11
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
11
                                                  sizeof(typename ToFieldType::NativeType)),
781
11
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
11
        MaxNativeType scale_multiplier =
783
11
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
11
        typename ToFieldType::NativeType max_result =
785
11
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
11
        typename ToFieldType::NativeType min_result = -max_result;
787
788
11
        ColumnUInt8::MutablePtr col_null_map_to;
789
11
        NullMap::value_type* null_map_data = nullptr;
790
11
        if (narrow_integral) {
791
8
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
8
            null_map_data = col_null_map_to->get_data().data();
793
8
        }
794
795
11
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
11
        const auto& vec_from = col_from->get_data();
797
11
        const auto* vec_from_data = vec_from.data();
798
11
        auto& vec_to = col_to->get_data();
799
11
        auto* vec_to_data = vec_to.data();
800
801
11
        CastParameters params;
802
11
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
11
        size_t size = vec_from.size();
804
805
11
        RETURN_IF_ERROR(std::visit(
806
11
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
11
                    for (size_t i = 0; i < size; i++) {
808
11
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
11
                                                      typename ToDataType::FieldType,
810
11
                                                      multiply_may_overflow, narrow_integral>(
811
11
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
11
                                    scale_multiplier, min_result, max_result, params)) {
813
11
                            if (set_nullable) {
814
11
                                null_map_data[i] = 1;
815
11
                            } else {
816
11
                                return params.status;
817
11
                            }
818
11
                        }
819
11
                    }
820
11
                    return Status::OK();
821
11
                },
822
11
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
11
        if (narrow_integral) {
825
8
            block.get_by_position(result).column =
826
8
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
8
        } else {
828
3
            block.get_by_position(result).column = std::move(col_to);
829
3
        }
830
11
        return Status::OK();
831
11
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
27
                        const NullMap::value_type* null_map = nullptr) const override {
746
27
        using FromFieldType = typename FromDataType::FieldType;
747
27
        using ToFieldType = typename ToDataType::FieldType;
748
27
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
27
        const auto* col_from =
750
27
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
27
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
27
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
27
        constexpr UInt32 from_scale = 0;
758
759
27
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
27
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
27
        UInt32 to_precision = to_decimal_type.get_precision();
762
27
        ToDataType::check_type_precision(to_precision);
763
27
        UInt32 to_scale = to_decimal_type.get_scale();
764
27
        ToDataType::check_type_scale(to_scale);
765
766
27
        auto from_max_int_digit_count = from_precision - from_scale;
767
27
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
27
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
27
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
27
        constexpr UInt32 to_max_digits =
774
27
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
27
        bool multiply_may_overflow = false;
776
27
        if (to_scale > from_scale) {
777
16
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
16
        }
779
27
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
27
                                                  sizeof(typename ToFieldType::NativeType)),
781
27
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
27
        MaxNativeType scale_multiplier =
783
27
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
27
        typename ToFieldType::NativeType max_result =
785
27
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
27
        typename ToFieldType::NativeType min_result = -max_result;
787
788
27
        ColumnUInt8::MutablePtr col_null_map_to;
789
27
        NullMap::value_type* null_map_data = nullptr;
790
27
        if (narrow_integral) {
791
25
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
25
            null_map_data = col_null_map_to->get_data().data();
793
25
        }
794
795
27
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
27
        const auto& vec_from = col_from->get_data();
797
27
        const auto* vec_from_data = vec_from.data();
798
27
        auto& vec_to = col_to->get_data();
799
27
        auto* vec_to_data = vec_to.data();
800
801
27
        CastParameters params;
802
27
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
27
        size_t size = vec_from.size();
804
805
27
        RETURN_IF_ERROR(std::visit(
806
27
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
27
                    for (size_t i = 0; i < size; i++) {
808
27
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
27
                                                      typename ToDataType::FieldType,
810
27
                                                      multiply_may_overflow, narrow_integral>(
811
27
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
27
                                    scale_multiplier, min_result, max_result, params)) {
813
27
                            if (set_nullable) {
814
27
                                null_map_data[i] = 1;
815
27
                            } else {
816
27
                                return params.status;
817
27
                            }
818
27
                        }
819
27
                    }
820
27
                    return Status::OK();
821
27
                },
822
27
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
5
            block.get_by_position(result).column =
826
5
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
5
        } else {
828
2
            block.get_by_position(result).column = std::move(col_to);
829
2
        }
830
7
        return Status::OK();
831
27
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
12
                        const NullMap::value_type* null_map = nullptr) const override {
746
12
        using FromFieldType = typename FromDataType::FieldType;
747
12
        using ToFieldType = typename ToDataType::FieldType;
748
12
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
12
        const auto* col_from =
750
12
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
12
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
12
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
12
        constexpr UInt32 from_scale = 0;
758
759
12
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
12
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
12
        UInt32 to_precision = to_decimal_type.get_precision();
762
12
        ToDataType::check_type_precision(to_precision);
763
12
        UInt32 to_scale = to_decimal_type.get_scale();
764
12
        ToDataType::check_type_scale(to_scale);
765
766
12
        auto from_max_int_digit_count = from_precision - from_scale;
767
12
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
12
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
12
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
12
        constexpr UInt32 to_max_digits =
774
12
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
12
        bool multiply_may_overflow = false;
776
12
        if (to_scale > from_scale) {
777
7
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
7
        }
779
12
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
12
                                                  sizeof(typename ToFieldType::NativeType)),
781
12
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
12
        MaxNativeType scale_multiplier =
783
12
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
12
        typename ToFieldType::NativeType max_result =
785
12
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
12
        typename ToFieldType::NativeType min_result = -max_result;
787
788
12
        ColumnUInt8::MutablePtr col_null_map_to;
789
12
        NullMap::value_type* null_map_data = nullptr;
790
12
        if (narrow_integral) {
791
10
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
10
            null_map_data = col_null_map_to->get_data().data();
793
10
        }
794
795
12
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
12
        const auto& vec_from = col_from->get_data();
797
12
        const auto* vec_from_data = vec_from.data();
798
12
        auto& vec_to = col_to->get_data();
799
12
        auto* vec_to_data = vec_to.data();
800
801
12
        CastParameters params;
802
12
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
12
        size_t size = vec_from.size();
804
805
12
        RETURN_IF_ERROR(std::visit(
806
12
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
12
                    for (size_t i = 0; i < size; i++) {
808
12
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
12
                                                      typename ToDataType::FieldType,
810
12
                                                      multiply_may_overflow, narrow_integral>(
811
12
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
12
                                    scale_multiplier, min_result, max_result, params)) {
813
12
                            if (set_nullable) {
814
12
                                null_map_data[i] = 1;
815
12
                            } else {
816
12
                                return params.status;
817
12
                            }
818
12
                        }
819
12
                    }
820
12
                    return Status::OK();
821
12
                },
822
12
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
12
        if (narrow_integral) {
825
10
            block.get_by_position(result).column =
826
10
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
10
        } else {
828
2
            block.get_by_position(result).column = std::move(col_to);
829
2
        }
830
12
        return Status::OK();
831
12
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
2
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
2
            null_map_data = col_null_map_to->get_data().data();
793
2
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
1
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
1
        return Status::OK();
831
2
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
5
                        const NullMap::value_type* null_map = nullptr) const override {
746
5
        using FromFieldType = typename FromDataType::FieldType;
747
5
        using ToFieldType = typename ToDataType::FieldType;
748
5
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
5
        const auto* col_from =
750
5
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
5
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
5
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
5
        constexpr UInt32 from_scale = 0;
758
759
5
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
5
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
5
        UInt32 to_precision = to_decimal_type.get_precision();
762
5
        ToDataType::check_type_precision(to_precision);
763
5
        UInt32 to_scale = to_decimal_type.get_scale();
764
5
        ToDataType::check_type_scale(to_scale);
765
766
5
        auto from_max_int_digit_count = from_precision - from_scale;
767
5
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
5
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
5
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
5
        constexpr UInt32 to_max_digits =
774
5
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
5
        bool multiply_may_overflow = false;
776
5
        if (to_scale > from_scale) {
777
4
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
4
        }
779
5
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
5
                                                  sizeof(typename ToFieldType::NativeType)),
781
5
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
5
        MaxNativeType scale_multiplier =
783
5
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
5
        typename ToFieldType::NativeType max_result =
785
5
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
5
        typename ToFieldType::NativeType min_result = -max_result;
787
788
5
        ColumnUInt8::MutablePtr col_null_map_to;
789
5
        NullMap::value_type* null_map_data = nullptr;
790
5
        if (narrow_integral) {
791
1
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
1
            null_map_data = col_null_map_to->get_data().data();
793
1
        }
794
795
5
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
5
        const auto& vec_from = col_from->get_data();
797
5
        const auto* vec_from_data = vec_from.data();
798
5
        auto& vec_to = col_to->get_data();
799
5
        auto* vec_to_data = vec_to.data();
800
801
5
        CastParameters params;
802
5
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
5
        size_t size = vec_from.size();
804
805
5
        RETURN_IF_ERROR(std::visit(
806
5
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
5
                    for (size_t i = 0; i < size; i++) {
808
5
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
5
                                                      typename ToDataType::FieldType,
810
5
                                                      multiply_may_overflow, narrow_integral>(
811
5
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
5
                                    scale_multiplier, min_result, max_result, params)) {
813
5
                            if (set_nullable) {
814
5
                                null_map_data[i] = 1;
815
5
                            } else {
816
5
                                return params.status;
817
5
                            }
818
5
                        }
819
5
                    }
820
5
                    return Status::OK();
821
5
                },
822
5
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
5
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
5
        return Status::OK();
831
5
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
31
                        const NullMap::value_type* null_map = nullptr) const override {
746
31
        using FromFieldType = typename FromDataType::FieldType;
747
31
        using ToFieldType = typename ToDataType::FieldType;
748
31
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
31
        const auto* col_from =
750
31
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
31
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
31
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
31
        constexpr UInt32 from_scale = 0;
758
759
31
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
31
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
31
        UInt32 to_precision = to_decimal_type.get_precision();
762
31
        ToDataType::check_type_precision(to_precision);
763
31
        UInt32 to_scale = to_decimal_type.get_scale();
764
31
        ToDataType::check_type_scale(to_scale);
765
766
31
        auto from_max_int_digit_count = from_precision - from_scale;
767
31
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
31
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
31
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
31
        constexpr UInt32 to_max_digits =
774
31
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
31
        bool multiply_may_overflow = false;
776
31
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
31
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
31
                                                  sizeof(typename ToFieldType::NativeType)),
781
31
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
31
        MaxNativeType scale_multiplier =
783
31
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
31
        typename ToFieldType::NativeType max_result =
785
31
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
31
        typename ToFieldType::NativeType min_result = -max_result;
787
788
31
        ColumnUInt8::MutablePtr col_null_map_to;
789
31
        NullMap::value_type* null_map_data = nullptr;
790
31
        if (narrow_integral) {
791
30
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
30
            null_map_data = col_null_map_to->get_data().data();
793
30
        }
794
795
31
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
31
        const auto& vec_from = col_from->get_data();
797
31
        const auto* vec_from_data = vec_from.data();
798
31
        auto& vec_to = col_to->get_data();
799
31
        auto* vec_to_data = vec_to.data();
800
801
31
        CastParameters params;
802
31
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
31
        size_t size = vec_from.size();
804
805
31
        RETURN_IF_ERROR(std::visit(
806
31
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
31
                    for (size_t i = 0; i < size; i++) {
808
31
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
31
                                                      typename ToDataType::FieldType,
810
31
                                                      multiply_may_overflow, narrow_integral>(
811
31
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
31
                                    scale_multiplier, min_result, max_result, params)) {
813
31
                            if (set_nullable) {
814
31
                                null_map_data[i] = 1;
815
31
                            } else {
816
31
                                return params.status;
817
31
                            }
818
31
                        }
819
31
                    }
820
31
                    return Status::OK();
821
31
                },
822
31
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
1
            block.get_by_position(result).column = std::move(col_to);
829
1
        }
830
7
        return Status::OK();
831
31
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
13
                        const NullMap::value_type* null_map = nullptr) const override {
746
13
        using FromFieldType = typename FromDataType::FieldType;
747
13
        using ToFieldType = typename ToDataType::FieldType;
748
13
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
13
        const auto* col_from =
750
13
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
13
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
13
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
13
        constexpr UInt32 from_scale = 0;
758
759
13
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
13
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
13
        UInt32 to_precision = to_decimal_type.get_precision();
762
13
        ToDataType::check_type_precision(to_precision);
763
13
        UInt32 to_scale = to_decimal_type.get_scale();
764
13
        ToDataType::check_type_scale(to_scale);
765
766
13
        auto from_max_int_digit_count = from_precision - from_scale;
767
13
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
13
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
13
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
13
        constexpr UInt32 to_max_digits =
774
13
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
13
        bool multiply_may_overflow = false;
776
13
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
13
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
13
                                                  sizeof(typename ToFieldType::NativeType)),
781
13
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
13
        MaxNativeType scale_multiplier =
783
13
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
13
        typename ToFieldType::NativeType max_result =
785
13
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
13
        typename ToFieldType::NativeType min_result = -max_result;
787
788
13
        ColumnUInt8::MutablePtr col_null_map_to;
789
13
        NullMap::value_type* null_map_data = nullptr;
790
13
        if (narrow_integral) {
791
12
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
12
            null_map_data = col_null_map_to->get_data().data();
793
12
        }
794
795
13
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
13
        const auto& vec_from = col_from->get_data();
797
13
        const auto* vec_from_data = vec_from.data();
798
13
        auto& vec_to = col_to->get_data();
799
13
        auto* vec_to_data = vec_to.data();
800
801
13
        CastParameters params;
802
13
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
13
        size_t size = vec_from.size();
804
805
13
        RETURN_IF_ERROR(std::visit(
806
13
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
13
                    for (size_t i = 0; i < size; i++) {
808
13
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
13
                                                      typename ToDataType::FieldType,
810
13
                                                      multiply_may_overflow, narrow_integral>(
811
13
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
13
                                    scale_multiplier, min_result, max_result, params)) {
813
13
                            if (set_nullable) {
814
13
                                null_map_data[i] = 1;
815
13
                            } else {
816
13
                                return params.status;
817
13
                            }
818
13
                        }
819
13
                    }
820
13
                    return Status::OK();
821
13
                },
822
13
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
13
        if (narrow_integral) {
825
12
            block.get_by_position(result).column =
826
12
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
12
        } else {
828
1
            block.get_by_position(result).column = std::move(col_to);
829
1
        }
830
13
        return Status::OK();
831
13
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
2
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
2
            null_map_data = col_null_map_to->get_data().data();
793
2
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
1
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
1
        return Status::OK();
831
2
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
5
                        const NullMap::value_type* null_map = nullptr) const override {
746
5
        using FromFieldType = typename FromDataType::FieldType;
747
5
        using ToFieldType = typename ToDataType::FieldType;
748
5
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
5
        const auto* col_from =
750
5
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
5
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
5
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
5
        constexpr UInt32 from_scale = 0;
758
759
5
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
5
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
5
        UInt32 to_precision = to_decimal_type.get_precision();
762
5
        ToDataType::check_type_precision(to_precision);
763
5
        UInt32 to_scale = to_decimal_type.get_scale();
764
5
        ToDataType::check_type_scale(to_scale);
765
766
5
        auto from_max_int_digit_count = from_precision - from_scale;
767
5
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
5
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
5
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
5
        constexpr UInt32 to_max_digits =
774
5
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
5
        bool multiply_may_overflow = false;
776
5
        if (to_scale > from_scale) {
777
4
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
4
        }
779
5
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
5
                                                  sizeof(typename ToFieldType::NativeType)),
781
5
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
5
        MaxNativeType scale_multiplier =
783
5
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
5
        typename ToFieldType::NativeType max_result =
785
5
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
5
        typename ToFieldType::NativeType min_result = -max_result;
787
788
5
        ColumnUInt8::MutablePtr col_null_map_to;
789
5
        NullMap::value_type* null_map_data = nullptr;
790
5
        if (narrow_integral) {
791
1
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
1
            null_map_data = col_null_map_to->get_data().data();
793
1
        }
794
795
5
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
5
        const auto& vec_from = col_from->get_data();
797
5
        const auto* vec_from_data = vec_from.data();
798
5
        auto& vec_to = col_to->get_data();
799
5
        auto* vec_to_data = vec_to.data();
800
801
5
        CastParameters params;
802
5
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
5
        size_t size = vec_from.size();
804
805
5
        RETURN_IF_ERROR(std::visit(
806
5
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
5
                    for (size_t i = 0; i < size; i++) {
808
5
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
5
                                                      typename ToDataType::FieldType,
810
5
                                                      multiply_may_overflow, narrow_integral>(
811
5
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
5
                                    scale_multiplier, min_result, max_result, params)) {
813
5
                            if (set_nullable) {
814
5
                                null_map_data[i] = 1;
815
5
                            } else {
816
5
                                return params.status;
817
5
                            }
818
5
                        }
819
5
                    }
820
5
                    return Status::OK();
821
5
                },
822
5
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
5
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
5
        return Status::OK();
831
5
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
23
                        const NullMap::value_type* null_map = nullptr) const override {
746
23
        using FromFieldType = typename FromDataType::FieldType;
747
23
        using ToFieldType = typename ToDataType::FieldType;
748
23
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
23
        const auto* col_from =
750
23
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
23
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
23
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
23
        constexpr UInt32 from_scale = 0;
758
759
23
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
23
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
23
        UInt32 to_precision = to_decimal_type.get_precision();
762
23
        ToDataType::check_type_precision(to_precision);
763
23
        UInt32 to_scale = to_decimal_type.get_scale();
764
23
        ToDataType::check_type_scale(to_scale);
765
766
23
        auto from_max_int_digit_count = from_precision - from_scale;
767
23
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
23
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
23
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
23
        constexpr UInt32 to_max_digits =
774
23
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
23
        bool multiply_may_overflow = false;
776
23
        if (to_scale > from_scale) {
777
16
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
16
        }
779
23
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
23
                                                  sizeof(typename ToFieldType::NativeType)),
781
23
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
23
        MaxNativeType scale_multiplier =
783
23
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
23
        typename ToFieldType::NativeType max_result =
785
23
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
23
        typename ToFieldType::NativeType min_result = -max_result;
787
788
23
        ColumnUInt8::MutablePtr col_null_map_to;
789
23
        NullMap::value_type* null_map_data = nullptr;
790
23
        if (narrow_integral) {
791
20
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
20
            null_map_data = col_null_map_to->get_data().data();
793
20
        }
794
795
23
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
23
        const auto& vec_from = col_from->get_data();
797
23
        const auto* vec_from_data = vec_from.data();
798
23
        auto& vec_to = col_to->get_data();
799
23
        auto* vec_to_data = vec_to.data();
800
801
23
        CastParameters params;
802
23
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
23
        size_t size = vec_from.size();
804
805
23
        RETURN_IF_ERROR(std::visit(
806
23
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
23
                    for (size_t i = 0; i < size; i++) {
808
23
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
23
                                                      typename ToDataType::FieldType,
810
23
                                                      multiply_may_overflow, narrow_integral>(
811
23
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
23
                                    scale_multiplier, min_result, max_result, params)) {
813
23
                            if (set_nullable) {
814
23
                                null_map_data[i] = 1;
815
23
                            } else {
816
23
                                return params.status;
817
23
                            }
818
23
                        }
819
23
                    }
820
23
                    return Status::OK();
821
23
                },
822
23
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
4
            block.get_by_position(result).column =
826
4
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
3
            block.get_by_position(result).column = std::move(col_to);
829
3
        }
830
7
        return Status::OK();
831
23
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
11
                        const NullMap::value_type* null_map = nullptr) const override {
746
11
        using FromFieldType = typename FromDataType::FieldType;
747
11
        using ToFieldType = typename ToDataType::FieldType;
748
11
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
11
        const auto* col_from =
750
11
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
11
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
11
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
11
        constexpr UInt32 from_scale = 0;
758
759
11
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
11
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
11
        UInt32 to_precision = to_decimal_type.get_precision();
762
11
        ToDataType::check_type_precision(to_precision);
763
11
        UInt32 to_scale = to_decimal_type.get_scale();
764
11
        ToDataType::check_type_scale(to_scale);
765
766
11
        auto from_max_int_digit_count = from_precision - from_scale;
767
11
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
11
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
11
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
11
        constexpr UInt32 to_max_digits =
774
11
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
11
        bool multiply_may_overflow = false;
776
11
        if (to_scale > from_scale) {
777
7
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
7
        }
779
11
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
11
                                                  sizeof(typename ToFieldType::NativeType)),
781
11
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
11
        MaxNativeType scale_multiplier =
783
11
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
11
        typename ToFieldType::NativeType max_result =
785
11
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
11
        typename ToFieldType::NativeType min_result = -max_result;
787
788
11
        ColumnUInt8::MutablePtr col_null_map_to;
789
11
        NullMap::value_type* null_map_data = nullptr;
790
11
        if (narrow_integral) {
791
8
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
8
            null_map_data = col_null_map_to->get_data().data();
793
8
        }
794
795
11
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
11
        const auto& vec_from = col_from->get_data();
797
11
        const auto* vec_from_data = vec_from.data();
798
11
        auto& vec_to = col_to->get_data();
799
11
        auto* vec_to_data = vec_to.data();
800
801
11
        CastParameters params;
802
11
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
11
        size_t size = vec_from.size();
804
805
11
        RETURN_IF_ERROR(std::visit(
806
11
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
11
                    for (size_t i = 0; i < size; i++) {
808
11
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
11
                                                      typename ToDataType::FieldType,
810
11
                                                      multiply_may_overflow, narrow_integral>(
811
11
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
11
                                    scale_multiplier, min_result, max_result, params)) {
813
11
                            if (set_nullable) {
814
11
                                null_map_data[i] = 1;
815
11
                            } else {
816
11
                                return params.status;
817
11
                            }
818
11
                        }
819
11
                    }
820
11
                    return Status::OK();
821
11
                },
822
11
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
11
        if (narrow_integral) {
825
8
            block.get_by_position(result).column =
826
8
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
8
        } else {
828
3
            block.get_by_position(result).column = std::move(col_to);
829
3
        }
830
11
        return Status::OK();
831
11
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
35
                        const NullMap::value_type* null_map = nullptr) const override {
746
35
        using FromFieldType = typename FromDataType::FieldType;
747
35
        using ToFieldType = typename ToDataType::FieldType;
748
35
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
35
        const auto* col_from =
750
35
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
35
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
35
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
35
        constexpr UInt32 from_scale = 0;
758
759
35
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
35
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
35
        UInt32 to_precision = to_decimal_type.get_precision();
762
35
        ToDataType::check_type_precision(to_precision);
763
35
        UInt32 to_scale = to_decimal_type.get_scale();
764
35
        ToDataType::check_type_scale(to_scale);
765
766
35
        auto from_max_int_digit_count = from_precision - from_scale;
767
35
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
35
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
35
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
35
        constexpr UInt32 to_max_digits =
774
35
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
35
        bool multiply_may_overflow = false;
776
35
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
35
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
35
                                                  sizeof(typename ToFieldType::NativeType)),
781
35
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
35
        MaxNativeType scale_multiplier =
783
35
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
35
        typename ToFieldType::NativeType max_result =
785
35
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
35
        typename ToFieldType::NativeType min_result = -max_result;
787
788
35
        ColumnUInt8::MutablePtr col_null_map_to;
789
35
        NullMap::value_type* null_map_data = nullptr;
790
35
        if (narrow_integral) {
791
35
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
35
            null_map_data = col_null_map_to->get_data().data();
793
35
        }
794
795
35
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
35
        const auto& vec_from = col_from->get_data();
797
35
        const auto* vec_from_data = vec_from.data();
798
35
        auto& vec_to = col_to->get_data();
799
35
        auto* vec_to_data = vec_to.data();
800
801
35
        CastParameters params;
802
35
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
35
        size_t size = vec_from.size();
804
805
35
        RETURN_IF_ERROR(std::visit(
806
35
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
35
                    for (size_t i = 0; i < size; i++) {
808
35
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
35
                                                      typename ToDataType::FieldType,
810
35
                                                      multiply_may_overflow, narrow_integral>(
811
35
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
35
                                    scale_multiplier, min_result, max_result, params)) {
813
35
                            if (set_nullable) {
814
35
                                null_map_data[i] = 1;
815
35
                            } else {
816
35
                                return params.status;
817
35
                            }
818
35
                        }
819
35
                    }
820
35
                    return Status::OK();
821
35
                },
822
35
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
7
            block.get_by_position(result).column =
826
7
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
7
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
7
        return Status::OK();
831
35
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
14
                        const NullMap::value_type* null_map = nullptr) const override {
746
14
        using FromFieldType = typename FromDataType::FieldType;
747
14
        using ToFieldType = typename ToDataType::FieldType;
748
14
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
14
        const auto* col_from =
750
14
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
14
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
14
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
14
        constexpr UInt32 from_scale = 0;
758
759
14
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
14
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
14
        UInt32 to_precision = to_decimal_type.get_precision();
762
14
        ToDataType::check_type_precision(to_precision);
763
14
        UInt32 to_scale = to_decimal_type.get_scale();
764
14
        ToDataType::check_type_scale(to_scale);
765
766
14
        auto from_max_int_digit_count = from_precision - from_scale;
767
14
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
14
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
14
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
14
        constexpr UInt32 to_max_digits =
774
14
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
14
        bool multiply_may_overflow = false;
776
14
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
14
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
14
                                                  sizeof(typename ToFieldType::NativeType)),
781
14
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
14
        MaxNativeType scale_multiplier =
783
14
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
14
        typename ToFieldType::NativeType max_result =
785
14
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
14
        typename ToFieldType::NativeType min_result = -max_result;
787
788
14
        ColumnUInt8::MutablePtr col_null_map_to;
789
14
        NullMap::value_type* null_map_data = nullptr;
790
14
        if (narrow_integral) {
791
14
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
14
            null_map_data = col_null_map_to->get_data().data();
793
14
        }
794
795
14
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
14
        const auto& vec_from = col_from->get_data();
797
14
        const auto* vec_from_data = vec_from.data();
798
14
        auto& vec_to = col_to->get_data();
799
14
        auto* vec_to_data = vec_to.data();
800
801
14
        CastParameters params;
802
14
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
14
        size_t size = vec_from.size();
804
805
14
        RETURN_IF_ERROR(std::visit(
806
14
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
14
                    for (size_t i = 0; i < size; i++) {
808
14
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
14
                                                      typename ToDataType::FieldType,
810
14
                                                      multiply_may_overflow, narrow_integral>(
811
14
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
14
                                    scale_multiplier, min_result, max_result, params)) {
813
14
                            if (set_nullable) {
814
14
                                null_map_data[i] = 1;
815
14
                            } else {
816
14
                                return params.status;
817
14
                            }
818
14
                        }
819
14
                    }
820
14
                    return Status::OK();
821
14
                },
822
14
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
14
        if (narrow_integral) {
825
14
            block.get_by_position(result).column =
826
14
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
14
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
14
        return Status::OK();
831
14
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
2
                        const NullMap::value_type* null_map = nullptr) const override {
746
2
        using FromFieldType = typename FromDataType::FieldType;
747
2
        using ToFieldType = typename ToDataType::FieldType;
748
2
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
2
        const auto* col_from =
750
2
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
2
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
2
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
2
        constexpr UInt32 from_scale = 0;
758
759
2
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
2
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
2
        UInt32 to_precision = to_decimal_type.get_precision();
762
2
        ToDataType::check_type_precision(to_precision);
763
2
        UInt32 to_scale = to_decimal_type.get_scale();
764
2
        ToDataType::check_type_scale(to_scale);
765
766
2
        auto from_max_int_digit_count = from_precision - from_scale;
767
2
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
2
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
2
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
2
        constexpr UInt32 to_max_digits =
774
2
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
2
        bool multiply_may_overflow = false;
776
2
        if (to_scale > from_scale) {
777
2
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
2
        }
779
2
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
2
                                                  sizeof(typename ToFieldType::NativeType)),
781
2
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
2
        MaxNativeType scale_multiplier =
783
2
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
2
        typename ToFieldType::NativeType max_result =
785
2
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
2
        typename ToFieldType::NativeType min_result = -max_result;
787
788
2
        ColumnUInt8::MutablePtr col_null_map_to;
789
2
        NullMap::value_type* null_map_data = nullptr;
790
2
        if (narrow_integral) {
791
2
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
2
            null_map_data = col_null_map_to->get_data().data();
793
2
        }
794
795
2
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
2
        const auto& vec_from = col_from->get_data();
797
2
        const auto* vec_from_data = vec_from.data();
798
2
        auto& vec_to = col_to->get_data();
799
2
        auto* vec_to_data = vec_to.data();
800
801
2
        CastParameters params;
802
2
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
2
        size_t size = vec_from.size();
804
805
2
        RETURN_IF_ERROR(std::visit(
806
2
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
2
                    for (size_t i = 0; i < size; i++) {
808
2
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
2
                                                      typename ToDataType::FieldType,
810
2
                                                      multiply_may_overflow, narrow_integral>(
811
2
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
2
                                    scale_multiplier, min_result, max_result, params)) {
813
2
                            if (set_nullable) {
814
2
                                null_map_data[i] = 1;
815
2
                            } else {
816
2
                                return params.status;
817
2
                            }
818
2
                        }
819
2
                    }
820
2
                    return Status::OK();
821
2
                },
822
2
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
1
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
1
        } else {
828
0
            block.get_by_position(result).column = std::move(col_to);
829
0
        }
830
1
        return Status::OK();
831
2
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE2EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
5
                        const NullMap::value_type* null_map = nullptr) const override {
746
5
        using FromFieldType = typename FromDataType::FieldType;
747
5
        using ToFieldType = typename ToDataType::FieldType;
748
5
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
5
        const auto* col_from =
750
5
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
5
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
5
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
5
        constexpr UInt32 from_scale = 0;
758
759
5
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
5
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
5
        UInt32 to_precision = to_decimal_type.get_precision();
762
5
        ToDataType::check_type_precision(to_precision);
763
5
        UInt32 to_scale = to_decimal_type.get_scale();
764
5
        ToDataType::check_type_scale(to_scale);
765
766
5
        auto from_max_int_digit_count = from_precision - from_scale;
767
5
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
5
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
5
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
5
        constexpr UInt32 to_max_digits =
774
5
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
5
        bool multiply_may_overflow = false;
776
5
        if (to_scale > from_scale) {
777
4
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
4
        }
779
5
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
5
                                                  sizeof(typename ToFieldType::NativeType)),
781
5
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
5
        MaxNativeType scale_multiplier =
783
5
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
5
        typename ToFieldType::NativeType max_result =
785
5
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
5
        typename ToFieldType::NativeType min_result = -max_result;
787
788
5
        ColumnUInt8::MutablePtr col_null_map_to;
789
5
        NullMap::value_type* null_map_data = nullptr;
790
5
        if (narrow_integral) {
791
1
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
1
            null_map_data = col_null_map_to->get_data().data();
793
1
        }
794
795
5
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
5
        const auto& vec_from = col_from->get_data();
797
5
        const auto* vec_from_data = vec_from.data();
798
5
        auto& vec_to = col_to->get_data();
799
5
        auto* vec_to_data = vec_to.data();
800
801
5
        CastParameters params;
802
5
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
5
        size_t size = vec_from.size();
804
805
5
        RETURN_IF_ERROR(std::visit(
806
5
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
5
                    for (size_t i = 0; i < size; i++) {
808
5
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
5
                                                      typename ToDataType::FieldType,
810
5
                                                      multiply_may_overflow, narrow_integral>(
811
5
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
5
                                    scale_multiplier, min_result, max_result, params)) {
813
5
                            if (set_nullable) {
814
5
                                null_map_data[i] = 1;
815
5
                            } else {
816
5
                                return params.status;
817
5
                            }
818
5
                        }
819
5
                    }
820
5
                    return Status::OK();
821
5
                },
822
5
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
5
        if (narrow_integral) {
825
1
            block.get_by_position(result).column =
826
1
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
5
        return Status::OK();
831
5
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE3EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE4EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE5EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
19
                        const NullMap::value_type* null_map = nullptr) const override {
746
19
        using FromFieldType = typename FromDataType::FieldType;
747
19
        using ToFieldType = typename ToDataType::FieldType;
748
19
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
19
        const auto* col_from =
750
19
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
19
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
19
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
19
        constexpr UInt32 from_scale = 0;
758
759
19
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
19
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
19
        UInt32 to_precision = to_decimal_type.get_precision();
762
19
        ToDataType::check_type_precision(to_precision);
763
19
        UInt32 to_scale = to_decimal_type.get_scale();
764
19
        ToDataType::check_type_scale(to_scale);
765
766
19
        auto from_max_int_digit_count = from_precision - from_scale;
767
19
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
19
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
19
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
19
        constexpr UInt32 to_max_digits =
774
19
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
19
        bool multiply_may_overflow = false;
776
19
        if (to_scale > from_scale) {
777
12
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
12
        }
779
19
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
19
                                                  sizeof(typename ToFieldType::NativeType)),
781
19
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
19
        MaxNativeType scale_multiplier =
783
19
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
19
        typename ToFieldType::NativeType max_result =
785
19
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
19
        typename ToFieldType::NativeType min_result = -max_result;
787
788
19
        ColumnUInt8::MutablePtr col_null_map_to;
789
19
        NullMap::value_type* null_map_data = nullptr;
790
19
        if (narrow_integral) {
791
15
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
15
            null_map_data = col_null_map_to->get_data().data();
793
15
        }
794
795
19
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
19
        const auto& vec_from = col_from->get_data();
797
19
        const auto* vec_from_data = vec_from.data();
798
19
        auto& vec_to = col_to->get_data();
799
19
        auto* vec_to_data = vec_to.data();
800
801
19
        CastParameters params;
802
19
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
19
        size_t size = vec_from.size();
804
805
19
        RETURN_IF_ERROR(std::visit(
806
19
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
19
                    for (size_t i = 0; i < size; i++) {
808
19
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
19
                                                      typename ToDataType::FieldType,
810
19
                                                      multiply_may_overflow, narrow_integral>(
811
19
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
19
                                    scale_multiplier, min_result, max_result, params)) {
813
19
                            if (set_nullable) {
814
19
                                null_map_data[i] = 1;
815
19
                            } else {
816
19
                                return params.status;
817
19
                            }
818
19
                        }
819
19
                    }
820
19
                    return Status::OK();
821
19
                },
822
19
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
3
            block.get_by_position(result).column =
826
3
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
4
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
7
        return Status::OK();
831
19
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE6EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
10
                        const NullMap::value_type* null_map = nullptr) const override {
746
10
        using FromFieldType = typename FromDataType::FieldType;
747
10
        using ToFieldType = typename ToDataType::FieldType;
748
10
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
10
        const auto* col_from =
750
10
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
10
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
10
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
10
        constexpr UInt32 from_scale = 0;
758
759
10
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
10
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
10
        UInt32 to_precision = to_decimal_type.get_precision();
762
10
        ToDataType::check_type_precision(to_precision);
763
10
        UInt32 to_scale = to_decimal_type.get_scale();
764
10
        ToDataType::check_type_scale(to_scale);
765
766
10
        auto from_max_int_digit_count = from_precision - from_scale;
767
10
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
10
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
10
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
10
        constexpr UInt32 to_max_digits =
774
10
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
10
        bool multiply_may_overflow = false;
776
10
        if (to_scale > from_scale) {
777
6
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
6
        }
779
10
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
10
                                                  sizeof(typename ToFieldType::NativeType)),
781
10
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
10
        MaxNativeType scale_multiplier =
783
10
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
10
        typename ToFieldType::NativeType max_result =
785
10
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
10
        typename ToFieldType::NativeType min_result = -max_result;
787
788
10
        ColumnUInt8::MutablePtr col_null_map_to;
789
10
        NullMap::value_type* null_map_data = nullptr;
790
10
        if (narrow_integral) {
791
6
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
6
            null_map_data = col_null_map_to->get_data().data();
793
6
        }
794
795
10
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
10
        const auto& vec_from = col_from->get_data();
797
10
        const auto* vec_from_data = vec_from.data();
798
10
        auto& vec_to = col_to->get_data();
799
10
        auto* vec_to_data = vec_to.data();
800
801
10
        CastParameters params;
802
10
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
10
        size_t size = vec_from.size();
804
805
10
        RETURN_IF_ERROR(std::visit(
806
10
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
10
                    for (size_t i = 0; i < size; i++) {
808
10
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
10
                                                      typename ToDataType::FieldType,
810
10
                                                      multiply_may_overflow, narrow_integral>(
811
10
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
10
                                    scale_multiplier, min_result, max_result, params)) {
813
10
                            if (set_nullable) {
814
10
                                null_map_data[i] = 1;
815
10
                            } else {
816
10
                                return params.status;
817
10
                            }
818
10
                        }
819
10
                    }
820
10
                    return Status::OK();
821
10
                },
822
10
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
10
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
4
            block.get_by_position(result).column = std::move(col_to);
829
4
        }
830
10
        return Status::OK();
831
10
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
31
                        const NullMap::value_type* null_map = nullptr) const override {
746
31
        using FromFieldType = typename FromDataType::FieldType;
747
31
        using ToFieldType = typename ToDataType::FieldType;
748
31
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
31
        const auto* col_from =
750
31
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
31
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
31
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
31
        constexpr UInt32 from_scale = 0;
758
759
31
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
31
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
31
        UInt32 to_precision = to_decimal_type.get_precision();
762
31
        ToDataType::check_type_precision(to_precision);
763
31
        UInt32 to_scale = to_decimal_type.get_scale();
764
31
        ToDataType::check_type_scale(to_scale);
765
766
31
        auto from_max_int_digit_count = from_precision - from_scale;
767
31
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
31
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
31
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
31
        constexpr UInt32 to_max_digits =
774
31
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
31
        bool multiply_may_overflow = false;
776
31
        if (to_scale > from_scale) {
777
20
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
20
        }
779
31
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
31
                                                  sizeof(typename ToFieldType::NativeType)),
781
31
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
31
        MaxNativeType scale_multiplier =
783
31
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
31
        typename ToFieldType::NativeType max_result =
785
31
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
31
        typename ToFieldType::NativeType min_result = -max_result;
787
788
31
        ColumnUInt8::MutablePtr col_null_map_to;
789
31
        NullMap::value_type* null_map_data = nullptr;
790
31
        if (narrow_integral) {
791
30
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
30
            null_map_data = col_null_map_to->get_data().data();
793
30
        }
794
795
31
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
31
        const auto& vec_from = col_from->get_data();
797
31
        const auto* vec_from_data = vec_from.data();
798
31
        auto& vec_to = col_to->get_data();
799
31
        auto* vec_to_data = vec_to.data();
800
801
31
        CastParameters params;
802
31
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
31
        size_t size = vec_from.size();
804
805
31
        RETURN_IF_ERROR(std::visit(
806
31
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
31
                    for (size_t i = 0; i < size; i++) {
808
31
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
31
                                                      typename ToDataType::FieldType,
810
31
                                                      multiply_may_overflow, narrow_integral>(
811
31
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
31
                                    scale_multiplier, min_result, max_result, params)) {
813
31
                            if (set_nullable) {
814
31
                                null_map_data[i] = 1;
815
31
                            } else {
816
31
                                return params.status;
817
31
                            }
818
31
                        }
819
31
                    }
820
31
                    return Status::OK();
821
31
                },
822
31
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
7
        if (narrow_integral) {
825
6
            block.get_by_position(result).column =
826
6
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
6
        } else {
828
1
            block.get_by_position(result).column = std::move(col_to);
829
1
        }
830
7
        return Status::OK();
831
31
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE7EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
745
13
                        const NullMap::value_type* null_map = nullptr) const override {
746
13
        using FromFieldType = typename FromDataType::FieldType;
747
13
        using ToFieldType = typename ToDataType::FieldType;
748
13
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
749
13
        const auto* col_from =
750
13
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
751
13
        if (!col_from) {
752
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
753
0
                                        named_from.column->get_name());
754
0
        }
755
756
13
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
757
13
        constexpr UInt32 from_scale = 0;
758
759
13
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
760
13
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
761
13
        UInt32 to_precision = to_decimal_type.get_precision();
762
13
        ToDataType::check_type_precision(to_precision);
763
13
        UInt32 to_scale = to_decimal_type.get_scale();
764
13
        ToDataType::check_type_scale(to_scale);
765
766
13
        auto from_max_int_digit_count = from_precision - from_scale;
767
13
        auto to_max_int_digit_count = to_precision - to_scale;
768
        // may overflow. nullable result column.
769
13
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count);
770
        // only in non-strict mode and may overflow, we set nullable
771
13
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
772
773
13
        constexpr UInt32 to_max_digits =
774
13
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
775
13
        bool multiply_may_overflow = false;
776
13
        if (to_scale > from_scale) {
777
8
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
778
8
        }
779
13
        using MaxNativeType = std::conditional_t<(sizeof(FromFieldType) >
780
13
                                                  sizeof(typename ToFieldType::NativeType)),
781
13
                                                 FromFieldType, typename ToFieldType::NativeType>;
782
13
        MaxNativeType scale_multiplier =
783
13
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
784
13
        typename ToFieldType::NativeType max_result =
785
13
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
786
13
        typename ToFieldType::NativeType min_result = -max_result;
787
788
13
        ColumnUInt8::MutablePtr col_null_map_to;
789
13
        NullMap::value_type* null_map_data = nullptr;
790
13
        if (narrow_integral) {
791
12
            col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
792
12
            null_map_data = col_null_map_to->get_data().data();
793
12
        }
794
795
13
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
796
13
        const auto& vec_from = col_from->get_data();
797
13
        const auto* vec_from_data = vec_from.data();
798
13
        auto& vec_to = col_to->get_data();
799
13
        auto* vec_to_data = vec_to.data();
800
801
13
        CastParameters params;
802
13
        params.is_strict = (CastMode == CastModeType::StrictMode);
803
13
        size_t size = vec_from.size();
804
805
13
        RETURN_IF_ERROR(std::visit(
806
13
                [&](auto multiply_may_overflow, auto narrow_integral) {
807
13
                    for (size_t i = 0; i < size; i++) {
808
13
                        if (!CastToDecimal::_from_int<typename FromDataType::FieldType,
809
13
                                                      typename ToDataType::FieldType,
810
13
                                                      multiply_may_overflow, narrow_integral>(
811
13
                                    vec_from_data[i], vec_to_data[i], to_precision, to_scale,
812
13
                                    scale_multiplier, min_result, max_result, params)) {
813
13
                            if (set_nullable) {
814
13
                                null_map_data[i] = 1;
815
13
                            } else {
816
13
                                return params.status;
817
13
                            }
818
13
                        }
819
13
                    }
820
13
                    return Status::OK();
821
13
                },
822
13
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
823
824
13
        if (narrow_integral) {
825
12
            block.get_by_position(result).column =
826
12
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
827
12
        } else {
828
1
            block.get_by_position(result).column = std::move(col_to);
829
1
        }
830
13
        return Status::OK();
831
13
    }
832
};
833
834
// cast float and double to decimal. ALWAYS nullable result column.
835
template <CastModeType CastMode, typename FromDataType, typename ToDataType>
836
    requires(IsDataTypeDecimal<ToDataType> && IsDataTypeFloat<FromDataType>)
837
class CastToImpl<CastMode, FromDataType, ToDataType> : public CastToBase {
838
public:
839
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
840
                        uint32_t result, size_t input_rows_count,
841
784
                        const NullMap::value_type* null_map = nullptr) const override {
842
784
        using FromFieldType = typename FromDataType::FieldType;
843
784
        using ToFieldType = typename ToDataType::FieldType;
844
784
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
784
        const auto* col_from =
846
784
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
784
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
784
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
784
        UInt32 from_scale = 0;
854
855
784
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
784
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
784
        UInt32 to_precision = to_decimal_type.get_precision();
858
784
        ToDataType::check_type_precision(to_precision);
859
784
        UInt32 to_scale = to_decimal_type.get_scale();
860
784
        ToDataType::check_type_scale(to_scale);
861
862
784
        auto from_max_int_digit_count = from_precision - from_scale;
863
784
        auto to_max_int_digit_count = to_precision - to_scale;
864
784
        bool narrow_integral =
865
784
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
784
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
784
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
784
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
784
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
784
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
784
        const auto& vec_from = col_from->get_data();
875
784
        const auto* vec_from_data = vec_from.data();
876
784
        auto& vec_to = col_to->get_data();
877
784
        auto* vec_to_data = vec_to.data();
878
879
784
        CastParameters params;
880
784
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
784
        size_t size = vec_from.size();
882
883
784
        typename ToFieldType::NativeType scale_multiplier =
884
784
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
784
        typename ToFieldType::NativeType max_result =
886
784
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
784
        typename ToFieldType::NativeType min_result = -max_result;
888
3.99k
        for (size_t i = 0; i < size; i++) {
889
3.35k
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
3.35k
                                            typename ToDataType::FieldType>(
891
3.35k
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
3.35k
                        min_result, max_result, params)) {
893
288
                if (set_nullable) {
894
144
                    null_map_data[i] = 1;
895
144
                } else {
896
144
                    return params.status;
897
144
                }
898
288
            }
899
3.35k
        }
900
901
640
        block.get_by_position(result).column =
902
640
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
640
        return Status::OK();
904
784
    }
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Unexecuted instantiation: _ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_20EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
81
                        const NullMap::value_type* null_map = nullptr) const override {
842
81
        using FromFieldType = typename FromDataType::FieldType;
843
81
        using ToFieldType = typename ToDataType::FieldType;
844
81
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
81
        const auto* col_from =
846
81
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
81
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
81
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
81
        UInt32 from_scale = 0;
854
855
81
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
81
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
81
        UInt32 to_precision = to_decimal_type.get_precision();
858
81
        ToDataType::check_type_precision(to_precision);
859
81
        UInt32 to_scale = to_decimal_type.get_scale();
860
81
        ToDataType::check_type_scale(to_scale);
861
862
81
        auto from_max_int_digit_count = from_precision - from_scale;
863
81
        auto to_max_int_digit_count = to_precision - to_scale;
864
81
        bool narrow_integral =
865
81
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
81
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
81
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
81
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
81
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
81
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
81
        const auto& vec_from = col_from->get_data();
875
81
        const auto* vec_from_data = vec_from.data();
876
81
        auto& vec_to = col_to->get_data();
877
81
        auto* vec_to_data = vec_to.data();
878
879
81
        CastParameters params;
880
81
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
81
        size_t size = vec_from.size();
882
883
81
        typename ToFieldType::NativeType scale_multiplier =
884
81
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
81
        typename ToFieldType::NativeType max_result =
886
81
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
81
        typename ToFieldType::NativeType min_result = -max_result;
888
491
        for (size_t i = 0; i < size; i++) {
889
410
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
410
                                            typename ToDataType::FieldType>(
891
410
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
410
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
410
        }
900
901
81
        block.get_by_position(result).column =
902
81
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
81
        return Status::OK();
904
81
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
85
                        const NullMap::value_type* null_map = nullptr) const override {
842
85
        using FromFieldType = typename FromDataType::FieldType;
843
85
        using ToFieldType = typename ToDataType::FieldType;
844
85
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
85
        const auto* col_from =
846
85
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
85
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
85
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
85
        UInt32 from_scale = 0;
854
855
85
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
85
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
85
        UInt32 to_precision = to_decimal_type.get_precision();
858
85
        ToDataType::check_type_precision(to_precision);
859
85
        UInt32 to_scale = to_decimal_type.get_scale();
860
85
        ToDataType::check_type_scale(to_scale);
861
862
85
        auto from_max_int_digit_count = from_precision - from_scale;
863
85
        auto to_max_int_digit_count = to_precision - to_scale;
864
85
        bool narrow_integral =
865
85
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
85
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
85
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
85
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
85
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
85
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
85
        const auto& vec_from = col_from->get_data();
875
85
        const auto* vec_from_data = vec_from.data();
876
85
        auto& vec_to = col_to->get_data();
877
85
        auto* vec_to_data = vec_to.data();
878
879
85
        CastParameters params;
880
85
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
85
        size_t size = vec_from.size();
882
883
85
        typename ToFieldType::NativeType scale_multiplier =
884
85
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
85
        typename ToFieldType::NativeType max_result =
886
85
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
85
        typename ToFieldType::NativeType min_result = -max_result;
888
507
        for (size_t i = 0; i < size; i++) {
889
422
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
422
                                            typename ToDataType::FieldType>(
891
422
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
422
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
422
        }
900
901
85
        block.get_by_position(result).column =
902
85
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
85
        return Status::OK();
904
85
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
81
                        const NullMap::value_type* null_map = nullptr) const override {
842
81
        using FromFieldType = typename FromDataType::FieldType;
843
81
        using ToFieldType = typename ToDataType::FieldType;
844
81
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
81
        const auto* col_from =
846
81
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
81
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
81
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
81
        UInt32 from_scale = 0;
854
855
81
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
81
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
81
        UInt32 to_precision = to_decimal_type.get_precision();
858
81
        ToDataType::check_type_precision(to_precision);
859
81
        UInt32 to_scale = to_decimal_type.get_scale();
860
81
        ToDataType::check_type_scale(to_scale);
861
862
81
        auto from_max_int_digit_count = from_precision - from_scale;
863
81
        auto to_max_int_digit_count = to_precision - to_scale;
864
81
        bool narrow_integral =
865
81
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
81
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
81
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
81
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
81
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
81
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
81
        const auto& vec_from = col_from->get_data();
875
81
        const auto* vec_from_data = vec_from.data();
876
81
        auto& vec_to = col_to->get_data();
877
81
        auto* vec_to_data = vec_to.data();
878
879
81
        CastParameters params;
880
81
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
81
        size_t size = vec_from.size();
882
883
81
        typename ToFieldType::NativeType scale_multiplier =
884
81
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
81
        typename ToFieldType::NativeType max_result =
886
81
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
81
        typename ToFieldType::NativeType min_result = -max_result;
888
443
        for (size_t i = 0; i < size; i++) {
889
362
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
362
                                            typename ToDataType::FieldType>(
891
362
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
362
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
362
        }
900
901
81
        block.get_by_position(result).column =
902
81
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
81
        return Status::OK();
904
81
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
81
                        const NullMap::value_type* null_map = nullptr) const override {
842
81
        using FromFieldType = typename FromDataType::FieldType;
843
81
        using ToFieldType = typename ToDataType::FieldType;
844
81
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
81
        const auto* col_from =
846
81
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
81
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
81
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
81
        UInt32 from_scale = 0;
854
855
81
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
81
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
81
        UInt32 to_precision = to_decimal_type.get_precision();
858
81
        ToDataType::check_type_precision(to_precision);
859
81
        UInt32 to_scale = to_decimal_type.get_scale();
860
81
        ToDataType::check_type_scale(to_scale);
861
862
81
        auto from_max_int_digit_count = from_precision - from_scale;
863
81
        auto to_max_int_digit_count = to_precision - to_scale;
864
81
        bool narrow_integral =
865
81
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
81
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
81
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
81
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
81
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
81
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
81
        const auto& vec_from = col_from->get_data();
875
81
        const auto* vec_from_data = vec_from.data();
876
81
        auto& vec_to = col_to->get_data();
877
81
        auto* vec_to_data = vec_to.data();
878
879
81
        CastParameters params;
880
81
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
81
        size_t size = vec_from.size();
882
883
81
        typename ToFieldType::NativeType scale_multiplier =
884
81
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
81
        typename ToFieldType::NativeType max_result =
886
81
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
81
        typename ToFieldType::NativeType min_result = -max_result;
888
491
        for (size_t i = 0; i < size; i++) {
889
410
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
410
                                            typename ToDataType::FieldType>(
891
410
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
410
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
410
        }
900
901
81
        block.get_by_position(result).column =
902
81
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
81
        return Status::OK();
904
81
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
89
                        const NullMap::value_type* null_map = nullptr) const override {
842
89
        using FromFieldType = typename FromDataType::FieldType;
843
89
        using ToFieldType = typename ToDataType::FieldType;
844
89
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
89
        const auto* col_from =
846
89
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
89
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
89
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
89
        UInt32 from_scale = 0;
854
855
89
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
89
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
89
        UInt32 to_precision = to_decimal_type.get_precision();
858
89
        ToDataType::check_type_precision(to_precision);
859
89
        UInt32 to_scale = to_decimal_type.get_scale();
860
89
        ToDataType::check_type_scale(to_scale);
861
862
89
        auto from_max_int_digit_count = from_precision - from_scale;
863
89
        auto to_max_int_digit_count = to_precision - to_scale;
864
89
        bool narrow_integral =
865
89
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
89
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
89
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
89
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
89
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
89
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
89
        const auto& vec_from = col_from->get_data();
875
89
        const auto* vec_from_data = vec_from.data();
876
89
        auto& vec_to = col_to->get_data();
877
89
        auto* vec_to_data = vec_to.data();
878
879
89
        CastParameters params;
880
89
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
89
        size_t size = vec_from.size();
882
883
89
        typename ToFieldType::NativeType scale_multiplier =
884
89
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
89
        typename ToFieldType::NativeType max_result =
886
89
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
89
        typename ToFieldType::NativeType min_result = -max_result;
888
515
        for (size_t i = 0; i < size; i++) {
889
426
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
426
                                            typename ToDataType::FieldType>(
891
426
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
426
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
426
        }
900
901
89
        block.get_by_position(result).column =
902
89
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
89
        return Status::OK();
904
89
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
73
                        const NullMap::value_type* null_map = nullptr) const override {
842
73
        using FromFieldType = typename FromDataType::FieldType;
843
73
        using ToFieldType = typename ToDataType::FieldType;
844
73
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
73
        const auto* col_from =
846
73
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
73
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
73
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
73
        UInt32 from_scale = 0;
854
855
73
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
73
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
73
        UInt32 to_precision = to_decimal_type.get_precision();
858
73
        ToDataType::check_type_precision(to_precision);
859
73
        UInt32 to_scale = to_decimal_type.get_scale();
860
73
        ToDataType::check_type_scale(to_scale);
861
862
73
        auto from_max_int_digit_count = from_precision - from_scale;
863
73
        auto to_max_int_digit_count = to_precision - to_scale;
864
73
        bool narrow_integral =
865
73
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
73
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
73
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
73
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
73
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
73
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
73
        const auto& vec_from = col_from->get_data();
875
73
        const auto* vec_from_data = vec_from.data();
876
73
        auto& vec_to = col_to->get_data();
877
73
        auto* vec_to_data = vec_to.data();
878
879
73
        CastParameters params;
880
73
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
73
        size_t size = vec_from.size();
882
883
73
        typename ToFieldType::NativeType scale_multiplier =
884
73
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
73
        typename ToFieldType::NativeType max_result =
886
73
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
73
        typename ToFieldType::NativeType min_result = -max_result;
888
427
        for (size_t i = 0; i < size; i++) {
889
354
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
354
                                            typename ToDataType::FieldType>(
891
354
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
354
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
354
        }
900
901
73
        block.get_by_position(result).column =
902
73
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
73
        return Status::OK();
904
73
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE8EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
69
                        const NullMap::value_type* null_map = nullptr) const override {
842
69
        using FromFieldType = typename FromDataType::FieldType;
843
69
        using ToFieldType = typename ToDataType::FieldType;
844
69
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
69
        const auto* col_from =
846
69
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
69
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
69
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
69
        UInt32 from_scale = 0;
854
855
69
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
69
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
69
        UInt32 to_precision = to_decimal_type.get_precision();
858
69
        ToDataType::check_type_precision(to_precision);
859
69
        UInt32 to_scale = to_decimal_type.get_scale();
860
69
        ToDataType::check_type_scale(to_scale);
861
862
69
        auto from_max_int_digit_count = from_precision - from_scale;
863
69
        auto to_max_int_digit_count = to_precision - to_scale;
864
69
        bool narrow_integral =
865
69
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
69
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
69
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
69
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
69
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
69
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
69
        const auto& vec_from = col_from->get_data();
875
69
        const auto* vec_from_data = vec_from.data();
876
69
        auto& vec_to = col_to->get_data();
877
69
        auto* vec_to_data = vec_to.data();
878
879
69
        CastParameters params;
880
69
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
69
        size_t size = vec_from.size();
882
883
69
        typename ToFieldType::NativeType scale_multiplier =
884
69
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
69
        typename ToFieldType::NativeType max_result =
886
69
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
69
        typename ToFieldType::NativeType min_result = -max_result;
888
475
        for (size_t i = 0; i < size; i++) {
889
406
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
406
                                            typename ToDataType::FieldType>(
891
406
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
406
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
406
        }
900
901
69
        block.get_by_position(result).column =
902
69
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
69
        return Status::OK();
904
69
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
18
                        const NullMap::value_type* null_map = nullptr) const override {
842
18
        using FromFieldType = typename FromDataType::FieldType;
843
18
        using ToFieldType = typename ToDataType::FieldType;
844
18
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
18
        const auto* col_from =
846
18
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
18
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
18
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
18
        UInt32 from_scale = 0;
854
855
18
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
18
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
18
        UInt32 to_precision = to_decimal_type.get_precision();
858
18
        ToDataType::check_type_precision(to_precision);
859
18
        UInt32 to_scale = to_decimal_type.get_scale();
860
18
        ToDataType::check_type_scale(to_scale);
861
862
18
        auto from_max_int_digit_count = from_precision - from_scale;
863
18
        auto to_max_int_digit_count = to_precision - to_scale;
864
18
        bool narrow_integral =
865
18
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
18
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
18
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
18
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
18
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
18
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
18
        const auto& vec_from = col_from->get_data();
875
18
        const auto* vec_from_data = vec_from.data();
876
18
        auto& vec_to = col_to->get_data();
877
18
        auto* vec_to_data = vec_to.data();
878
879
18
        CastParameters params;
880
18
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
18
        size_t size = vec_from.size();
882
883
18
        typename ToFieldType::NativeType scale_multiplier =
884
18
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
18
        typename ToFieldType::NativeType max_result =
886
18
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
18
        typename ToFieldType::NativeType min_result = -max_result;
888
18
        for (size_t i = 0; i < size; i++) {
889
18
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
18
                                            typename ToDataType::FieldType>(
891
18
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
18
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
0
                    null_map_data[i] = 1;
895
18
                } else {
896
18
                    return params.status;
897
18
                }
898
18
            }
899
18
        }
900
901
0
        block.get_by_position(result).column =
902
0
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
0
        return Status::OK();
904
18
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_14DataTypeNumberILNS_13PrimitiveTypeE9EEENS_15DataTypeDecimalILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
841
81
                        const NullMap::value_type* null_map = nullptr) const override {
842
81
        using FromFieldType = typename FromDataType::FieldType;
843
81
        using ToFieldType = typename ToDataType::FieldType;
844
81
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
845
81
        const auto* col_from =
846
81
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
847
81
        if (!col_from) {
848
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
849
0
                                        named_from.column->get_name());
850
0
        }
851
852
81
        UInt32 from_precision = NumberTraits::max_ascii_len<FromFieldType>();
853
81
        UInt32 from_scale = 0;
854
855
81
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
856
81
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
857
81
        UInt32 to_precision = to_decimal_type.get_precision();
858
81
        ToDataType::check_type_precision(to_precision);
859
81
        UInt32 to_scale = to_decimal_type.get_scale();
860
81
        ToDataType::check_type_scale(to_scale);
861
862
81
        auto from_max_int_digit_count = from_precision - from_scale;
863
81
        auto to_max_int_digit_count = to_precision - to_scale;
864
81
        bool narrow_integral =
865
81
                (to_max_int_digit_count < from_max_int_digit_count) ||
866
81
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
867
        // only in non-strict mode and may overflow, we set nullable
868
81
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
869
870
81
        ColumnUInt8::MutablePtr col_null_map_to = ColumnUInt8::create(input_rows_count, 0);
871
81
        NullMap::value_type* null_map_data = col_null_map_to->get_data().data();
872
873
81
        auto col_to = ToDataType::ColumnType::create(input_rows_count, to_scale);
874
81
        const auto& vec_from = col_from->get_data();
875
81
        const auto* vec_from_data = vec_from.data();
876
81
        auto& vec_to = col_to->get_data();
877
81
        auto* vec_to_data = vec_to.data();
878
879
81
        CastParameters params;
880
81
        params.is_strict = (CastMode == CastModeType::StrictMode);
881
81
        size_t size = vec_from.size();
882
883
81
        typename ToFieldType::NativeType scale_multiplier =
884
81
                DataTypeDecimal<ToFieldType::PType>::get_scale_multiplier(to_scale);
885
81
        typename ToFieldType::NativeType max_result =
886
81
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
887
81
        typename ToFieldType::NativeType min_result = -max_result;
888
499
        for (size_t i = 0; i < size; i++) {
889
418
            if (!CastToDecimal::_from_float<typename FromDataType::FieldType,
890
418
                                            typename ToDataType::FieldType>(
891
418
                        vec_from_data[i], vec_to_data[i], to_precision, to_scale, scale_multiplier,
892
418
                        min_result, max_result, params)) {
893
18
                if (set_nullable) {
894
18
                    null_map_data[i] = 1;
895
18
                } else {
896
0
                    return params.status;
897
0
                }
898
18
            }
899
418
        }
900
901
81
        block.get_by_position(result).column =
902
81
                ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
903
81
        return Status::OK();
904
81
    }
905
};
906
907
// cast decimalv3 types to decimalv2 types
908
template <CastModeType CastMode, typename FromDataType, typename ToDataType>
909
    requires(IsDataTypeDecimalV3<ToDataType> && IsDataTypeDecimalV2<ToDataType>)
910
class CastToImpl<CastMode, FromDataType, ToDataType> : public CastToBase {
911
public:
912
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
913
                        uint32_t result, size_t input_rows_count,
914
                        const NullMap::value_type* null_map = nullptr) const override {
915
        return Status::RuntimeError(
916
                "not support {} ",
917
                cast_mode_type_to_string(CastMode, block.get_by_position(arguments[0]).type,
918
                                         block.get_by_position(result).type));
919
    }
920
};
921
922
// cast decimalv2 types to decimalv3 types
923
template <CastModeType CastMode, typename FromDataType, typename ToDataType>
924
    requires(IsDataTypeDecimalV2<FromDataType> && IsDataTypeDecimalV3<ToDataType>)
925
class CastToImpl<CastMode, FromDataType, ToDataType> : public CastToBase {
926
public:
927
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
928
                        uint32_t result, size_t input_rows_count,
929
608
                        const NullMap::value_type* null_map = nullptr) const override {
930
608
        using FromFieldType = typename FromDataType::FieldType;
931
608
        using ToFieldType = typename ToDataType::FieldType;
932
608
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
608
        const auto* col_from =
934
608
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
608
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
608
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
608
        UInt32 from_precision = from_decimal_type.get_precision();
942
608
        UInt32 from_scale = from_decimal_type.get_scale();
943
608
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
608
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
608
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
608
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
608
        UInt32 to_precision = to_decimal_type.get_precision();
949
608
        ToDataType::check_type_precision(to_precision);
950
608
        UInt32 to_scale = to_decimal_type.get_scale();
951
608
        ToDataType::check_type_scale(to_scale);
952
953
608
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
608
        auto to_max_int_digit_count = to_precision - to_scale;
955
608
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
608
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
216
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
608
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
608
        size_t size = col_from->size();
962
608
        ColumnUInt8::MutablePtr col_null_map_to;
963
608
        NullMap::value_type* null_map_data = nullptr;
964
608
        if (narrow_integral) {
965
410
            col_null_map_to = ColumnUInt8::create(size, 0);
966
410
            null_map_data = col_null_map_to->get_data().data();
967
410
        }
968
608
        CastParameters params;
969
608
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
608
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
608
        const auto& vec_from = col_from->get_data();
972
608
        const auto* vec_from_data = vec_from.data();
973
608
        auto& vec_to = col_to->get_data();
974
608
        auto* vec_to_data = vec_to.data();
975
976
608
        using MaxFieldType =
977
608
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
608
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
608
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
608
                                   Decimal128V3,
981
608
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
608
                                                      FromFieldType, ToFieldType>>;
983
608
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
608
        constexpr UInt32 to_max_digits =
986
608
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
608
        bool multiply_may_overflow = false;
988
608
        if (to_scale > from_scale) {
989
186
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
186
        }
991
992
608
        typename ToFieldType::NativeType max_result =
993
608
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
608
        typename ToFieldType::NativeType min_result = -max_result;
995
996
608
        MaxNativeType multiplier {};
997
608
        if (from_scale < to_scale) {
998
186
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
186
                                                                                    from_scale);
1000
422
        } else if (from_scale > to_scale) {
1001
388
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
388
                                                                                    to_scale);
1003
388
        }
1004
608
        RETURN_IF_ERROR(std::visit(
1005
608
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
608
                    for (size_t i = 0; i < size; i++) {
1007
608
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
608
                                                          multiply_may_overflow, narrow_integral>(
1009
608
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
608
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
608
                                    params)) {
1012
608
                            if (set_nullable) {
1013
608
                                null_map_data[i] = 1;
1014
608
                            } else {
1015
608
                                return params.status;
1016
608
                            }
1017
608
                        }
1018
608
                    }
1019
608
                    return Status::OK();
1020
608
                },
1021
608
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
387
        if (narrow_integral) {
1023
189
            block.get_by_position(result).column =
1024
189
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
198
        } else {
1026
198
            block.get_by_position(result).column = std::move(col_to);
1027
198
        }
1028
387
        return Status::OK();
1029
608
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
87
                        const NullMap::value_type* null_map = nullptr) const override {
930
87
        using FromFieldType = typename FromDataType::FieldType;
931
87
        using ToFieldType = typename ToDataType::FieldType;
932
87
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
87
        const auto* col_from =
934
87
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
87
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
87
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
87
        UInt32 from_precision = from_decimal_type.get_precision();
942
87
        UInt32 from_scale = from_decimal_type.get_scale();
943
87
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
87
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
87
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
87
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
87
        UInt32 to_precision = to_decimal_type.get_precision();
949
87
        ToDataType::check_type_precision(to_precision);
950
87
        UInt32 to_scale = to_decimal_type.get_scale();
951
87
        ToDataType::check_type_scale(to_scale);
952
953
87
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
87
        auto to_max_int_digit_count = to_precision - to_scale;
955
87
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
87
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
0
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
87
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
87
        size_t size = col_from->size();
962
87
        ColumnUInt8::MutablePtr col_null_map_to;
963
87
        NullMap::value_type* null_map_data = nullptr;
964
87
        if (narrow_integral) {
965
87
            col_null_map_to = ColumnUInt8::create(size, 0);
966
87
            null_map_data = col_null_map_to->get_data().data();
967
87
        }
968
87
        CastParameters params;
969
87
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
87
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
87
        const auto& vec_from = col_from->get_data();
972
87
        const auto* vec_from_data = vec_from.data();
973
87
        auto& vec_to = col_to->get_data();
974
87
        auto* vec_to_data = vec_to.data();
975
976
87
        using MaxFieldType =
977
87
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
87
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
87
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
87
                                   Decimal128V3,
981
87
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
87
                                                      FromFieldType, ToFieldType>>;
983
87
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
87
        constexpr UInt32 to_max_digits =
986
87
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
87
        bool multiply_may_overflow = false;
988
87
        if (to_scale > from_scale) {
989
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
0
        }
991
992
87
        typename ToFieldType::NativeType max_result =
993
87
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
87
        typename ToFieldType::NativeType min_result = -max_result;
995
996
87
        MaxNativeType multiplier {};
997
87
        if (from_scale < to_scale) {
998
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
0
                                                                                    from_scale);
1000
87
        } else if (from_scale > to_scale) {
1001
78
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
78
                                                                                    to_scale);
1003
78
        }
1004
87
        RETURN_IF_ERROR(std::visit(
1005
87
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
87
                    for (size_t i = 0; i < size; i++) {
1007
87
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
87
                                                          multiply_may_overflow, narrow_integral>(
1009
87
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
87
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
87
                                    params)) {
1012
87
                            if (set_nullable) {
1013
87
                                null_map_data[i] = 1;
1014
87
                            } else {
1015
87
                                return params.status;
1016
87
                            }
1017
87
                        }
1018
87
                    }
1019
87
                    return Status::OK();
1020
87
                },
1021
87
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
0
        if (narrow_integral) {
1023
0
            block.get_by_position(result).column =
1024
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
0
        } else {
1026
0
            block.get_by_position(result).column = std::move(col_to);
1027
0
        }
1028
0
        return Status::OK();
1029
87
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
74
                        const NullMap::value_type* null_map = nullptr) const override {
930
74
        using FromFieldType = typename FromDataType::FieldType;
931
74
        using ToFieldType = typename ToDataType::FieldType;
932
74
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
74
        const auto* col_from =
934
74
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
74
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
74
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
74
        UInt32 from_precision = from_decimal_type.get_precision();
942
74
        UInt32 from_scale = from_decimal_type.get_scale();
943
74
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
74
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
74
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
74
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
74
        UInt32 to_precision = to_decimal_type.get_precision();
949
74
        ToDataType::check_type_precision(to_precision);
950
74
        UInt32 to_scale = to_decimal_type.get_scale();
951
74
        ToDataType::check_type_scale(to_scale);
952
953
74
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
74
        auto to_max_int_digit_count = to_precision - to_scale;
955
74
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
74
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
18
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
74
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
74
        size_t size = col_from->size();
962
74
        ColumnUInt8::MutablePtr col_null_map_to;
963
74
        NullMap::value_type* null_map_data = nullptr;
964
74
        if (narrow_integral) {
965
56
            col_null_map_to = ColumnUInt8::create(size, 0);
966
56
            null_map_data = col_null_map_to->get_data().data();
967
56
        }
968
74
        CastParameters params;
969
74
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
74
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
74
        const auto& vec_from = col_from->get_data();
972
74
        const auto* vec_from_data = vec_from.data();
973
74
        auto& vec_to = col_to->get_data();
974
74
        auto* vec_to_data = vec_to.data();
975
976
74
        using MaxFieldType =
977
74
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
74
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
74
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
74
                                   Decimal128V3,
981
74
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
74
                                                      FromFieldType, ToFieldType>>;
983
74
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
74
        constexpr UInt32 to_max_digits =
986
74
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
74
        bool multiply_may_overflow = false;
988
74
        if (to_scale > from_scale) {
989
0
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
0
        }
991
992
74
        typename ToFieldType::NativeType max_result =
993
74
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
74
        typename ToFieldType::NativeType min_result = -max_result;
995
996
74
        MaxNativeType multiplier {};
997
74
        if (from_scale < to_scale) {
998
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
0
                                                                                    from_scale);
1000
74
        } else if (from_scale > to_scale) {
1001
67
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
67
                                                                                    to_scale);
1003
67
        }
1004
74
        RETURN_IF_ERROR(std::visit(
1005
74
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
74
                    for (size_t i = 0; i < size; i++) {
1007
74
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
74
                                                          multiply_may_overflow, narrow_integral>(
1009
74
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
74
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
74
                                    params)) {
1012
74
                            if (set_nullable) {
1013
74
                                null_map_data[i] = 1;
1014
74
                            } else {
1015
74
                                return params.status;
1016
74
                            }
1017
74
                        }
1018
74
                    }
1019
74
                    return Status::OK();
1020
74
                },
1021
74
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
74
        if (narrow_integral) {
1023
56
            block.get_by_position(result).column =
1024
56
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
56
        } else {
1026
18
            block.get_by_position(result).column = std::move(col_to);
1027
18
        }
1028
74
        return Status::OK();
1029
74
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
72
                        const NullMap::value_type* null_map = nullptr) const override {
930
72
        using FromFieldType = typename FromDataType::FieldType;
931
72
        using ToFieldType = typename ToDataType::FieldType;
932
72
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
72
        const auto* col_from =
934
72
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
72
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
72
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
72
        UInt32 from_precision = from_decimal_type.get_precision();
942
72
        UInt32 from_scale = from_decimal_type.get_scale();
943
72
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
72
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
72
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
72
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
72
        UInt32 to_precision = to_decimal_type.get_precision();
949
72
        ToDataType::check_type_precision(to_precision);
950
72
        UInt32 to_scale = to_decimal_type.get_scale();
951
72
        ToDataType::check_type_scale(to_scale);
952
953
72
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
72
        auto to_max_int_digit_count = to_precision - to_scale;
955
72
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
72
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
2
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
72
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
72
        size_t size = col_from->size();
962
72
        ColumnUInt8::MutablePtr col_null_map_to;
963
72
        NullMap::value_type* null_map_data = nullptr;
964
72
        if (narrow_integral) {
965
72
            col_null_map_to = ColumnUInt8::create(size, 0);
966
72
            null_map_data = col_null_map_to->get_data().data();
967
72
        }
968
72
        CastParameters params;
969
72
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
72
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
72
        const auto& vec_from = col_from->get_data();
972
72
        const auto* vec_from_data = vec_from.data();
973
72
        auto& vec_to = col_to->get_data();
974
72
        auto* vec_to_data = vec_to.data();
975
976
72
        using MaxFieldType =
977
72
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
72
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
72
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
72
                                   Decimal128V3,
981
72
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
72
                                                      FromFieldType, ToFieldType>>;
983
72
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
72
        constexpr UInt32 to_max_digits =
986
72
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
72
        bool multiply_may_overflow = false;
988
72
        if (to_scale > from_scale) {
989
24
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
24
        }
991
992
72
        typename ToFieldType::NativeType max_result =
993
72
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
72
        typename ToFieldType::NativeType min_result = -max_result;
995
996
72
        MaxNativeType multiplier {};
997
72
        if (from_scale < to_scale) {
998
24
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
24
                                                                                    from_scale);
1000
48
        } else if (from_scale > to_scale) {
1001
42
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
42
                                                                                    to_scale);
1003
42
        }
1004
72
        RETURN_IF_ERROR(std::visit(
1005
72
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
72
                    for (size_t i = 0; i < size; i++) {
1007
72
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
72
                                                          multiply_may_overflow, narrow_integral>(
1009
72
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
72
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
72
                                    params)) {
1012
72
                            if (set_nullable) {
1013
72
                                null_map_data[i] = 1;
1014
72
                            } else {
1015
72
                                return params.status;
1016
72
                            }
1017
72
                        }
1018
72
                    }
1019
72
                    return Status::OK();
1020
72
                },
1021
72
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
0
        if (narrow_integral) {
1023
0
            block.get_by_position(result).column =
1024
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
0
        } else {
1026
0
            block.get_by_position(result).column = std::move(col_to);
1027
0
        }
1028
0
        return Status::OK();
1029
72
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
108
                        const NullMap::value_type* null_map = nullptr) const override {
930
108
        using FromFieldType = typename FromDataType::FieldType;
931
108
        using ToFieldType = typename ToDataType::FieldType;
932
108
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
108
        const auto* col_from =
934
108
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
108
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
108
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
108
        UInt32 from_precision = from_decimal_type.get_precision();
942
108
        UInt32 from_scale = from_decimal_type.get_scale();
943
108
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
108
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
108
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
108
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
108
        UInt32 to_precision = to_decimal_type.get_precision();
949
108
        ToDataType::check_type_precision(to_precision);
950
108
        UInt32 to_scale = to_decimal_type.get_scale();
951
108
        ToDataType::check_type_scale(to_scale);
952
953
108
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
108
        auto to_max_int_digit_count = to_precision - to_scale;
955
108
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
108
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
45
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
108
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
108
        size_t size = col_from->size();
962
108
        ColumnUInt8::MutablePtr col_null_map_to;
963
108
        NullMap::value_type* null_map_data = nullptr;
964
108
        if (narrow_integral) {
965
70
            col_null_map_to = ColumnUInt8::create(size, 0);
966
70
            null_map_data = col_null_map_to->get_data().data();
967
70
        }
968
108
        CastParameters params;
969
108
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
108
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
108
        const auto& vec_from = col_from->get_data();
972
108
        const auto* vec_from_data = vec_from.data();
973
108
        auto& vec_to = col_to->get_data();
974
108
        auto* vec_to_data = vec_to.data();
975
976
108
        using MaxFieldType =
977
108
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
108
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
108
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
108
                                   Decimal128V3,
981
108
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
108
                                                      FromFieldType, ToFieldType>>;
983
108
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
108
        constexpr UInt32 to_max_digits =
986
108
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
108
        bool multiply_may_overflow = false;
988
108
        if (to_scale > from_scale) {
989
26
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
26
        }
991
992
108
        typename ToFieldType::NativeType max_result =
993
108
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
108
        typename ToFieldType::NativeType min_result = -max_result;
995
996
108
        MaxNativeType multiplier {};
997
108
        if (from_scale < to_scale) {
998
26
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
26
                                                                                    from_scale);
1000
82
        } else if (from_scale > to_scale) {
1001
70
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
70
                                                                                    to_scale);
1003
70
        }
1004
108
        RETURN_IF_ERROR(std::visit(
1005
108
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
108
                    for (size_t i = 0; i < size; i++) {
1007
108
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
108
                                                          multiply_may_overflow, narrow_integral>(
1009
108
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
108
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
108
                                    params)) {
1012
108
                            if (set_nullable) {
1013
108
                                null_map_data[i] = 1;
1014
108
                            } else {
1015
108
                                return params.status;
1016
108
                            }
1017
108
                        }
1018
108
                    }
1019
108
                    return Status::OK();
1020
108
                },
1021
108
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
108
        if (narrow_integral) {
1023
70
            block.get_by_position(result).column =
1024
70
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
70
        } else {
1026
38
            block.get_by_position(result).column = std::move(col_to);
1027
38
        }
1028
108
        return Status::OK();
1029
108
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
32
                        const NullMap::value_type* null_map = nullptr) const override {
930
32
        using FromFieldType = typename FromDataType::FieldType;
931
32
        using ToFieldType = typename ToDataType::FieldType;
932
32
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
32
        const auto* col_from =
934
32
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
32
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
32
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
32
        UInt32 from_precision = from_decimal_type.get_precision();
942
32
        UInt32 from_scale = from_decimal_type.get_scale();
943
32
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
32
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
32
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
32
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
32
        UInt32 to_precision = to_decimal_type.get_precision();
949
32
        ToDataType::check_type_precision(to_precision);
950
32
        UInt32 to_scale = to_decimal_type.get_scale();
951
32
        ToDataType::check_type_scale(to_scale);
952
953
32
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
32
        auto to_max_int_digit_count = to_precision - to_scale;
955
32
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
32
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
2
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
32
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
32
        size_t size = col_from->size();
962
32
        ColumnUInt8::MutablePtr col_null_map_to;
963
32
        NullMap::value_type* null_map_data = nullptr;
964
32
        if (narrow_integral) {
965
32
            col_null_map_to = ColumnUInt8::create(size, 0);
966
32
            null_map_data = col_null_map_to->get_data().data();
967
32
        }
968
32
        CastParameters params;
969
32
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
32
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
32
        const auto& vec_from = col_from->get_data();
972
32
        const auto* vec_from_data = vec_from.data();
973
32
        auto& vec_to = col_to->get_data();
974
32
        auto* vec_to_data = vec_to.data();
975
976
32
        using MaxFieldType =
977
32
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
32
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
32
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
32
                                   Decimal128V3,
981
32
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
32
                                                      FromFieldType, ToFieldType>>;
983
32
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
32
        constexpr UInt32 to_max_digits =
986
32
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
32
        bool multiply_may_overflow = false;
988
32
        if (to_scale > from_scale) {
989
30
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
30
        }
991
992
32
        typename ToFieldType::NativeType max_result =
993
32
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
32
        typename ToFieldType::NativeType min_result = -max_result;
995
996
32
        MaxNativeType multiplier {};
997
32
        if (from_scale < to_scale) {
998
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
30
                                                                                    from_scale);
1000
30
        } else if (from_scale > to_scale) {
1001
2
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
2
                                                                                    to_scale);
1003
2
        }
1004
32
        RETURN_IF_ERROR(std::visit(
1005
32
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
32
                    for (size_t i = 0; i < size; i++) {
1007
32
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
32
                                                          multiply_may_overflow, narrow_integral>(
1009
32
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
32
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
32
                                    params)) {
1012
32
                            if (set_nullable) {
1013
32
                                null_map_data[i] = 1;
1014
32
                            } else {
1015
32
                                return params.status;
1016
32
                            }
1017
32
                        }
1018
32
                    }
1019
32
                    return Status::OK();
1020
32
                },
1021
32
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
0
        if (narrow_integral) {
1023
0
            block.get_by_position(result).column =
1024
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
0
        } else {
1026
0
            block.get_by_position(result).column = std::move(col_to);
1027
0
        }
1028
0
        return Status::OK();
1029
32
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
103
                        const NullMap::value_type* null_map = nullptr) const override {
930
103
        using FromFieldType = typename FromDataType::FieldType;
931
103
        using ToFieldType = typename ToDataType::FieldType;
932
103
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
103
        const auto* col_from =
934
103
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
103
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
103
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
103
        UInt32 from_precision = from_decimal_type.get_precision();
942
103
        UInt32 from_scale = from_decimal_type.get_scale();
943
103
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
103
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
103
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
103
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
103
        UInt32 to_precision = to_decimal_type.get_precision();
949
103
        ToDataType::check_type_precision(to_precision);
950
103
        UInt32 to_scale = to_decimal_type.get_scale();
951
103
        ToDataType::check_type_scale(to_scale);
952
953
103
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
103
        auto to_max_int_digit_count = to_precision - to_scale;
955
103
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
103
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
75
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
103
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
103
        size_t size = col_from->size();
962
103
        ColumnUInt8::MutablePtr col_null_map_to;
963
103
        NullMap::value_type* null_map_data = nullptr;
964
103
        if (narrow_integral) {
965
35
            col_null_map_to = ColumnUInt8::create(size, 0);
966
35
            null_map_data = col_null_map_to->get_data().data();
967
35
        }
968
103
        CastParameters params;
969
103
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
103
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
103
        const auto& vec_from = col_from->get_data();
972
103
        const auto* vec_from_data = vec_from.data();
973
103
        auto& vec_to = col_to->get_data();
974
103
        auto* vec_to_data = vec_to.data();
975
976
103
        using MaxFieldType =
977
103
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
103
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
103
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
103
                                   Decimal128V3,
981
103
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
103
                                                      FromFieldType, ToFieldType>>;
983
103
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
103
        constexpr UInt32 to_max_digits =
986
103
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
103
        bool multiply_may_overflow = false;
988
103
        if (to_scale > from_scale) {
989
38
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
38
        }
991
992
103
        typename ToFieldType::NativeType max_result =
993
103
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
103
        typename ToFieldType::NativeType min_result = -max_result;
995
996
103
        MaxNativeType multiplier {};
997
103
        if (from_scale < to_scale) {
998
38
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
38
                                                                                    from_scale);
1000
65
        } else if (from_scale > to_scale) {
1001
65
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
65
                                                                                    to_scale);
1003
65
        }
1004
103
        RETURN_IF_ERROR(std::visit(
1005
103
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
103
                    for (size_t i = 0; i < size; i++) {
1007
103
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
103
                                                          multiply_may_overflow, narrow_integral>(
1009
103
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
103
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
103
                                    params)) {
1012
103
                            if (set_nullable) {
1013
103
                                null_map_data[i] = 1;
1014
103
                            } else {
1015
103
                                return params.status;
1016
103
                            }
1017
103
                        }
1018
103
                    }
1019
103
                    return Status::OK();
1020
103
                },
1021
103
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
103
        if (narrow_integral) {
1023
35
            block.get_by_position(result).column =
1024
35
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
68
        } else {
1026
68
            block.get_by_position(result).column = std::move(col_to);
1027
68
        }
1028
103
        return Status::OK();
1029
103
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
30
                        const NullMap::value_type* null_map = nullptr) const override {
930
30
        using FromFieldType = typename FromDataType::FieldType;
931
30
        using ToFieldType = typename ToDataType::FieldType;
932
30
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
30
        const auto* col_from =
934
30
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
30
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
30
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
30
        UInt32 from_precision = from_decimal_type.get_precision();
942
30
        UInt32 from_scale = from_decimal_type.get_scale();
943
30
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
30
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
30
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
30
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
30
        UInt32 to_precision = to_decimal_type.get_precision();
949
30
        ToDataType::check_type_precision(to_precision);
950
30
        UInt32 to_scale = to_decimal_type.get_scale();
951
30
        ToDataType::check_type_scale(to_scale);
952
953
30
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
30
        auto to_max_int_digit_count = to_precision - to_scale;
955
30
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
30
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
0
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
30
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
30
        size_t size = col_from->size();
962
30
        ColumnUInt8::MutablePtr col_null_map_to;
963
30
        NullMap::value_type* null_map_data = nullptr;
964
30
        if (narrow_integral) {
965
30
            col_null_map_to = ColumnUInt8::create(size, 0);
966
30
            null_map_data = col_null_map_to->get_data().data();
967
30
        }
968
30
        CastParameters params;
969
30
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
30
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
30
        const auto& vec_from = col_from->get_data();
972
30
        const auto* vec_from_data = vec_from.data();
973
30
        auto& vec_to = col_to->get_data();
974
30
        auto* vec_to_data = vec_to.data();
975
976
30
        using MaxFieldType =
977
30
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
30
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
30
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
30
                                   Decimal128V3,
981
30
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
30
                                                      FromFieldType, ToFieldType>>;
983
30
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
30
        constexpr UInt32 to_max_digits =
986
30
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
30
        bool multiply_may_overflow = false;
988
30
        if (to_scale > from_scale) {
989
30
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
30
        }
991
992
30
        typename ToFieldType::NativeType max_result =
993
30
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
30
        typename ToFieldType::NativeType min_result = -max_result;
995
996
30
        MaxNativeType multiplier {};
997
30
        if (from_scale < to_scale) {
998
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
30
                                                                                    from_scale);
1000
30
        } else if (from_scale > to_scale) {
1001
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
0
                                                                                    to_scale);
1003
0
        }
1004
30
        RETURN_IF_ERROR(std::visit(
1005
30
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
30
                    for (size_t i = 0; i < size; i++) {
1007
30
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
30
                                                          multiply_may_overflow, narrow_integral>(
1009
30
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
30
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
30
                                    params)) {
1012
30
                            if (set_nullable) {
1013
30
                                null_map_data[i] = 1;
1014
30
                            } else {
1015
30
                                return params.status;
1016
30
                            }
1017
30
                        }
1018
30
                    }
1019
30
                    return Status::OK();
1020
30
                },
1021
30
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
0
        if (narrow_integral) {
1023
0
            block.get_by_position(result).column =
1024
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
0
        } else {
1026
0
            block.get_by_position(result).column = std::move(col_to);
1027
0
        }
1028
0
        return Status::OK();
1029
30
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE20EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
929
102
                        const NullMap::value_type* null_map = nullptr) const override {
930
102
        using FromFieldType = typename FromDataType::FieldType;
931
102
        using ToFieldType = typename ToDataType::FieldType;
932
102
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
933
102
        const auto* col_from =
934
102
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
935
102
        if (!col_from) {
936
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
937
0
                                        named_from.column->get_name());
938
0
        }
939
940
102
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
941
102
        UInt32 from_precision = from_decimal_type.get_precision();
942
102
        UInt32 from_scale = from_decimal_type.get_scale();
943
102
        UInt32 from_original_precision = from_decimal_type.get_original_precision();
944
102
        UInt32 from_original_scale = from_decimal_type.get_original_scale();
945
946
102
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
947
102
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
948
102
        UInt32 to_precision = to_decimal_type.get_precision();
949
102
        ToDataType::check_type_precision(to_precision);
950
102
        UInt32 to_scale = to_decimal_type.get_scale();
951
102
        ToDataType::check_type_scale(to_scale);
952
953
102
        auto from_max_int_digit_count = from_original_precision - from_original_scale;
954
102
        auto to_max_int_digit_count = to_precision - to_scale;
955
102
        bool narrow_integral = (to_max_int_digit_count < from_max_int_digit_count) ||
956
102
                               (to_max_int_digit_count == from_max_int_digit_count &&
957
74
                                to_scale < from_original_scale);
958
        // only in non-strict mode and may overflow, we set nullable
959
102
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
960
961
102
        size_t size = col_from->size();
962
102
        ColumnUInt8::MutablePtr col_null_map_to;
963
102
        NullMap::value_type* null_map_data = nullptr;
964
102
        if (narrow_integral) {
965
28
            col_null_map_to = ColumnUInt8::create(size, 0);
966
28
            null_map_data = col_null_map_to->get_data().data();
967
28
        }
968
102
        CastParameters params;
969
102
        params.is_strict = (CastMode == CastModeType::StrictMode);
970
102
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
971
102
        const auto& vec_from = col_from->get_data();
972
102
        const auto* vec_from_data = vec_from.data();
973
102
        auto& vec_to = col_to->get_data();
974
102
        auto* vec_to_data = vec_to.data();
975
976
102
        using MaxFieldType =
977
102
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
978
102
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
979
102
                                            std::is_same_v<FromFieldType, Decimal128V3>),
980
102
                                   Decimal128V3,
981
102
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
982
102
                                                      FromFieldType, ToFieldType>>;
983
102
        using MaxNativeType = typename MaxFieldType::NativeType;
984
985
102
        constexpr UInt32 to_max_digits =
986
102
                NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
987
102
        bool multiply_may_overflow = false;
988
102
        if (to_scale > from_scale) {
989
38
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
990
38
        }
991
992
102
        typename ToFieldType::NativeType max_result =
993
102
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
994
102
        typename ToFieldType::NativeType min_result = -max_result;
995
996
102
        MaxNativeType multiplier {};
997
102
        if (from_scale < to_scale) {
998
38
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
999
38
                                                                                    from_scale);
1000
64
        } else if (from_scale > to_scale) {
1001
64
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1002
64
                                                                                    to_scale);
1003
64
        }
1004
102
        RETURN_IF_ERROR(std::visit(
1005
102
                [&](auto multiply_may_overflow, auto narrow_integral) {
1006
102
                    for (size_t i = 0; i < size; i++) {
1007
102
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1008
102
                                                          multiply_may_overflow, narrow_integral>(
1009
102
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1010
102
                                    to_precision, to_scale, min_result, max_result, multiplier,
1011
102
                                    params)) {
1012
102
                            if (set_nullable) {
1013
102
                                null_map_data[i] = 1;
1014
102
                            } else {
1015
102
                                return params.status;
1016
102
                            }
1017
102
                        }
1018
102
                    }
1019
102
                    return Status::OK();
1020
102
                },
1021
102
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1022
102
        if (narrow_integral) {
1023
28
            block.get_by_position(result).column =
1024
28
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1025
74
        } else {
1026
74
            block.get_by_position(result).column = std::move(col_to);
1027
74
        }
1028
102
        return Status::OK();
1029
102
    }
1030
};
1031
1032
// cast between decimalv3 types
1033
template <CastModeType CastMode, typename FromDataType, typename ToDataType>
1034
    requires(IsDataTypeDecimalV3<ToDataType> && IsDataTypeDecimalV3<FromDataType>)
1035
class CastToImpl<CastMode, FromDataType, ToDataType> : public CastToBase {
1036
public:
1037
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
1038
                        uint32_t result, size_t input_rows_count,
1039
4.27k
                        const NullMap::value_type* null_map = nullptr) const override {
1040
4.27k
        using FromFieldType = typename FromDataType::FieldType;
1041
4.27k
        using ToFieldType = typename ToDataType::FieldType;
1042
4.27k
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
4.27k
        const auto* col_from =
1044
4.27k
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
4.27k
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
4.27k
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
4.27k
        UInt32 from_precision = from_decimal_type.get_precision();
1052
4.27k
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
4.27k
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
4.27k
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
4.27k
        UInt32 to_precision = to_decimal_type.get_precision();
1057
4.27k
        ToDataType::check_type_precision(to_precision);
1058
4.27k
        UInt32 to_scale = to_decimal_type.get_scale();
1059
4.27k
        ToDataType::check_type_scale(to_scale);
1060
1061
4.27k
        auto from_max_int_digit_count = from_precision - from_scale;
1062
4.27k
        auto to_max_int_digit_count = to_precision - to_scale;
1063
4.27k
        bool narrow_integral =
1064
4.27k
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
4.27k
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
4.27k
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
4.27k
        size_t size = col_from->size();
1070
4.27k
        ColumnUInt8::MutablePtr col_null_map_to;
1071
4.27k
        NullMap::value_type* null_map_data = nullptr;
1072
4.27k
        if (narrow_integral) {
1073
3.10k
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
3.10k
            null_map_data = col_null_map_to->get_data().data();
1075
3.10k
        }
1076
4.27k
        CastParameters params;
1077
4.27k
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
4.27k
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
4.27k
        const auto& vec_from = col_from->get_data();
1080
4.27k
        const auto* vec_from_data = vec_from.data();
1081
4.27k
        auto& vec_to = col_to->get_data();
1082
4.27k
        auto* vec_to_data = vec_to.data();
1083
1084
4.27k
        using MaxFieldType =
1085
4.27k
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
4.27k
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
4.27k
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
4.27k
                                   Decimal128V3,
1089
4.27k
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
4.27k
                                                      FromFieldType, ToFieldType>>;
1091
4.27k
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
4.27k
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
4.27k
        bool multiply_may_overflow = false;
1095
4.27k
        if (to_scale > from_scale) {
1096
1.95k
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
1.95k
        }
1098
1099
4.27k
        typename ToFieldType::NativeType max_result =
1100
4.27k
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
4.27k
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
4.27k
        MaxNativeType multiplier {};
1104
4.27k
        if (from_scale < to_scale) {
1105
1.95k
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
1.95k
                                                                                    from_scale);
1107
2.31k
        } else if (from_scale > to_scale) {
1108
1.51k
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
1.51k
                                                                                    to_scale);
1110
1.51k
        }
1111
4.27k
        RETURN_IF_ERROR(std::visit(
1112
4.27k
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
4.27k
                    for (size_t i = 0; i < size; i++) {
1114
4.27k
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
4.27k
                                                          multiply_may_overflow, narrow_integral>(
1116
4.27k
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
4.27k
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
4.27k
                                    params)) {
1119
4.27k
                            if (set_nullable) {
1120
4.27k
                                null_map_data[i] = 1;
1121
4.27k
                            } else {
1122
4.27k
                                return params.status;
1123
4.27k
                            }
1124
4.27k
                        }
1125
4.27k
                    }
1126
4.27k
                    return Status::OK();
1127
4.27k
                },
1128
4.27k
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
2.77k
        if (narrow_integral) {
1130
1.60k
            block.get_by_position(result).column =
1131
1.60k
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
1.60k
        } else {
1133
1.17k
            block.get_by_position(result).column = std::move(col_to);
1134
1.17k
        }
1135
2.77k
        return Status::OK();
1136
4.27k
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
53
                        const NullMap::value_type* null_map = nullptr) const override {
1040
53
        using FromFieldType = typename FromDataType::FieldType;
1041
53
        using ToFieldType = typename ToDataType::FieldType;
1042
53
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
53
        const auto* col_from =
1044
53
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
53
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
53
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
53
        UInt32 from_precision = from_decimal_type.get_precision();
1052
53
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
53
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
53
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
53
        UInt32 to_precision = to_decimal_type.get_precision();
1057
53
        ToDataType::check_type_precision(to_precision);
1058
53
        UInt32 to_scale = to_decimal_type.get_scale();
1059
53
        ToDataType::check_type_scale(to_scale);
1060
1061
53
        auto from_max_int_digit_count = from_precision - from_scale;
1062
53
        auto to_max_int_digit_count = to_precision - to_scale;
1063
53
        bool narrow_integral =
1064
53
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
53
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
53
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
53
        size_t size = col_from->size();
1070
53
        ColumnUInt8::MutablePtr col_null_map_to;
1071
53
        NullMap::value_type* null_map_data = nullptr;
1072
53
        if (narrow_integral) {
1073
53
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
53
            null_map_data = col_null_map_to->get_data().data();
1075
53
        }
1076
53
        CastParameters params;
1077
53
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
53
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
53
        const auto& vec_from = col_from->get_data();
1080
53
        const auto* vec_from_data = vec_from.data();
1081
53
        auto& vec_to = col_to->get_data();
1082
53
        auto* vec_to_data = vec_to.data();
1083
1084
53
        using MaxFieldType =
1085
53
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
53
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
53
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
53
                                   Decimal128V3,
1089
53
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
53
                                                      FromFieldType, ToFieldType>>;
1091
53
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
53
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
53
        bool multiply_may_overflow = false;
1095
53
        if (to_scale > from_scale) {
1096
27
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
27
        }
1098
1099
53
        typename ToFieldType::NativeType max_result =
1100
53
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
53
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
53
        MaxNativeType multiplier {};
1104
53
        if (from_scale < to_scale) {
1105
27
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
27
                                                                                    from_scale);
1107
27
        } else if (from_scale > to_scale) {
1108
20
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
20
                                                                                    to_scale);
1110
20
        }
1111
53
        RETURN_IF_ERROR(std::visit(
1112
53
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
53
                    for (size_t i = 0; i < size; i++) {
1114
53
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
53
                                                          multiply_may_overflow, narrow_integral>(
1116
53
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
53
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
53
                                    params)) {
1119
53
                            if (set_nullable) {
1120
53
                                null_map_data[i] = 1;
1121
53
                            } else {
1122
53
                                return params.status;
1123
53
                            }
1124
53
                        }
1125
53
                    }
1126
53
                    return Status::OK();
1127
53
                },
1128
53
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
53
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
75
                        const NullMap::value_type* null_map = nullptr) const override {
1040
75
        using FromFieldType = typename FromDataType::FieldType;
1041
75
        using ToFieldType = typename ToDataType::FieldType;
1042
75
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
75
        const auto* col_from =
1044
75
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
75
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
75
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
75
        UInt32 from_precision = from_decimal_type.get_precision();
1052
75
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
75
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
75
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
75
        UInt32 to_precision = to_decimal_type.get_precision();
1057
75
        ToDataType::check_type_precision(to_precision);
1058
75
        UInt32 to_scale = to_decimal_type.get_scale();
1059
75
        ToDataType::check_type_scale(to_scale);
1060
1061
75
        auto from_max_int_digit_count = from_precision - from_scale;
1062
75
        auto to_max_int_digit_count = to_precision - to_scale;
1063
75
        bool narrow_integral =
1064
75
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
75
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
75
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
75
        size_t size = col_from->size();
1070
75
        ColumnUInt8::MutablePtr col_null_map_to;
1071
75
        NullMap::value_type* null_map_data = nullptr;
1072
75
        if (narrow_integral) {
1073
45
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
45
            null_map_data = col_null_map_to->get_data().data();
1075
45
        }
1076
75
        CastParameters params;
1077
75
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
75
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
75
        const auto& vec_from = col_from->get_data();
1080
75
        const auto* vec_from_data = vec_from.data();
1081
75
        auto& vec_to = col_to->get_data();
1082
75
        auto* vec_to_data = vec_to.data();
1083
1084
75
        using MaxFieldType =
1085
75
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
75
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
75
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
75
                                   Decimal128V3,
1089
75
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
75
                                                      FromFieldType, ToFieldType>>;
1091
75
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
75
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
75
        bool multiply_may_overflow = false;
1095
75
        if (to_scale > from_scale) {
1096
35
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
35
        }
1098
1099
75
        typename ToFieldType::NativeType max_result =
1100
75
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
75
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
75
        MaxNativeType multiplier {};
1104
75
        if (from_scale < to_scale) {
1105
35
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
35
                                                                                    from_scale);
1107
40
        } else if (from_scale > to_scale) {
1108
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
30
                                                                                    to_scale);
1110
30
        }
1111
75
        RETURN_IF_ERROR(std::visit(
1112
75
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
75
                    for (size_t i = 0; i < size; i++) {
1114
75
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
75
                                                          multiply_may_overflow, narrow_integral>(
1116
75
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
75
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
75
                                    params)) {
1119
75
                            if (set_nullable) {
1120
75
                                null_map_data[i] = 1;
1121
75
                            } else {
1122
75
                                return params.status;
1123
75
                            }
1124
75
                        }
1125
75
                    }
1126
75
                    return Status::OK();
1127
75
                },
1128
75
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
75
        if (narrow_integral) {
1130
45
            block.get_by_position(result).column =
1131
45
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
45
        } else {
1133
30
            block.get_by_position(result).column = std::move(col_to);
1134
30
        }
1135
75
        return Status::OK();
1136
75
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
129
                        const NullMap::value_type* null_map = nullptr) const override {
1040
129
        using FromFieldType = typename FromDataType::FieldType;
1041
129
        using ToFieldType = typename ToDataType::FieldType;
1042
129
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
129
        const auto* col_from =
1044
129
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
129
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
129
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
129
        UInt32 from_precision = from_decimal_type.get_precision();
1052
129
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
129
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
129
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
129
        UInt32 to_precision = to_decimal_type.get_precision();
1057
129
        ToDataType::check_type_precision(to_precision);
1058
129
        UInt32 to_scale = to_decimal_type.get_scale();
1059
129
        ToDataType::check_type_scale(to_scale);
1060
1061
129
        auto from_max_int_digit_count = from_precision - from_scale;
1062
129
        auto to_max_int_digit_count = to_precision - to_scale;
1063
129
        bool narrow_integral =
1064
129
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
129
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
129
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
129
        size_t size = col_from->size();
1070
129
        ColumnUInt8::MutablePtr col_null_map_to;
1071
129
        NullMap::value_type* null_map_data = nullptr;
1072
129
        if (narrow_integral) {
1073
129
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
129
            null_map_data = col_null_map_to->get_data().data();
1075
129
        }
1076
129
        CastParameters params;
1077
129
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
129
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
129
        const auto& vec_from = col_from->get_data();
1080
129
        const auto* vec_from_data = vec_from.data();
1081
129
        auto& vec_to = col_to->get_data();
1082
129
        auto* vec_to_data = vec_to.data();
1083
1084
129
        using MaxFieldType =
1085
129
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
129
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
129
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
129
                                   Decimal128V3,
1089
129
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
129
                                                      FromFieldType, ToFieldType>>;
1091
129
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
129
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
129
        bool multiply_may_overflow = false;
1095
129
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
129
        typename ToFieldType::NativeType max_result =
1100
129
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
129
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
129
        MaxNativeType multiplier {};
1104
129
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
93
        } else if (from_scale > to_scale) {
1108
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
66
                                                                                    to_scale);
1110
66
        }
1111
129
        RETURN_IF_ERROR(std::visit(
1112
129
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
129
                    for (size_t i = 0; i < size; i++) {
1114
129
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
129
                                                          multiply_may_overflow, narrow_integral>(
1116
129
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
129
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
129
                                    params)) {
1119
129
                            if (set_nullable) {
1120
129
                                null_map_data[i] = 1;
1121
129
                            } else {
1122
129
                                return params.status;
1123
129
                            }
1124
129
                        }
1125
129
                    }
1126
129
                    return Status::OK();
1127
129
                },
1128
129
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
129
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
156
                        const NullMap::value_type* null_map = nullptr) const override {
1040
156
        using FromFieldType = typename FromDataType::FieldType;
1041
156
        using ToFieldType = typename ToDataType::FieldType;
1042
156
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
156
        const auto* col_from =
1044
156
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
156
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
156
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
156
        UInt32 from_precision = from_decimal_type.get_precision();
1052
156
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
156
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
156
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
156
        UInt32 to_precision = to_decimal_type.get_precision();
1057
156
        ToDataType::check_type_precision(to_precision);
1058
156
        UInt32 to_scale = to_decimal_type.get_scale();
1059
156
        ToDataType::check_type_scale(to_scale);
1060
1061
156
        auto from_max_int_digit_count = from_precision - from_scale;
1062
156
        auto to_max_int_digit_count = to_precision - to_scale;
1063
156
        bool narrow_integral =
1064
156
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
156
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
156
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
156
        size_t size = col_from->size();
1070
156
        ColumnUInt8::MutablePtr col_null_map_to;
1071
156
        NullMap::value_type* null_map_data = nullptr;
1072
156
        if (narrow_integral) {
1073
136
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
136
            null_map_data = col_null_map_to->get_data().data();
1075
136
        }
1076
156
        CastParameters params;
1077
156
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
156
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
156
        const auto& vec_from = col_from->get_data();
1080
156
        const auto* vec_from_data = vec_from.data();
1081
156
        auto& vec_to = col_to->get_data();
1082
156
        auto* vec_to_data = vec_to.data();
1083
1084
156
        using MaxFieldType =
1085
156
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
156
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
156
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
156
                                   Decimal128V3,
1089
156
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
156
                                                      FromFieldType, ToFieldType>>;
1091
156
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
156
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
156
        bool multiply_may_overflow = false;
1095
156
        if (to_scale > from_scale) {
1096
42
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
42
        }
1098
1099
156
        typename ToFieldType::NativeType max_result =
1100
156
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
156
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
156
        MaxNativeType multiplier {};
1104
156
        if (from_scale < to_scale) {
1105
42
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
42
                                                                                    from_scale);
1107
114
        } else if (from_scale > to_scale) {
1108
72
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
72
                                                                                    to_scale);
1110
72
        }
1111
156
        RETURN_IF_ERROR(std::visit(
1112
156
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
156
                    for (size_t i = 0; i < size; i++) {
1114
156
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
156
                                                          multiply_may_overflow, narrow_integral>(
1116
156
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
156
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
156
                                    params)) {
1119
156
                            if (set_nullable) {
1120
156
                                null_map_data[i] = 1;
1121
156
                            } else {
1122
156
                                return params.status;
1123
156
                            }
1124
156
                        }
1125
156
                    }
1126
156
                    return Status::OK();
1127
156
                },
1128
156
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
156
        if (narrow_integral) {
1130
136
            block.get_by_position(result).column =
1131
136
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
136
        } else {
1133
20
            block.get_by_position(result).column = std::move(col_to);
1134
20
        }
1135
156
        return Status::OK();
1136
156
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
140
                        const NullMap::value_type* null_map = nullptr) const override {
1040
140
        using FromFieldType = typename FromDataType::FieldType;
1041
140
        using ToFieldType = typename ToDataType::FieldType;
1042
140
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
140
        const auto* col_from =
1044
140
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
140
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
140
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
140
        UInt32 from_precision = from_decimal_type.get_precision();
1052
140
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
140
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
140
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
140
        UInt32 to_precision = to_decimal_type.get_precision();
1057
140
        ToDataType::check_type_precision(to_precision);
1058
140
        UInt32 to_scale = to_decimal_type.get_scale();
1059
140
        ToDataType::check_type_scale(to_scale);
1060
1061
140
        auto from_max_int_digit_count = from_precision - from_scale;
1062
140
        auto to_max_int_digit_count = to_precision - to_scale;
1063
140
        bool narrow_integral =
1064
140
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
140
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
140
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
140
        size_t size = col_from->size();
1070
140
        ColumnUInt8::MutablePtr col_null_map_to;
1071
140
        NullMap::value_type* null_map_data = nullptr;
1072
140
        if (narrow_integral) {
1073
140
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
140
            null_map_data = col_null_map_to->get_data().data();
1075
140
        }
1076
140
        CastParameters params;
1077
140
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
140
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
140
        const auto& vec_from = col_from->get_data();
1080
140
        const auto* vec_from_data = vec_from.data();
1081
140
        auto& vec_to = col_to->get_data();
1082
140
        auto* vec_to_data = vec_to.data();
1083
1084
140
        using MaxFieldType =
1085
140
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
140
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
140
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
140
                                   Decimal128V3,
1089
140
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
140
                                                      FromFieldType, ToFieldType>>;
1091
140
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
140
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
140
        bool multiply_may_overflow = false;
1095
140
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
140
        typename ToFieldType::NativeType max_result =
1100
140
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
140
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
140
        MaxNativeType multiplier {};
1104
140
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
104
        } else if (from_scale > to_scale) {
1108
80
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
80
                                                                                    to_scale);
1110
80
        }
1111
140
        RETURN_IF_ERROR(std::visit(
1112
140
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
140
                    for (size_t i = 0; i < size; i++) {
1114
140
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
140
                                                          multiply_may_overflow, narrow_integral>(
1116
140
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
140
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
140
                                    params)) {
1119
140
                            if (set_nullable) {
1120
140
                                null_map_data[i] = 1;
1121
140
                            } else {
1122
140
                                return params.status;
1123
140
                            }
1124
140
                        }
1125
140
                    }
1126
140
                    return Status::OK();
1127
140
                },
1128
140
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
140
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
156
                        const NullMap::value_type* null_map = nullptr) const override {
1040
156
        using FromFieldType = typename FromDataType::FieldType;
1041
156
        using ToFieldType = typename ToDataType::FieldType;
1042
156
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
156
        const auto* col_from =
1044
156
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
156
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
156
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
156
        UInt32 from_precision = from_decimal_type.get_precision();
1052
156
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
156
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
156
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
156
        UInt32 to_precision = to_decimal_type.get_precision();
1057
156
        ToDataType::check_type_precision(to_precision);
1058
156
        UInt32 to_scale = to_decimal_type.get_scale();
1059
156
        ToDataType::check_type_scale(to_scale);
1060
1061
156
        auto from_max_int_digit_count = from_precision - from_scale;
1062
156
        auto to_max_int_digit_count = to_precision - to_scale;
1063
156
        bool narrow_integral =
1064
156
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
156
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
156
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
156
        size_t size = col_from->size();
1070
156
        ColumnUInt8::MutablePtr col_null_map_to;
1071
156
        NullMap::value_type* null_map_data = nullptr;
1072
156
        if (narrow_integral) {
1073
136
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
136
            null_map_data = col_null_map_to->get_data().data();
1075
136
        }
1076
156
        CastParameters params;
1077
156
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
156
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
156
        const auto& vec_from = col_from->get_data();
1080
156
        const auto* vec_from_data = vec_from.data();
1081
156
        auto& vec_to = col_to->get_data();
1082
156
        auto* vec_to_data = vec_to.data();
1083
1084
156
        using MaxFieldType =
1085
156
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
156
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
156
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
156
                                   Decimal128V3,
1089
156
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
156
                                                      FromFieldType, ToFieldType>>;
1091
156
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
156
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
156
        bool multiply_may_overflow = false;
1095
156
        if (to_scale > from_scale) {
1096
42
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
42
        }
1098
1099
156
        typename ToFieldType::NativeType max_result =
1100
156
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
156
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
156
        MaxNativeType multiplier {};
1104
156
        if (from_scale < to_scale) {
1105
42
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
42
                                                                                    from_scale);
1107
114
        } else if (from_scale > to_scale) {
1108
74
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
74
                                                                                    to_scale);
1110
74
        }
1111
156
        RETURN_IF_ERROR(std::visit(
1112
156
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
156
                    for (size_t i = 0; i < size; i++) {
1114
156
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
156
                                                          multiply_may_overflow, narrow_integral>(
1116
156
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
156
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
156
                                    params)) {
1119
156
                            if (set_nullable) {
1120
156
                                null_map_data[i] = 1;
1121
156
                            } else {
1122
156
                                return params.status;
1123
156
                            }
1124
156
                        }
1125
156
                    }
1126
156
                    return Status::OK();
1127
156
                },
1128
156
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
156
        if (narrow_integral) {
1130
136
            block.get_by_position(result).column =
1131
136
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
136
        } else {
1133
20
            block.get_by_position(result).column = std::move(col_to);
1134
20
        }
1135
156
        return Status::OK();
1136
156
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
140
                        const NullMap::value_type* null_map = nullptr) const override {
1040
140
        using FromFieldType = typename FromDataType::FieldType;
1041
140
        using ToFieldType = typename ToDataType::FieldType;
1042
140
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
140
        const auto* col_from =
1044
140
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
140
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
140
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
140
        UInt32 from_precision = from_decimal_type.get_precision();
1052
140
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
140
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
140
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
140
        UInt32 to_precision = to_decimal_type.get_precision();
1057
140
        ToDataType::check_type_precision(to_precision);
1058
140
        UInt32 to_scale = to_decimal_type.get_scale();
1059
140
        ToDataType::check_type_scale(to_scale);
1060
1061
140
        auto from_max_int_digit_count = from_precision - from_scale;
1062
140
        auto to_max_int_digit_count = to_precision - to_scale;
1063
140
        bool narrow_integral =
1064
140
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
140
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
140
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
140
        size_t size = col_from->size();
1070
140
        ColumnUInt8::MutablePtr col_null_map_to;
1071
140
        NullMap::value_type* null_map_data = nullptr;
1072
140
        if (narrow_integral) {
1073
140
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
140
            null_map_data = col_null_map_to->get_data().data();
1075
140
        }
1076
140
        CastParameters params;
1077
140
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
140
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
140
        const auto& vec_from = col_from->get_data();
1080
140
        const auto* vec_from_data = vec_from.data();
1081
140
        auto& vec_to = col_to->get_data();
1082
140
        auto* vec_to_data = vec_to.data();
1083
1084
140
        using MaxFieldType =
1085
140
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
140
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
140
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
140
                                   Decimal128V3,
1089
140
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
140
                                                      FromFieldType, ToFieldType>>;
1091
140
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
140
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
140
        bool multiply_may_overflow = false;
1095
140
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
140
        typename ToFieldType::NativeType max_result =
1100
140
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
140
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
140
        MaxNativeType multiplier {};
1104
140
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
104
        } else if (from_scale > to_scale) {
1108
80
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
80
                                                                                    to_scale);
1110
80
        }
1111
140
        RETURN_IF_ERROR(std::visit(
1112
140
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
140
                    for (size_t i = 0; i < size; i++) {
1114
140
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
140
                                                          multiply_may_overflow, narrow_integral>(
1116
140
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
140
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
140
                                    params)) {
1119
140
                            if (set_nullable) {
1120
140
                                null_map_data[i] = 1;
1121
140
                            } else {
1122
140
                                return params.status;
1123
140
                            }
1124
140
                        }
1125
140
                    }
1126
140
                    return Status::OK();
1127
140
                },
1128
140
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
140
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_28EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
156
                        const NullMap::value_type* null_map = nullptr) const override {
1040
156
        using FromFieldType = typename FromDataType::FieldType;
1041
156
        using ToFieldType = typename ToDataType::FieldType;
1042
156
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
156
        const auto* col_from =
1044
156
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
156
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
156
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
156
        UInt32 from_precision = from_decimal_type.get_precision();
1052
156
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
156
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
156
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
156
        UInt32 to_precision = to_decimal_type.get_precision();
1057
156
        ToDataType::check_type_precision(to_precision);
1058
156
        UInt32 to_scale = to_decimal_type.get_scale();
1059
156
        ToDataType::check_type_scale(to_scale);
1060
1061
156
        auto from_max_int_digit_count = from_precision - from_scale;
1062
156
        auto to_max_int_digit_count = to_precision - to_scale;
1063
156
        bool narrow_integral =
1064
156
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
156
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
156
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
156
        size_t size = col_from->size();
1070
156
        ColumnUInt8::MutablePtr col_null_map_to;
1071
156
        NullMap::value_type* null_map_data = nullptr;
1072
156
        if (narrow_integral) {
1073
136
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
136
            null_map_data = col_null_map_to->get_data().data();
1075
136
        }
1076
156
        CastParameters params;
1077
156
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
156
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
156
        const auto& vec_from = col_from->get_data();
1080
156
        const auto* vec_from_data = vec_from.data();
1081
156
        auto& vec_to = col_to->get_data();
1082
156
        auto* vec_to_data = vec_to.data();
1083
1084
156
        using MaxFieldType =
1085
156
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
156
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
156
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
156
                                   Decimal128V3,
1089
156
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
156
                                                      FromFieldType, ToFieldType>>;
1091
156
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
156
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
156
        bool multiply_may_overflow = false;
1095
156
        if (to_scale > from_scale) {
1096
42
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
42
        }
1098
1099
156
        typename ToFieldType::NativeType max_result =
1100
156
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
156
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
156
        MaxNativeType multiplier {};
1104
156
        if (from_scale < to_scale) {
1105
42
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
42
                                                                                    from_scale);
1107
114
        } else if (from_scale > to_scale) {
1108
74
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
74
                                                                                    to_scale);
1110
74
        }
1111
156
        RETURN_IF_ERROR(std::visit(
1112
156
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
156
                    for (size_t i = 0; i < size; i++) {
1114
156
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
156
                                                          multiply_may_overflow, narrow_integral>(
1116
156
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
156
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
156
                                    params)) {
1119
156
                            if (set_nullable) {
1120
156
                                null_map_data[i] = 1;
1121
156
                            } else {
1122
156
                                return params.status;
1123
156
                            }
1124
156
                        }
1125
156
                    }
1126
156
                    return Status::OK();
1127
156
                },
1128
156
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
156
        if (narrow_integral) {
1130
136
            block.get_by_position(result).column =
1131
136
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
136
        } else {
1133
20
            block.get_by_position(result).column = std::move(col_to);
1134
20
        }
1135
156
        return Status::OK();
1136
156
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
36
                        const NullMap::value_type* null_map = nullptr) const override {
1040
36
        using FromFieldType = typename FromDataType::FieldType;
1041
36
        using ToFieldType = typename ToDataType::FieldType;
1042
36
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
36
        const auto* col_from =
1044
36
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
36
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
36
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
36
        UInt32 from_precision = from_decimal_type.get_precision();
1052
36
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
36
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
36
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
36
        UInt32 to_precision = to_decimal_type.get_precision();
1057
36
        ToDataType::check_type_precision(to_precision);
1058
36
        UInt32 to_scale = to_decimal_type.get_scale();
1059
36
        ToDataType::check_type_scale(to_scale);
1060
1061
36
        auto from_max_int_digit_count = from_precision - from_scale;
1062
36
        auto to_max_int_digit_count = to_precision - to_scale;
1063
36
        bool narrow_integral =
1064
36
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
36
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
36
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
36
        size_t size = col_from->size();
1070
36
        ColumnUInt8::MutablePtr col_null_map_to;
1071
36
        NullMap::value_type* null_map_data = nullptr;
1072
36
        if (narrow_integral) {
1073
36
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
36
            null_map_data = col_null_map_to->get_data().data();
1075
36
        }
1076
36
        CastParameters params;
1077
36
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
36
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
36
        const auto& vec_from = col_from->get_data();
1080
36
        const auto* vec_from_data = vec_from.data();
1081
36
        auto& vec_to = col_to->get_data();
1082
36
        auto* vec_to_data = vec_to.data();
1083
1084
36
        using MaxFieldType =
1085
36
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
36
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
36
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
36
                                   Decimal128V3,
1089
36
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
36
                                                      FromFieldType, ToFieldType>>;
1091
36
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
36
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
36
        bool multiply_may_overflow = false;
1095
36
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
36
        typename ToFieldType::NativeType max_result =
1100
36
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
36
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
36
        MaxNativeType multiplier {};
1104
36
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
36
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
36
        RETURN_IF_ERROR(std::visit(
1112
36
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
36
                    for (size_t i = 0; i < size; i++) {
1114
36
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
36
                                                          multiply_may_overflow, narrow_integral>(
1116
36
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
36
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
36
                                    params)) {
1119
36
                            if (set_nullable) {
1120
36
                                null_map_data[i] = 1;
1121
36
                            } else {
1122
36
                                return params.status;
1123
36
                            }
1124
36
                        }
1125
36
                    }
1126
36
                    return Status::OK();
1127
36
                },
1128
36
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
36
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
132
                        const NullMap::value_type* null_map = nullptr) const override {
1040
132
        using FromFieldType = typename FromDataType::FieldType;
1041
132
        using ToFieldType = typename ToDataType::FieldType;
1042
132
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
132
        const auto* col_from =
1044
132
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
132
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
132
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
132
        UInt32 from_precision = from_decimal_type.get_precision();
1052
132
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
132
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
132
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
132
        UInt32 to_precision = to_decimal_type.get_precision();
1057
132
        ToDataType::check_type_precision(to_precision);
1058
132
        UInt32 to_scale = to_decimal_type.get_scale();
1059
132
        ToDataType::check_type_scale(to_scale);
1060
1061
132
        auto from_max_int_digit_count = from_precision - from_scale;
1062
132
        auto to_max_int_digit_count = to_precision - to_scale;
1063
132
        bool narrow_integral =
1064
132
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
132
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
132
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
132
        size_t size = col_from->size();
1070
132
        ColumnUInt8::MutablePtr col_null_map_to;
1071
132
        NullMap::value_type* null_map_data = nullptr;
1072
132
        if (narrow_integral) {
1073
32
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
32
            null_map_data = col_null_map_to->get_data().data();
1075
32
        }
1076
132
        CastParameters params;
1077
132
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
132
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
132
        const auto& vec_from = col_from->get_data();
1080
132
        const auto* vec_from_data = vec_from.data();
1081
132
        auto& vec_to = col_to->get_data();
1082
132
        auto* vec_to_data = vec_to.data();
1083
1084
132
        using MaxFieldType =
1085
132
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
132
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
132
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
132
                                   Decimal128V3,
1089
132
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
132
                                                      FromFieldType, ToFieldType>>;
1091
132
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
132
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
132
        bool multiply_may_overflow = false;
1095
132
        if (to_scale > from_scale) {
1096
69
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
69
        }
1098
1099
132
        typename ToFieldType::NativeType max_result =
1100
132
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
132
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
132
        MaxNativeType multiplier {};
1104
132
        if (from_scale < to_scale) {
1105
69
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
69
                                                                                    from_scale);
1107
69
        } else if (from_scale > to_scale) {
1108
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
30
                                                                                    to_scale);
1110
30
        }
1111
132
        RETURN_IF_ERROR(std::visit(
1112
132
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
132
                    for (size_t i = 0; i < size; i++) {
1114
132
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
132
                                                          multiply_may_overflow, narrow_integral>(
1116
132
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
132
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
132
                                    params)) {
1119
132
                            if (set_nullable) {
1120
132
                                null_map_data[i] = 1;
1121
132
                            } else {
1122
132
                                return params.status;
1123
132
                            }
1124
132
                        }
1125
132
                    }
1126
132
                    return Status::OK();
1127
132
                },
1128
132
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
132
        if (narrow_integral) {
1130
32
            block.get_by_position(result).column =
1131
32
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
100
        } else {
1133
100
            block.get_by_position(result).column = std::move(col_to);
1134
100
        }
1135
132
        return Status::OK();
1136
132
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
92
                        const NullMap::value_type* null_map = nullptr) const override {
1040
92
        using FromFieldType = typename FromDataType::FieldType;
1041
92
        using ToFieldType = typename ToDataType::FieldType;
1042
92
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
92
        const auto* col_from =
1044
92
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
92
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
92
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
92
        UInt32 from_precision = from_decimal_type.get_precision();
1052
92
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
92
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
92
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
92
        UInt32 to_precision = to_decimal_type.get_precision();
1057
92
        ToDataType::check_type_precision(to_precision);
1058
92
        UInt32 to_scale = to_decimal_type.get_scale();
1059
92
        ToDataType::check_type_scale(to_scale);
1060
1061
92
        auto from_max_int_digit_count = from_precision - from_scale;
1062
92
        auto to_max_int_digit_count = to_precision - to_scale;
1063
92
        bool narrow_integral =
1064
92
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
92
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
92
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
92
        size_t size = col_from->size();
1070
92
        ColumnUInt8::MutablePtr col_null_map_to;
1071
92
        NullMap::value_type* null_map_data = nullptr;
1072
92
        if (narrow_integral) {
1073
92
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
92
            null_map_data = col_null_map_to->get_data().data();
1075
92
        }
1076
92
        CastParameters params;
1077
92
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
92
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
92
        const auto& vec_from = col_from->get_data();
1080
92
        const auto* vec_from_data = vec_from.data();
1081
92
        auto& vec_to = col_to->get_data();
1082
92
        auto* vec_to_data = vec_to.data();
1083
1084
92
        using MaxFieldType =
1085
92
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
92
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
92
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
92
                                   Decimal128V3,
1089
92
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
92
                                                      FromFieldType, ToFieldType>>;
1091
92
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
92
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
92
        bool multiply_may_overflow = false;
1095
92
        if (to_scale > from_scale) {
1096
66
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
66
        }
1098
1099
92
        typename ToFieldType::NativeType max_result =
1100
92
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
92
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
92
        MaxNativeType multiplier {};
1104
92
        if (from_scale < to_scale) {
1105
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
66
                                                                                    from_scale);
1107
66
        } else if (from_scale > to_scale) {
1108
20
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
20
                                                                                    to_scale);
1110
20
        }
1111
92
        RETURN_IF_ERROR(std::visit(
1112
92
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
92
                    for (size_t i = 0; i < size; i++) {
1114
92
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
92
                                                          multiply_may_overflow, narrow_integral>(
1116
92
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
92
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
92
                                    params)) {
1119
92
                            if (set_nullable) {
1120
92
                                null_map_data[i] = 1;
1121
92
                            } else {
1122
92
                                return params.status;
1123
92
                            }
1124
92
                        }
1125
92
                    }
1126
92
                    return Status::OK();
1127
92
                },
1128
92
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
92
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
180
                        const NullMap::value_type* null_map = nullptr) const override {
1040
180
        using FromFieldType = typename FromDataType::FieldType;
1041
180
        using ToFieldType = typename ToDataType::FieldType;
1042
180
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
180
        const auto* col_from =
1044
180
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
180
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
180
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
180
        UInt32 from_precision = from_decimal_type.get_precision();
1052
180
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
180
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
180
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
180
        UInt32 to_precision = to_decimal_type.get_precision();
1057
180
        ToDataType::check_type_precision(to_precision);
1058
180
        UInt32 to_scale = to_decimal_type.get_scale();
1059
180
        ToDataType::check_type_scale(to_scale);
1060
1061
180
        auto from_max_int_digit_count = from_precision - from_scale;
1062
180
        auto to_max_int_digit_count = to_precision - to_scale;
1063
180
        bool narrow_integral =
1064
180
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
180
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
180
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
180
        size_t size = col_from->size();
1070
180
        ColumnUInt8::MutablePtr col_null_map_to;
1071
180
        NullMap::value_type* null_map_data = nullptr;
1072
180
        if (narrow_integral) {
1073
104
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
104
            null_map_data = col_null_map_to->get_data().data();
1075
104
        }
1076
180
        CastParameters params;
1077
180
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
180
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
180
        const auto& vec_from = col_from->get_data();
1080
180
        const auto* vec_from_data = vec_from.data();
1081
180
        auto& vec_to = col_to->get_data();
1082
180
        auto* vec_to_data = vec_to.data();
1083
1084
180
        using MaxFieldType =
1085
180
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
180
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
180
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
180
                                   Decimal128V3,
1089
180
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
180
                                                      FromFieldType, ToFieldType>>;
1091
180
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
180
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
180
        bool multiply_may_overflow = false;
1095
180
        if (to_scale > from_scale) {
1096
86
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
86
        }
1098
1099
180
        typename ToFieldType::NativeType max_result =
1100
180
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
180
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
180
        MaxNativeType multiplier {};
1104
180
        if (from_scale < to_scale) {
1105
86
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
86
                                                                                    from_scale);
1107
94
        } else if (from_scale > to_scale) {
1108
68
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
68
                                                                                    to_scale);
1110
68
        }
1111
180
        RETURN_IF_ERROR(std::visit(
1112
180
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
180
                    for (size_t i = 0; i < size; i++) {
1114
180
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
180
                                                          multiply_may_overflow, narrow_integral>(
1116
180
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
180
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
180
                                    params)) {
1119
180
                            if (set_nullable) {
1120
180
                                null_map_data[i] = 1;
1121
180
                            } else {
1122
180
                                return params.status;
1123
180
                            }
1124
180
                        }
1125
180
                    }
1126
180
                    return Status::OK();
1127
180
                },
1128
180
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
180
        if (narrow_integral) {
1130
104
            block.get_by_position(result).column =
1131
104
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
104
        } else {
1133
76
            block.get_by_position(result).column = std::move(col_to);
1134
76
        }
1135
180
        return Status::OK();
1136
180
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
153
                        const NullMap::value_type* null_map = nullptr) const override {
1040
153
        using FromFieldType = typename FromDataType::FieldType;
1041
153
        using ToFieldType = typename ToDataType::FieldType;
1042
153
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
153
        const auto* col_from =
1044
153
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
153
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
153
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
153
        UInt32 from_precision = from_decimal_type.get_precision();
1052
153
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
153
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
153
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
153
        UInt32 to_precision = to_decimal_type.get_precision();
1057
153
        ToDataType::check_type_precision(to_precision);
1058
153
        UInt32 to_scale = to_decimal_type.get_scale();
1059
153
        ToDataType::check_type_scale(to_scale);
1060
1061
153
        auto from_max_int_digit_count = from_precision - from_scale;
1062
153
        auto to_max_int_digit_count = to_precision - to_scale;
1063
153
        bool narrow_integral =
1064
153
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
153
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
153
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
153
        size_t size = col_from->size();
1070
153
        ColumnUInt8::MutablePtr col_null_map_to;
1071
153
        NullMap::value_type* null_map_data = nullptr;
1072
153
        if (narrow_integral) {
1073
153
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
153
            null_map_data = col_null_map_to->get_data().data();
1075
153
        }
1076
153
        CastParameters params;
1077
153
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
153
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
153
        const auto& vec_from = col_from->get_data();
1080
153
        const auto* vec_from_data = vec_from.data();
1081
153
        auto& vec_to = col_to->get_data();
1082
153
        auto* vec_to_data = vec_to.data();
1083
1084
153
        using MaxFieldType =
1085
153
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
153
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
153
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
153
                                   Decimal128V3,
1089
153
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
153
                                                      FromFieldType, ToFieldType>>;
1091
153
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
153
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
153
        bool multiply_may_overflow = false;
1095
153
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
153
        typename ToFieldType::NativeType max_result =
1100
153
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
153
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
153
        MaxNativeType multiplier {};
1104
153
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
93
        } else if (from_scale > to_scale) {
1108
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
66
                                                                                    to_scale);
1110
66
        }
1111
153
        RETURN_IF_ERROR(std::visit(
1112
153
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
153
                    for (size_t i = 0; i < size; i++) {
1114
153
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
153
                                                          multiply_may_overflow, narrow_integral>(
1116
153
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
153
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
153
                                    params)) {
1119
153
                            if (set_nullable) {
1120
153
                                null_map_data[i] = 1;
1121
153
                            } else {
1122
153
                                return params.status;
1123
153
                            }
1124
153
                        }
1125
153
                    }
1126
153
                    return Status::OK();
1127
153
                },
1128
153
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
153
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
228
                        const NullMap::value_type* null_map = nullptr) const override {
1040
228
        using FromFieldType = typename FromDataType::FieldType;
1041
228
        using ToFieldType = typename ToDataType::FieldType;
1042
228
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
228
        const auto* col_from =
1044
228
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
228
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
228
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
228
        UInt32 from_precision = from_decimal_type.get_precision();
1052
228
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
228
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
228
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
228
        UInt32 to_precision = to_decimal_type.get_precision();
1057
228
        ToDataType::check_type_precision(to_precision);
1058
228
        UInt32 to_scale = to_decimal_type.get_scale();
1059
228
        ToDataType::check_type_scale(to_scale);
1060
1061
228
        auto from_max_int_digit_count = from_precision - from_scale;
1062
228
        auto to_max_int_digit_count = to_precision - to_scale;
1063
228
        bool narrow_integral =
1064
228
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
228
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
228
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
228
        size_t size = col_from->size();
1070
228
        ColumnUInt8::MutablePtr col_null_map_to;
1071
228
        NullMap::value_type* null_map_data = nullptr;
1072
228
        if (narrow_integral) {
1073
192
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
192
            null_map_data = col_null_map_to->get_data().data();
1075
192
        }
1076
228
        CastParameters params;
1077
228
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
228
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
228
        const auto& vec_from = col_from->get_data();
1080
228
        const auto* vec_from_data = vec_from.data();
1081
228
        auto& vec_to = col_to->get_data();
1082
228
        auto* vec_to_data = vec_to.data();
1083
1084
228
        using MaxFieldType =
1085
228
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
228
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
228
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
228
                                   Decimal128V3,
1089
228
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
228
                                                      FromFieldType, ToFieldType>>;
1091
228
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
228
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
228
        bool multiply_may_overflow = false;
1095
228
        if (to_scale > from_scale) {
1096
76
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
76
        }
1098
1099
228
        typename ToFieldType::NativeType max_result =
1100
228
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
228
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
228
        MaxNativeType multiplier {};
1104
228
        if (from_scale < to_scale) {
1105
76
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
76
                                                                                    from_scale);
1107
152
        } else if (from_scale > to_scale) {
1108
94
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
94
                                                                                    to_scale);
1110
94
        }
1111
228
        RETURN_IF_ERROR(std::visit(
1112
228
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
228
                    for (size_t i = 0; i < size; i++) {
1114
228
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
228
                                                          multiply_may_overflow, narrow_integral>(
1116
228
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
228
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
228
                                    params)) {
1119
228
                            if (set_nullable) {
1120
228
                                null_map_data[i] = 1;
1121
228
                            } else {
1122
228
                                return params.status;
1123
228
                            }
1124
228
                        }
1125
228
                    }
1126
228
                    return Status::OK();
1127
228
                },
1128
228
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
228
        if (narrow_integral) {
1130
192
            block.get_by_position(result).column =
1131
192
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
192
        } else {
1133
36
            block.get_by_position(result).column = std::move(col_to);
1134
36
        }
1135
228
        return Status::OK();
1136
228
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
164
                        const NullMap::value_type* null_map = nullptr) const override {
1040
164
        using FromFieldType = typename FromDataType::FieldType;
1041
164
        using ToFieldType = typename ToDataType::FieldType;
1042
164
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
164
        const auto* col_from =
1044
164
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
164
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
164
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
164
        UInt32 from_precision = from_decimal_type.get_precision();
1052
164
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
164
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
164
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
164
        UInt32 to_precision = to_decimal_type.get_precision();
1057
164
        ToDataType::check_type_precision(to_precision);
1058
164
        UInt32 to_scale = to_decimal_type.get_scale();
1059
164
        ToDataType::check_type_scale(to_scale);
1060
1061
164
        auto from_max_int_digit_count = from_precision - from_scale;
1062
164
        auto to_max_int_digit_count = to_precision - to_scale;
1063
164
        bool narrow_integral =
1064
164
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
164
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
164
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
164
        size_t size = col_from->size();
1070
164
        ColumnUInt8::MutablePtr col_null_map_to;
1071
164
        NullMap::value_type* null_map_data = nullptr;
1072
164
        if (narrow_integral) {
1073
164
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
164
            null_map_data = col_null_map_to->get_data().data();
1075
164
        }
1076
164
        CastParameters params;
1077
164
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
164
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
164
        const auto& vec_from = col_from->get_data();
1080
164
        const auto* vec_from_data = vec_from.data();
1081
164
        auto& vec_to = col_to->get_data();
1082
164
        auto* vec_to_data = vec_to.data();
1083
1084
164
        using MaxFieldType =
1085
164
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
164
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
164
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
164
                                   Decimal128V3,
1089
164
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
164
                                                      FromFieldType, ToFieldType>>;
1091
164
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
164
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
164
        bool multiply_may_overflow = false;
1095
164
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
164
        typename ToFieldType::NativeType max_result =
1100
164
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
164
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
164
        MaxNativeType multiplier {};
1104
164
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
104
        } else if (from_scale > to_scale) {
1108
80
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
80
                                                                                    to_scale);
1110
80
        }
1111
164
        RETURN_IF_ERROR(std::visit(
1112
164
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
164
                    for (size_t i = 0; i < size; i++) {
1114
164
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
164
                                                          multiply_may_overflow, narrow_integral>(
1116
164
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
164
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
164
                                    params)) {
1119
164
                            if (set_nullable) {
1120
164
                                null_map_data[i] = 1;
1121
164
                            } else {
1122
164
                                return params.status;
1123
164
                            }
1124
164
                        }
1125
164
                    }
1126
164
                    return Status::OK();
1127
164
                },
1128
164
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
164
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_29EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
228
                        const NullMap::value_type* null_map = nullptr) const override {
1040
228
        using FromFieldType = typename FromDataType::FieldType;
1041
228
        using ToFieldType = typename ToDataType::FieldType;
1042
228
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
228
        const auto* col_from =
1044
228
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
228
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
228
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
228
        UInt32 from_precision = from_decimal_type.get_precision();
1052
228
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
228
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
228
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
228
        UInt32 to_precision = to_decimal_type.get_precision();
1057
228
        ToDataType::check_type_precision(to_precision);
1058
228
        UInt32 to_scale = to_decimal_type.get_scale();
1059
228
        ToDataType::check_type_scale(to_scale);
1060
1061
228
        auto from_max_int_digit_count = from_precision - from_scale;
1062
228
        auto to_max_int_digit_count = to_precision - to_scale;
1063
228
        bool narrow_integral =
1064
228
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
228
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
228
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
228
        size_t size = col_from->size();
1070
228
        ColumnUInt8::MutablePtr col_null_map_to;
1071
228
        NullMap::value_type* null_map_data = nullptr;
1072
228
        if (narrow_integral) {
1073
192
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
192
            null_map_data = col_null_map_to->get_data().data();
1075
192
        }
1076
228
        CastParameters params;
1077
228
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
228
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
228
        const auto& vec_from = col_from->get_data();
1080
228
        const auto* vec_from_data = vec_from.data();
1081
228
        auto& vec_to = col_to->get_data();
1082
228
        auto* vec_to_data = vec_to.data();
1083
1084
228
        using MaxFieldType =
1085
228
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
228
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
228
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
228
                                   Decimal128V3,
1089
228
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
228
                                                      FromFieldType, ToFieldType>>;
1091
228
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
228
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
228
        bool multiply_may_overflow = false;
1095
228
        if (to_scale > from_scale) {
1096
76
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
76
        }
1098
1099
228
        typename ToFieldType::NativeType max_result =
1100
228
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
228
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
228
        MaxNativeType multiplier {};
1104
228
        if (from_scale < to_scale) {
1105
76
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
76
                                                                                    from_scale);
1107
152
        } else if (from_scale > to_scale) {
1108
96
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
96
                                                                                    to_scale);
1110
96
        }
1111
228
        RETURN_IF_ERROR(std::visit(
1112
228
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
228
                    for (size_t i = 0; i < size; i++) {
1114
228
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
228
                                                          multiply_may_overflow, narrow_integral>(
1116
228
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
228
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
228
                                    params)) {
1119
228
                            if (set_nullable) {
1120
228
                                null_map_data[i] = 1;
1121
228
                            } else {
1122
228
                                return params.status;
1123
228
                            }
1124
228
                        }
1125
228
                    }
1126
228
                    return Status::OK();
1127
228
                },
1128
228
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
228
        if (narrow_integral) {
1130
192
            block.get_by_position(result).column =
1131
192
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
192
        } else {
1133
36
            block.get_by_position(result).column = std::move(col_to);
1134
36
        }
1135
228
        return Status::OK();
1136
228
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
36
                        const NullMap::value_type* null_map = nullptr) const override {
1040
36
        using FromFieldType = typename FromDataType::FieldType;
1041
36
        using ToFieldType = typename ToDataType::FieldType;
1042
36
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
36
        const auto* col_from =
1044
36
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
36
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
36
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
36
        UInt32 from_precision = from_decimal_type.get_precision();
1052
36
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
36
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
36
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
36
        UInt32 to_precision = to_decimal_type.get_precision();
1057
36
        ToDataType::check_type_precision(to_precision);
1058
36
        UInt32 to_scale = to_decimal_type.get_scale();
1059
36
        ToDataType::check_type_scale(to_scale);
1060
1061
36
        auto from_max_int_digit_count = from_precision - from_scale;
1062
36
        auto to_max_int_digit_count = to_precision - to_scale;
1063
36
        bool narrow_integral =
1064
36
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
36
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
36
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
36
        size_t size = col_from->size();
1070
36
        ColumnUInt8::MutablePtr col_null_map_to;
1071
36
        NullMap::value_type* null_map_data = nullptr;
1072
36
        if (narrow_integral) {
1073
36
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
36
            null_map_data = col_null_map_to->get_data().data();
1075
36
        }
1076
36
        CastParameters params;
1077
36
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
36
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
36
        const auto& vec_from = col_from->get_data();
1080
36
        const auto* vec_from_data = vec_from.data();
1081
36
        auto& vec_to = col_to->get_data();
1082
36
        auto* vec_to_data = vec_to.data();
1083
1084
36
        using MaxFieldType =
1085
36
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
36
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
36
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
36
                                   Decimal128V3,
1089
36
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
36
                                                      FromFieldType, ToFieldType>>;
1091
36
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
36
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
36
        bool multiply_may_overflow = false;
1095
36
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
36
        typename ToFieldType::NativeType max_result =
1100
36
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
36
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
36
        MaxNativeType multiplier {};
1104
36
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
36
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
36
        RETURN_IF_ERROR(std::visit(
1112
36
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
36
                    for (size_t i = 0; i < size; i++) {
1114
36
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
36
                                                          multiply_may_overflow, narrow_integral>(
1116
36
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
36
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
36
                                    params)) {
1119
36
                            if (set_nullable) {
1120
36
                                null_map_data[i] = 1;
1121
36
                            } else {
1122
36
                                return params.status;
1123
36
                            }
1124
36
                        }
1125
36
                    }
1126
36
                    return Status::OK();
1127
36
                },
1128
36
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
36
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
132
                        const NullMap::value_type* null_map = nullptr) const override {
1040
132
        using FromFieldType = typename FromDataType::FieldType;
1041
132
        using ToFieldType = typename ToDataType::FieldType;
1042
132
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
132
        const auto* col_from =
1044
132
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
132
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
132
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
132
        UInt32 from_precision = from_decimal_type.get_precision();
1052
132
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
132
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
132
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
132
        UInt32 to_precision = to_decimal_type.get_precision();
1057
132
        ToDataType::check_type_precision(to_precision);
1058
132
        UInt32 to_scale = to_decimal_type.get_scale();
1059
132
        ToDataType::check_type_scale(to_scale);
1060
1061
132
        auto from_max_int_digit_count = from_precision - from_scale;
1062
132
        auto to_max_int_digit_count = to_precision - to_scale;
1063
132
        bool narrow_integral =
1064
132
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
132
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
132
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
132
        size_t size = col_from->size();
1070
132
        ColumnUInt8::MutablePtr col_null_map_to;
1071
132
        NullMap::value_type* null_map_data = nullptr;
1072
132
        if (narrow_integral) {
1073
32
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
32
            null_map_data = col_null_map_to->get_data().data();
1075
32
        }
1076
132
        CastParameters params;
1077
132
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
132
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
132
        const auto& vec_from = col_from->get_data();
1080
132
        const auto* vec_from_data = vec_from.data();
1081
132
        auto& vec_to = col_to->get_data();
1082
132
        auto* vec_to_data = vec_to.data();
1083
1084
132
        using MaxFieldType =
1085
132
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
132
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
132
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
132
                                   Decimal128V3,
1089
132
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
132
                                                      FromFieldType, ToFieldType>>;
1091
132
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
132
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
132
        bool multiply_may_overflow = false;
1095
132
        if (to_scale > from_scale) {
1096
70
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
70
        }
1098
1099
132
        typename ToFieldType::NativeType max_result =
1100
132
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
132
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
132
        MaxNativeType multiplier {};
1104
132
        if (from_scale < to_scale) {
1105
70
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
70
                                                                                    from_scale);
1107
70
        } else if (from_scale > to_scale) {
1108
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
30
                                                                                    to_scale);
1110
30
        }
1111
132
        RETURN_IF_ERROR(std::visit(
1112
132
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
132
                    for (size_t i = 0; i < size; i++) {
1114
132
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
132
                                                          multiply_may_overflow, narrow_integral>(
1116
132
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
132
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
132
                                    params)) {
1119
132
                            if (set_nullable) {
1120
132
                                null_map_data[i] = 1;
1121
132
                            } else {
1122
132
                                return params.status;
1123
132
                            }
1124
132
                        }
1125
132
                    }
1126
132
                    return Status::OK();
1127
132
                },
1128
132
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
132
        if (narrow_integral) {
1130
32
            block.get_by_position(result).column =
1131
32
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
100
        } else {
1133
100
            block.get_by_position(result).column = std::move(col_to);
1134
100
        }
1135
132
        return Status::OK();
1136
132
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
60
                        const NullMap::value_type* null_map = nullptr) const override {
1040
60
        using FromFieldType = typename FromDataType::FieldType;
1041
60
        using ToFieldType = typename ToDataType::FieldType;
1042
60
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
60
        const auto* col_from =
1044
60
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
60
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
60
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
60
        UInt32 from_precision = from_decimal_type.get_precision();
1052
60
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
60
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
60
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
60
        UInt32 to_precision = to_decimal_type.get_precision();
1057
60
        ToDataType::check_type_precision(to_precision);
1058
60
        UInt32 to_scale = to_decimal_type.get_scale();
1059
60
        ToDataType::check_type_scale(to_scale);
1060
1061
60
        auto from_max_int_digit_count = from_precision - from_scale;
1062
60
        auto to_max_int_digit_count = to_precision - to_scale;
1063
60
        bool narrow_integral =
1064
60
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
60
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
60
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
60
        size_t size = col_from->size();
1070
60
        ColumnUInt8::MutablePtr col_null_map_to;
1071
60
        NullMap::value_type* null_map_data = nullptr;
1072
60
        if (narrow_integral) {
1073
60
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
60
            null_map_data = col_null_map_to->get_data().data();
1075
60
        }
1076
60
        CastParameters params;
1077
60
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
60
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
60
        const auto& vec_from = col_from->get_data();
1080
60
        const auto* vec_from_data = vec_from.data();
1081
60
        auto& vec_to = col_to->get_data();
1082
60
        auto* vec_to_data = vec_to.data();
1083
1084
60
        using MaxFieldType =
1085
60
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
60
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
60
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
60
                                   Decimal128V3,
1089
60
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
60
                                                      FromFieldType, ToFieldType>>;
1091
60
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
60
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
60
        bool multiply_may_overflow = false;
1095
60
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
60
        typename ToFieldType::NativeType max_result =
1100
60
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
60
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
60
        MaxNativeType multiplier {};
1104
60
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
60
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
60
        RETURN_IF_ERROR(std::visit(
1112
60
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
60
                    for (size_t i = 0; i < size; i++) {
1114
60
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
60
                                                          multiply_may_overflow, narrow_integral>(
1116
60
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
60
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
60
                                    params)) {
1119
60
                            if (set_nullable) {
1120
60
                                null_map_data[i] = 1;
1121
60
                            } else {
1122
60
                                return params.status;
1123
60
                            }
1124
60
                        }
1125
60
                    }
1126
60
                    return Status::OK();
1127
60
                },
1128
60
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
60
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
204
                        const NullMap::value_type* null_map = nullptr) const override {
1040
204
        using FromFieldType = typename FromDataType::FieldType;
1041
204
        using ToFieldType = typename ToDataType::FieldType;
1042
204
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
204
        const auto* col_from =
1044
204
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
204
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
204
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
204
        UInt32 from_precision = from_decimal_type.get_precision();
1052
204
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
204
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
204
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
204
        UInt32 to_precision = to_decimal_type.get_precision();
1057
204
        ToDataType::check_type_precision(to_precision);
1058
204
        UInt32 to_scale = to_decimal_type.get_scale();
1059
204
        ToDataType::check_type_scale(to_scale);
1060
1061
204
        auto from_max_int_digit_count = from_precision - from_scale;
1062
204
        auto to_max_int_digit_count = to_precision - to_scale;
1063
204
        bool narrow_integral =
1064
204
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
204
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
204
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
204
        size_t size = col_from->size();
1070
204
        ColumnUInt8::MutablePtr col_null_map_to;
1071
204
        NullMap::value_type* null_map_data = nullptr;
1072
204
        if (narrow_integral) {
1073
56
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
56
            null_map_data = col_null_map_to->get_data().data();
1075
56
        }
1076
204
        CastParameters params;
1077
204
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
204
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
204
        const auto& vec_from = col_from->get_data();
1080
204
        const auto* vec_from_data = vec_from.data();
1081
204
        auto& vec_to = col_to->get_data();
1082
204
        auto* vec_to_data = vec_to.data();
1083
1084
204
        using MaxFieldType =
1085
204
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
204
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
204
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
204
                                   Decimal128V3,
1089
204
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
204
                                                      FromFieldType, ToFieldType>>;
1091
204
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
204
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
204
        bool multiply_may_overflow = false;
1095
204
        if (to_scale > from_scale) {
1096
99
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
99
        }
1098
1099
204
        typename ToFieldType::NativeType max_result =
1100
204
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
204
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
204
        MaxNativeType multiplier {};
1104
204
        if (from_scale < to_scale) {
1105
99
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
99
                                                                                    from_scale);
1107
105
        } else if (from_scale > to_scale) {
1108
56
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
56
                                                                                    to_scale);
1110
56
        }
1111
204
        RETURN_IF_ERROR(std::visit(
1112
204
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
204
                    for (size_t i = 0; i < size; i++) {
1114
204
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
204
                                                          multiply_may_overflow, narrow_integral>(
1116
204
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
204
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
204
                                    params)) {
1119
204
                            if (set_nullable) {
1120
204
                                null_map_data[i] = 1;
1121
204
                            } else {
1122
204
                                return params.status;
1123
204
                            }
1124
204
                        }
1125
204
                    }
1126
204
                    return Status::OK();
1127
204
                },
1128
204
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
204
        if (narrow_integral) {
1130
56
            block.get_by_position(result).column =
1131
56
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
148
        } else {
1133
148
            block.get_by_position(result).column = std::move(col_to);
1134
148
        }
1135
204
        return Status::OK();
1136
204
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
92
                        const NullMap::value_type* null_map = nullptr) const override {
1040
92
        using FromFieldType = typename FromDataType::FieldType;
1041
92
        using ToFieldType = typename ToDataType::FieldType;
1042
92
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
92
        const auto* col_from =
1044
92
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
92
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
92
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
92
        UInt32 from_precision = from_decimal_type.get_precision();
1052
92
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
92
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
92
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
92
        UInt32 to_precision = to_decimal_type.get_precision();
1057
92
        ToDataType::check_type_precision(to_precision);
1058
92
        UInt32 to_scale = to_decimal_type.get_scale();
1059
92
        ToDataType::check_type_scale(to_scale);
1060
1061
92
        auto from_max_int_digit_count = from_precision - from_scale;
1062
92
        auto to_max_int_digit_count = to_precision - to_scale;
1063
92
        bool narrow_integral =
1064
92
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
92
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
92
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
92
        size_t size = col_from->size();
1070
92
        ColumnUInt8::MutablePtr col_null_map_to;
1071
92
        NullMap::value_type* null_map_data = nullptr;
1072
92
        if (narrow_integral) {
1073
92
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
92
            null_map_data = col_null_map_to->get_data().data();
1075
92
        }
1076
92
        CastParameters params;
1077
92
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
92
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
92
        const auto& vec_from = col_from->get_data();
1080
92
        const auto* vec_from_data = vec_from.data();
1081
92
        auto& vec_to = col_to->get_data();
1082
92
        auto* vec_to_data = vec_to.data();
1083
1084
92
        using MaxFieldType =
1085
92
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
92
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
92
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
92
                                   Decimal128V3,
1089
92
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
92
                                                      FromFieldType, ToFieldType>>;
1091
92
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
92
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
92
        bool multiply_may_overflow = false;
1095
92
        if (to_scale > from_scale) {
1096
66
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
66
        }
1098
1099
92
        typename ToFieldType::NativeType max_result =
1100
92
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
92
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
92
        MaxNativeType multiplier {};
1104
92
        if (from_scale < to_scale) {
1105
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
66
                                                                                    from_scale);
1107
66
        } else if (from_scale > to_scale) {
1108
20
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
20
                                                                                    to_scale);
1110
20
        }
1111
92
        RETURN_IF_ERROR(std::visit(
1112
92
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
92
                    for (size_t i = 0; i < size; i++) {
1114
92
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
92
                                                          multiply_may_overflow, narrow_integral>(
1116
92
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
92
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
92
                                    params)) {
1119
92
                            if (set_nullable) {
1120
92
                                null_map_data[i] = 1;
1121
92
                            } else {
1122
92
                                return params.status;
1123
92
                            }
1124
92
                        }
1125
92
                    }
1126
92
                    return Status::OK();
1127
92
                },
1128
92
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
92
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
180
                        const NullMap::value_type* null_map = nullptr) const override {
1040
180
        using FromFieldType = typename FromDataType::FieldType;
1041
180
        using ToFieldType = typename ToDataType::FieldType;
1042
180
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
180
        const auto* col_from =
1044
180
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
180
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
180
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
180
        UInt32 from_precision = from_decimal_type.get_precision();
1052
180
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
180
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
180
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
180
        UInt32 to_precision = to_decimal_type.get_precision();
1057
180
        ToDataType::check_type_precision(to_precision);
1058
180
        UInt32 to_scale = to_decimal_type.get_scale();
1059
180
        ToDataType::check_type_scale(to_scale);
1060
1061
180
        auto from_max_int_digit_count = from_precision - from_scale;
1062
180
        auto to_max_int_digit_count = to_precision - to_scale;
1063
180
        bool narrow_integral =
1064
180
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
180
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
180
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
180
        size_t size = col_from->size();
1070
180
        ColumnUInt8::MutablePtr col_null_map_to;
1071
180
        NullMap::value_type* null_map_data = nullptr;
1072
180
        if (narrow_integral) {
1073
104
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
104
            null_map_data = col_null_map_to->get_data().data();
1075
104
        }
1076
180
        CastParameters params;
1077
180
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
180
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
180
        const auto& vec_from = col_from->get_data();
1080
180
        const auto* vec_from_data = vec_from.data();
1081
180
        auto& vec_to = col_to->get_data();
1082
180
        auto* vec_to_data = vec_to.data();
1083
1084
180
        using MaxFieldType =
1085
180
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
180
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
180
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
180
                                   Decimal128V3,
1089
180
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
180
                                                      FromFieldType, ToFieldType>>;
1091
180
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
180
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
180
        bool multiply_may_overflow = false;
1095
180
        if (to_scale > from_scale) {
1096
86
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
86
        }
1098
1099
180
        typename ToFieldType::NativeType max_result =
1100
180
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
180
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
180
        MaxNativeType multiplier {};
1104
180
        if (from_scale < to_scale) {
1105
86
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
86
                                                                                    from_scale);
1107
94
        } else if (from_scale > to_scale) {
1108
68
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
68
                                                                                    to_scale);
1110
68
        }
1111
180
        RETURN_IF_ERROR(std::visit(
1112
180
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
180
                    for (size_t i = 0; i < size; i++) {
1114
180
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
180
                                                          multiply_may_overflow, narrow_integral>(
1116
180
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
180
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
180
                                    params)) {
1119
180
                            if (set_nullable) {
1120
180
                                null_map_data[i] = 1;
1121
180
                            } else {
1122
180
                                return params.status;
1123
180
                            }
1124
180
                        }
1125
180
                    }
1126
180
                    return Status::OK();
1127
180
                },
1128
180
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
180
        if (narrow_integral) {
1130
104
            block.get_by_position(result).column =
1131
104
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
104
        } else {
1133
76
            block.get_by_position(result).column = std::move(col_to);
1134
76
        }
1135
180
        return Status::OK();
1136
180
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
153
                        const NullMap::value_type* null_map = nullptr) const override {
1040
153
        using FromFieldType = typename FromDataType::FieldType;
1041
153
        using ToFieldType = typename ToDataType::FieldType;
1042
153
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
153
        const auto* col_from =
1044
153
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
153
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
153
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
153
        UInt32 from_precision = from_decimal_type.get_precision();
1052
153
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
153
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
153
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
153
        UInt32 to_precision = to_decimal_type.get_precision();
1057
153
        ToDataType::check_type_precision(to_precision);
1058
153
        UInt32 to_scale = to_decimal_type.get_scale();
1059
153
        ToDataType::check_type_scale(to_scale);
1060
1061
153
        auto from_max_int_digit_count = from_precision - from_scale;
1062
153
        auto to_max_int_digit_count = to_precision - to_scale;
1063
153
        bool narrow_integral =
1064
153
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
153
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
153
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
153
        size_t size = col_from->size();
1070
153
        ColumnUInt8::MutablePtr col_null_map_to;
1071
153
        NullMap::value_type* null_map_data = nullptr;
1072
153
        if (narrow_integral) {
1073
153
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
153
            null_map_data = col_null_map_to->get_data().data();
1075
153
        }
1076
153
        CastParameters params;
1077
153
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
153
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
153
        const auto& vec_from = col_from->get_data();
1080
153
        const auto* vec_from_data = vec_from.data();
1081
153
        auto& vec_to = col_to->get_data();
1082
153
        auto* vec_to_data = vec_to.data();
1083
1084
153
        using MaxFieldType =
1085
153
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
153
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
153
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
153
                                   Decimal128V3,
1089
153
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
153
                                                      FromFieldType, ToFieldType>>;
1091
153
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
153
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
153
        bool multiply_may_overflow = false;
1095
153
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
153
        typename ToFieldType::NativeType max_result =
1100
153
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
153
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
153
        MaxNativeType multiplier {};
1104
153
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
93
        } else if (from_scale > to_scale) {
1108
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
66
                                                                                    to_scale);
1110
66
        }
1111
153
        RETURN_IF_ERROR(std::visit(
1112
153
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
153
                    for (size_t i = 0; i < size; i++) {
1114
153
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
153
                                                          multiply_may_overflow, narrow_integral>(
1116
153
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
153
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
153
                                    params)) {
1119
153
                            if (set_nullable) {
1120
153
                                null_map_data[i] = 1;
1121
153
                            } else {
1122
153
                                return params.status;
1123
153
                            }
1124
153
                        }
1125
153
                    }
1126
153
                    return Status::OK();
1127
153
                },
1128
153
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
153
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEENS2_ILS3_30EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
228
                        const NullMap::value_type* null_map = nullptr) const override {
1040
228
        using FromFieldType = typename FromDataType::FieldType;
1041
228
        using ToFieldType = typename ToDataType::FieldType;
1042
228
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
228
        const auto* col_from =
1044
228
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
228
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
228
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
228
        UInt32 from_precision = from_decimal_type.get_precision();
1052
228
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
228
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
228
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
228
        UInt32 to_precision = to_decimal_type.get_precision();
1057
228
        ToDataType::check_type_precision(to_precision);
1058
228
        UInt32 to_scale = to_decimal_type.get_scale();
1059
228
        ToDataType::check_type_scale(to_scale);
1060
1061
228
        auto from_max_int_digit_count = from_precision - from_scale;
1062
228
        auto to_max_int_digit_count = to_precision - to_scale;
1063
228
        bool narrow_integral =
1064
228
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
228
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
228
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
228
        size_t size = col_from->size();
1070
228
        ColumnUInt8::MutablePtr col_null_map_to;
1071
228
        NullMap::value_type* null_map_data = nullptr;
1072
228
        if (narrow_integral) {
1073
192
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
192
            null_map_data = col_null_map_to->get_data().data();
1075
192
        }
1076
228
        CastParameters params;
1077
228
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
228
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
228
        const auto& vec_from = col_from->get_data();
1080
228
        const auto* vec_from_data = vec_from.data();
1081
228
        auto& vec_to = col_to->get_data();
1082
228
        auto* vec_to_data = vec_to.data();
1083
1084
228
        using MaxFieldType =
1085
228
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
228
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
228
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
228
                                   Decimal128V3,
1089
228
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
228
                                                      FromFieldType, ToFieldType>>;
1091
228
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
228
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
228
        bool multiply_may_overflow = false;
1095
228
        if (to_scale > from_scale) {
1096
76
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
76
        }
1098
1099
228
        typename ToFieldType::NativeType max_result =
1100
228
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
228
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
228
        MaxNativeType multiplier {};
1104
228
        if (from_scale < to_scale) {
1105
76
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
76
                                                                                    from_scale);
1107
152
        } else if (from_scale > to_scale) {
1108
94
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
94
                                                                                    to_scale);
1110
94
        }
1111
228
        RETURN_IF_ERROR(std::visit(
1112
228
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
228
                    for (size_t i = 0; i < size; i++) {
1114
228
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
228
                                                          multiply_may_overflow, narrow_integral>(
1116
228
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
228
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
228
                                    params)) {
1119
228
                            if (set_nullable) {
1120
228
                                null_map_data[i] = 1;
1121
228
                            } else {
1122
228
                                return params.status;
1123
228
                            }
1124
228
                        }
1125
228
                    }
1126
228
                    return Status::OK();
1127
228
                },
1128
228
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
228
        if (narrow_integral) {
1130
192
            block.get_by_position(result).column =
1131
192
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
192
        } else {
1133
36
            block.get_by_position(result).column = std::move(col_to);
1134
36
        }
1135
228
        return Status::OK();
1136
228
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
36
                        const NullMap::value_type* null_map = nullptr) const override {
1040
36
        using FromFieldType = typename FromDataType::FieldType;
1041
36
        using ToFieldType = typename ToDataType::FieldType;
1042
36
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
36
        const auto* col_from =
1044
36
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
36
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
36
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
36
        UInt32 from_precision = from_decimal_type.get_precision();
1052
36
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
36
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
36
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
36
        UInt32 to_precision = to_decimal_type.get_precision();
1057
36
        ToDataType::check_type_precision(to_precision);
1058
36
        UInt32 to_scale = to_decimal_type.get_scale();
1059
36
        ToDataType::check_type_scale(to_scale);
1060
1061
36
        auto from_max_int_digit_count = from_precision - from_scale;
1062
36
        auto to_max_int_digit_count = to_precision - to_scale;
1063
36
        bool narrow_integral =
1064
36
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
36
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
36
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
36
        size_t size = col_from->size();
1070
36
        ColumnUInt8::MutablePtr col_null_map_to;
1071
36
        NullMap::value_type* null_map_data = nullptr;
1072
36
        if (narrow_integral) {
1073
36
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
36
            null_map_data = col_null_map_to->get_data().data();
1075
36
        }
1076
36
        CastParameters params;
1077
36
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
36
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
36
        const auto& vec_from = col_from->get_data();
1080
36
        const auto* vec_from_data = vec_from.data();
1081
36
        auto& vec_to = col_to->get_data();
1082
36
        auto* vec_to_data = vec_to.data();
1083
1084
36
        using MaxFieldType =
1085
36
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
36
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
36
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
36
                                   Decimal128V3,
1089
36
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
36
                                                      FromFieldType, ToFieldType>>;
1091
36
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
36
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
36
        bool multiply_may_overflow = false;
1095
36
        if (to_scale > from_scale) {
1096
36
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
36
        }
1098
1099
36
        typename ToFieldType::NativeType max_result =
1100
36
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
36
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
36
        MaxNativeType multiplier {};
1104
36
        if (from_scale < to_scale) {
1105
36
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
36
                                                                                    from_scale);
1107
36
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
36
        RETURN_IF_ERROR(std::visit(
1112
36
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
36
                    for (size_t i = 0; i < size; i++) {
1114
36
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
36
                                                          multiply_may_overflow, narrow_integral>(
1116
36
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
36
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
36
                                    params)) {
1119
36
                            if (set_nullable) {
1120
36
                                null_map_data[i] = 1;
1121
36
                            } else {
1122
36
                                return params.status;
1123
36
                            }
1124
36
                        }
1125
36
                    }
1126
36
                    return Status::OK();
1127
36
                },
1128
36
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
36
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE28EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
132
                        const NullMap::value_type* null_map = nullptr) const override {
1040
132
        using FromFieldType = typename FromDataType::FieldType;
1041
132
        using ToFieldType = typename ToDataType::FieldType;
1042
132
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
132
        const auto* col_from =
1044
132
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
132
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
132
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
132
        UInt32 from_precision = from_decimal_type.get_precision();
1052
132
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
132
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
132
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
132
        UInt32 to_precision = to_decimal_type.get_precision();
1057
132
        ToDataType::check_type_precision(to_precision);
1058
132
        UInt32 to_scale = to_decimal_type.get_scale();
1059
132
        ToDataType::check_type_scale(to_scale);
1060
1061
132
        auto from_max_int_digit_count = from_precision - from_scale;
1062
132
        auto to_max_int_digit_count = to_precision - to_scale;
1063
132
        bool narrow_integral =
1064
132
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
132
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
132
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
132
        size_t size = col_from->size();
1070
132
        ColumnUInt8::MutablePtr col_null_map_to;
1071
132
        NullMap::value_type* null_map_data = nullptr;
1072
132
        if (narrow_integral) {
1073
32
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
32
            null_map_data = col_null_map_to->get_data().data();
1075
32
        }
1076
132
        CastParameters params;
1077
132
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
132
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
132
        const auto& vec_from = col_from->get_data();
1080
132
        const auto* vec_from_data = vec_from.data();
1081
132
        auto& vec_to = col_to->get_data();
1082
132
        auto* vec_to_data = vec_to.data();
1083
1084
132
        using MaxFieldType =
1085
132
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
132
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
132
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
132
                                   Decimal128V3,
1089
132
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
132
                                                      FromFieldType, ToFieldType>>;
1091
132
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
132
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
132
        bool multiply_may_overflow = false;
1095
132
        if (to_scale > from_scale) {
1096
70
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
70
        }
1098
1099
132
        typename ToFieldType::NativeType max_result =
1100
132
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
132
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
132
        MaxNativeType multiplier {};
1104
132
        if (from_scale < to_scale) {
1105
70
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
70
                                                                                    from_scale);
1107
70
        } else if (from_scale > to_scale) {
1108
30
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
30
                                                                                    to_scale);
1110
30
        }
1111
132
        RETURN_IF_ERROR(std::visit(
1112
132
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
132
                    for (size_t i = 0; i < size; i++) {
1114
132
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
132
                                                          multiply_may_overflow, narrow_integral>(
1116
132
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
132
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
132
                                    params)) {
1119
132
                            if (set_nullable) {
1120
132
                                null_map_data[i] = 1;
1121
132
                            } else {
1122
132
                                return params.status;
1123
132
                            }
1124
132
                        }
1125
132
                    }
1126
132
                    return Status::OK();
1127
132
                },
1128
132
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
132
        if (narrow_integral) {
1130
32
            block.get_by_position(result).column =
1131
32
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
100
        } else {
1133
100
            block.get_by_position(result).column = std::move(col_to);
1134
100
        }
1135
132
        return Status::OK();
1136
132
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
60
                        const NullMap::value_type* null_map = nullptr) const override {
1040
60
        using FromFieldType = typename FromDataType::FieldType;
1041
60
        using ToFieldType = typename ToDataType::FieldType;
1042
60
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
60
        const auto* col_from =
1044
60
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
60
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
60
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
60
        UInt32 from_precision = from_decimal_type.get_precision();
1052
60
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
60
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
60
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
60
        UInt32 to_precision = to_decimal_type.get_precision();
1057
60
        ToDataType::check_type_precision(to_precision);
1058
60
        UInt32 to_scale = to_decimal_type.get_scale();
1059
60
        ToDataType::check_type_scale(to_scale);
1060
1061
60
        auto from_max_int_digit_count = from_precision - from_scale;
1062
60
        auto to_max_int_digit_count = to_precision - to_scale;
1063
60
        bool narrow_integral =
1064
60
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
60
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
60
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
60
        size_t size = col_from->size();
1070
60
        ColumnUInt8::MutablePtr col_null_map_to;
1071
60
        NullMap::value_type* null_map_data = nullptr;
1072
60
        if (narrow_integral) {
1073
60
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
60
            null_map_data = col_null_map_to->get_data().data();
1075
60
        }
1076
60
        CastParameters params;
1077
60
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
60
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
60
        const auto& vec_from = col_from->get_data();
1080
60
        const auto* vec_from_data = vec_from.data();
1081
60
        auto& vec_to = col_to->get_data();
1082
60
        auto* vec_to_data = vec_to.data();
1083
1084
60
        using MaxFieldType =
1085
60
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
60
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
60
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
60
                                   Decimal128V3,
1089
60
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
60
                                                      FromFieldType, ToFieldType>>;
1091
60
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
60
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
60
        bool multiply_may_overflow = false;
1095
60
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
60
        typename ToFieldType::NativeType max_result =
1100
60
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
60
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
60
        MaxNativeType multiplier {};
1104
60
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
60
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
60
        RETURN_IF_ERROR(std::visit(
1112
60
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
60
                    for (size_t i = 0; i < size; i++) {
1114
60
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
60
                                                          multiply_may_overflow, narrow_integral>(
1116
60
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
60
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
60
                                    params)) {
1119
60
                            if (set_nullable) {
1120
60
                                null_map_data[i] = 1;
1121
60
                            } else {
1122
60
                                return params.status;
1123
60
                            }
1124
60
                        }
1125
60
                    }
1126
60
                    return Status::OK();
1127
60
                },
1128
60
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
60
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE29EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
204
                        const NullMap::value_type* null_map = nullptr) const override {
1040
204
        using FromFieldType = typename FromDataType::FieldType;
1041
204
        using ToFieldType = typename ToDataType::FieldType;
1042
204
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
204
        const auto* col_from =
1044
204
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
204
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
204
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
204
        UInt32 from_precision = from_decimal_type.get_precision();
1052
204
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
204
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
204
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
204
        UInt32 to_precision = to_decimal_type.get_precision();
1057
204
        ToDataType::check_type_precision(to_precision);
1058
204
        UInt32 to_scale = to_decimal_type.get_scale();
1059
204
        ToDataType::check_type_scale(to_scale);
1060
1061
204
        auto from_max_int_digit_count = from_precision - from_scale;
1062
204
        auto to_max_int_digit_count = to_precision - to_scale;
1063
204
        bool narrow_integral =
1064
204
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
204
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
204
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
204
        size_t size = col_from->size();
1070
204
        ColumnUInt8::MutablePtr col_null_map_to;
1071
204
        NullMap::value_type* null_map_data = nullptr;
1072
204
        if (narrow_integral) {
1073
56
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
56
            null_map_data = col_null_map_to->get_data().data();
1075
56
        }
1076
204
        CastParameters params;
1077
204
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
204
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
204
        const auto& vec_from = col_from->get_data();
1080
204
        const auto* vec_from_data = vec_from.data();
1081
204
        auto& vec_to = col_to->get_data();
1082
204
        auto* vec_to_data = vec_to.data();
1083
1084
204
        using MaxFieldType =
1085
204
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
204
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
204
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
204
                                   Decimal128V3,
1089
204
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
204
                                                      FromFieldType, ToFieldType>>;
1091
204
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
204
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
204
        bool multiply_may_overflow = false;
1095
204
        if (to_scale > from_scale) {
1096
100
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
100
        }
1098
1099
204
        typename ToFieldType::NativeType max_result =
1100
204
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
204
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
204
        MaxNativeType multiplier {};
1104
204
        if (from_scale < to_scale) {
1105
100
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
100
                                                                                    from_scale);
1107
104
        } else if (from_scale > to_scale) {
1108
56
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
56
                                                                                    to_scale);
1110
56
        }
1111
204
        RETURN_IF_ERROR(std::visit(
1112
204
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
204
                    for (size_t i = 0; i < size; i++) {
1114
204
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
204
                                                          multiply_may_overflow, narrow_integral>(
1116
204
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
204
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
204
                                    params)) {
1119
204
                            if (set_nullable) {
1120
204
                                null_map_data[i] = 1;
1121
204
                            } else {
1122
204
                                return params.status;
1123
204
                            }
1124
204
                        }
1125
204
                    }
1126
204
                    return Status::OK();
1127
204
                },
1128
204
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
204
        if (narrow_integral) {
1130
56
            block.get_by_position(result).column =
1131
56
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
148
        } else {
1133
148
            block.get_by_position(result).column = std::move(col_to);
1134
148
        }
1135
204
        return Status::OK();
1136
204
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
60
                        const NullMap::value_type* null_map = nullptr) const override {
1040
60
        using FromFieldType = typename FromDataType::FieldType;
1041
60
        using ToFieldType = typename ToDataType::FieldType;
1042
60
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
60
        const auto* col_from =
1044
60
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
60
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
60
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
60
        UInt32 from_precision = from_decimal_type.get_precision();
1052
60
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
60
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
60
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
60
        UInt32 to_precision = to_decimal_type.get_precision();
1057
60
        ToDataType::check_type_precision(to_precision);
1058
60
        UInt32 to_scale = to_decimal_type.get_scale();
1059
60
        ToDataType::check_type_scale(to_scale);
1060
1061
60
        auto from_max_int_digit_count = from_precision - from_scale;
1062
60
        auto to_max_int_digit_count = to_precision - to_scale;
1063
60
        bool narrow_integral =
1064
60
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
60
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
60
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
60
        size_t size = col_from->size();
1070
60
        ColumnUInt8::MutablePtr col_null_map_to;
1071
60
        NullMap::value_type* null_map_data = nullptr;
1072
60
        if (narrow_integral) {
1073
60
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
60
            null_map_data = col_null_map_to->get_data().data();
1075
60
        }
1076
60
        CastParameters params;
1077
60
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
60
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
60
        const auto& vec_from = col_from->get_data();
1080
60
        const auto* vec_from_data = vec_from.data();
1081
60
        auto& vec_to = col_to->get_data();
1082
60
        auto* vec_to_data = vec_to.data();
1083
1084
60
        using MaxFieldType =
1085
60
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
60
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
60
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
60
                                   Decimal128V3,
1089
60
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
60
                                                      FromFieldType, ToFieldType>>;
1091
60
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
60
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
60
        bool multiply_may_overflow = false;
1095
60
        if (to_scale > from_scale) {
1096
60
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
60
        }
1098
1099
60
        typename ToFieldType::NativeType max_result =
1100
60
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
60
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
60
        MaxNativeType multiplier {};
1104
60
        if (from_scale < to_scale) {
1105
60
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
60
                                                                                    from_scale);
1107
60
        } else if (from_scale > to_scale) {
1108
0
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
0
                                                                                    to_scale);
1110
0
        }
1111
60
        RETURN_IF_ERROR(std::visit(
1112
60
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
60
                    for (size_t i = 0; i < size; i++) {
1114
60
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
60
                                                          multiply_may_overflow, narrow_integral>(
1116
60
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
60
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
60
                                    params)) {
1119
60
                            if (set_nullable) {
1120
60
                                null_map_data[i] = 1;
1121
60
                            } else {
1122
60
                                return params.status;
1123
60
                            }
1124
60
                        }
1125
60
                    }
1126
60
                    return Status::OK();
1127
60
                },
1128
60
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
60
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE30EEENS2_ILS3_35EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
204
                        const NullMap::value_type* null_map = nullptr) const override {
1040
204
        using FromFieldType = typename FromDataType::FieldType;
1041
204
        using ToFieldType = typename ToDataType::FieldType;
1042
204
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
204
        const auto* col_from =
1044
204
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
204
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
204
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
204
        UInt32 from_precision = from_decimal_type.get_precision();
1052
204
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
204
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
204
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
204
        UInt32 to_precision = to_decimal_type.get_precision();
1057
204
        ToDataType::check_type_precision(to_precision);
1058
204
        UInt32 to_scale = to_decimal_type.get_scale();
1059
204
        ToDataType::check_type_scale(to_scale);
1060
1061
204
        auto from_max_int_digit_count = from_precision - from_scale;
1062
204
        auto to_max_int_digit_count = to_precision - to_scale;
1063
204
        bool narrow_integral =
1064
204
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
204
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
204
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
204
        size_t size = col_from->size();
1070
204
        ColumnUInt8::MutablePtr col_null_map_to;
1071
204
        NullMap::value_type* null_map_data = nullptr;
1072
204
        if (narrow_integral) {
1073
56
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
56
            null_map_data = col_null_map_to->get_data().data();
1075
56
        }
1076
204
        CastParameters params;
1077
204
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
204
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
204
        const auto& vec_from = col_from->get_data();
1080
204
        const auto* vec_from_data = vec_from.data();
1081
204
        auto& vec_to = col_to->get_data();
1082
204
        auto* vec_to_data = vec_to.data();
1083
1084
204
        using MaxFieldType =
1085
204
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
204
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
204
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
204
                                   Decimal128V3,
1089
204
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
204
                                                      FromFieldType, ToFieldType>>;
1091
204
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
204
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
204
        bool multiply_may_overflow = false;
1095
204
        if (to_scale > from_scale) {
1096
99
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
99
        }
1098
1099
204
        typename ToFieldType::NativeType max_result =
1100
204
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
204
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
204
        MaxNativeType multiplier {};
1104
204
        if (from_scale < to_scale) {
1105
99
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
99
                                                                                    from_scale);
1107
105
        } else if (from_scale > to_scale) {
1108
56
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
56
                                                                                    to_scale);
1110
56
        }
1111
204
        RETURN_IF_ERROR(std::visit(
1112
204
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
204
                    for (size_t i = 0; i < size; i++) {
1114
204
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
204
                                                          multiply_may_overflow, narrow_integral>(
1116
204
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
204
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
204
                                    params)) {
1119
204
                            if (set_nullable) {
1120
204
                                null_map_data[i] = 1;
1121
204
                            } else {
1122
204
                                return params.status;
1123
204
                            }
1124
204
                        }
1125
204
                    }
1126
204
                    return Status::OK();
1127
204
                },
1128
204
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
204
        if (narrow_integral) {
1130
56
            block.get_by_position(result).column =
1131
56
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
148
        } else {
1133
148
            block.get_by_position(result).column = std::move(col_to);
1134
148
        }
1135
204
        return Status::OK();
1136
204
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE0ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
92
                        const NullMap::value_type* null_map = nullptr) const override {
1040
92
        using FromFieldType = typename FromDataType::FieldType;
1041
92
        using ToFieldType = typename ToDataType::FieldType;
1042
92
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
92
        const auto* col_from =
1044
92
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
92
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
92
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
92
        UInt32 from_precision = from_decimal_type.get_precision();
1052
92
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
92
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
92
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
92
        UInt32 to_precision = to_decimal_type.get_precision();
1057
92
        ToDataType::check_type_precision(to_precision);
1058
92
        UInt32 to_scale = to_decimal_type.get_scale();
1059
92
        ToDataType::check_type_scale(to_scale);
1060
1061
92
        auto from_max_int_digit_count = from_precision - from_scale;
1062
92
        auto to_max_int_digit_count = to_precision - to_scale;
1063
92
        bool narrow_integral =
1064
92
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
92
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
92
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
92
        size_t size = col_from->size();
1070
92
        ColumnUInt8::MutablePtr col_null_map_to;
1071
92
        NullMap::value_type* null_map_data = nullptr;
1072
92
        if (narrow_integral) {
1073
92
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
92
            null_map_data = col_null_map_to->get_data().data();
1075
92
        }
1076
92
        CastParameters params;
1077
92
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
92
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
92
        const auto& vec_from = col_from->get_data();
1080
92
        const auto* vec_from_data = vec_from.data();
1081
92
        auto& vec_to = col_to->get_data();
1082
92
        auto* vec_to_data = vec_to.data();
1083
1084
92
        using MaxFieldType =
1085
92
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
92
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
92
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
92
                                   Decimal128V3,
1089
92
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
92
                                                      FromFieldType, ToFieldType>>;
1091
92
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
92
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
92
        bool multiply_may_overflow = false;
1095
92
        if (to_scale > from_scale) {
1096
66
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
66
        }
1098
1099
92
        typename ToFieldType::NativeType max_result =
1100
92
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
92
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
92
        MaxNativeType multiplier {};
1104
92
        if (from_scale < to_scale) {
1105
66
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
66
                                                                                    from_scale);
1107
66
        } else if (from_scale > to_scale) {
1108
20
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
20
                                                                                    to_scale);
1110
20
        }
1111
92
        RETURN_IF_ERROR(std::visit(
1112
92
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
92
                    for (size_t i = 0; i < size; i++) {
1114
92
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
92
                                                          multiply_may_overflow, narrow_integral>(
1116
92
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
92
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
92
                                    params)) {
1119
92
                            if (set_nullable) {
1120
92
                                null_map_data[i] = 1;
1121
92
                            } else {
1122
92
                                return params.status;
1123
92
                            }
1124
92
                        }
1125
92
                    }
1126
92
                    return Status::OK();
1127
92
                },
1128
92
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
0
        if (narrow_integral) {
1130
0
            block.get_by_position(result).column =
1131
0
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
0
        } else {
1133
0
            block.get_by_position(result).column = std::move(col_to);
1134
0
        }
1135
0
        return Status::OK();
1136
92
    }
_ZNK5doris10CastToImplILNS_12CastModeTypeE1ENS_15DataTypeDecimalILNS_13PrimitiveTypeE35EEES4_E12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmPKh
Line
Count
Source
1039
180
                        const NullMap::value_type* null_map = nullptr) const override {
1040
180
        using FromFieldType = typename FromDataType::FieldType;
1041
180
        using ToFieldType = typename ToDataType::FieldType;
1042
180
        const ColumnWithTypeAndName& named_from = block.get_by_position(arguments[0]);
1043
180
        const auto* col_from =
1044
180
                check_and_get_column<typename FromDataType::ColumnType>(named_from.column.get());
1045
180
        if (!col_from) {
1046
0
            return Status::RuntimeError("Illegal column {} of first argument of function cast",
1047
0
                                        named_from.column->get_name());
1048
0
        }
1049
1050
180
        const auto& from_decimal_type = assert_cast<const FromDataType&>(*named_from.type);
1051
180
        UInt32 from_precision = from_decimal_type.get_precision();
1052
180
        UInt32 from_scale = from_decimal_type.get_scale();
1053
1054
180
        const ColumnWithTypeAndName& named_to = block.get_by_position(result);
1055
180
        const auto& to_decimal_type = assert_cast<const ToDataType&>(*named_to.type);
1056
180
        UInt32 to_precision = to_decimal_type.get_precision();
1057
180
        ToDataType::check_type_precision(to_precision);
1058
180
        UInt32 to_scale = to_decimal_type.get_scale();
1059
180
        ToDataType::check_type_scale(to_scale);
1060
1061
180
        auto from_max_int_digit_count = from_precision - from_scale;
1062
180
        auto to_max_int_digit_count = to_precision - to_scale;
1063
180
        bool narrow_integral =
1064
180
                (to_max_int_digit_count < from_max_int_digit_count) ||
1065
180
                (to_max_int_digit_count == from_max_int_digit_count && to_scale < from_scale);
1066
        // only in non-strict mode and may overflow, we set nullable
1067
180
        bool set_nullable = (CastMode == CastModeType::NonStrictMode) && narrow_integral;
1068
1069
180
        size_t size = col_from->size();
1070
180
        ColumnUInt8::MutablePtr col_null_map_to;
1071
180
        NullMap::value_type* null_map_data = nullptr;
1072
180
        if (narrow_integral) {
1073
104
            col_null_map_to = ColumnUInt8::create(size, 0);
1074
104
            null_map_data = col_null_map_to->get_data().data();
1075
104
        }
1076
180
        CastParameters params;
1077
180
        params.is_strict = (CastMode == CastModeType::StrictMode);
1078
180
        auto col_to = ToDataType::ColumnType::create(size, to_scale);
1079
180
        const auto& vec_from = col_from->get_data();
1080
180
        const auto* vec_from_data = vec_from.data();
1081
180
        auto& vec_to = col_to->get_data();
1082
180
        auto* vec_to_data = vec_to.data();
1083
1084
180
        using MaxFieldType =
1085
180
                std::conditional_t<(sizeof(FromFieldType) == sizeof(ToFieldType)) &&
1086
180
                                           (std::is_same_v<ToFieldType, Decimal128V3> ||
1087
180
                                            std::is_same_v<FromFieldType, Decimal128V3>),
1088
180
                                   Decimal128V3,
1089
180
                                   std::conditional_t<(sizeof(FromFieldType) > sizeof(ToFieldType)),
1090
180
                                                      FromFieldType, ToFieldType>>;
1091
180
        using MaxNativeType = typename MaxFieldType::NativeType;
1092
1093
180
        UInt32 to_max_digits = NumberTraits::max_ascii_len<typename ToFieldType::NativeType>();
1094
180
        bool multiply_may_overflow = false;
1095
180
        if (to_scale > from_scale) {
1096
86
            multiply_may_overflow = (from_precision + to_scale - from_scale) >= to_max_digits;
1097
86
        }
1098
1099
180
        typename ToFieldType::NativeType max_result =
1100
180
                DataTypeDecimal<ToFieldType::PType>::get_max_digits_number(to_precision);
1101
180
        typename ToFieldType::NativeType min_result = -max_result;
1102
1103
180
        MaxNativeType multiplier {};
1104
180
        if (from_scale < to_scale) {
1105
86
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(to_scale -
1106
86
                                                                                    from_scale);
1107
94
        } else if (from_scale > to_scale) {
1108
68
            multiplier = DataTypeDecimal<MaxFieldType::PType>::get_scale_multiplier(from_scale -
1109
68
                                                                                    to_scale);
1110
68
        }
1111
180
        RETURN_IF_ERROR(std::visit(
1112
180
                [&](auto multiply_may_overflow, auto narrow_integral) {
1113
180
                    for (size_t i = 0; i < size; i++) {
1114
180
                        if (!CastToDecimal::_from_decimal<FromFieldType, ToFieldType,
1115
180
                                                          multiply_may_overflow, narrow_integral>(
1116
180
                                    vec_from_data[i], from_precision, from_scale, vec_to_data[i],
1117
180
                                    to_precision, to_scale, min_result, max_result, multiplier,
1118
180
                                    params)) {
1119
180
                            if (set_nullable) {
1120
180
                                null_map_data[i] = 1;
1121
180
                            } else {
1122
180
                                return params.status;
1123
180
                            }
1124
180
                        }
1125
180
                    }
1126
180
                    return Status::OK();
1127
180
                },
1128
180
                make_bool_variant(multiply_may_overflow), make_bool_variant(narrow_integral)));
1129
180
        if (narrow_integral) {
1130
104
            block.get_by_position(result).column =
1131
104
                    ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
1132
104
        } else {
1133
76
            block.get_by_position(result).column = std::move(col_to);
1134
76
        }
1135
180
        return Status::OK();
1136
180
    }
1137
};
1138
} // namespace doris