Coverage Report

Created: 2026-03-20 05:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/util/jsonb_document_cast.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
#include "core/data_type/primitive_type.h"
19
#include "core/types.h"
20
#include "exprs/function/cast/cast_base.h"
21
#include "exprs/function/cast/cast_to_basic_number_common.h"
22
#include "exprs/function/cast/cast_to_boolean.h"
23
#include "exprs/function/cast/cast_to_decimal.h"
24
#include "util/jsonb_document.h"
25
#include "util/jsonb_utils.h"
26
namespace doris {
27
28
struct JsonbCast {
29
51
    static Status report_error(const JsonbValue* jsonb_value, PrimitiveType to_type) {
30
51
        return Status::InvalidArgument("Cannot cast from jsonb value type {} to doris type {}",
31
51
                                       JsonbToJson {}.to_json_string(jsonb_value),
32
51
                                       type_to_string(to_type));
33
51
    }
34
35
    static bool cast_from_json_to_boolean(const JsonbValue* jsonb_value, UInt8& to,
36
537
                                          CastParameters& params) {
37
537
        switch (jsonb_value->type) {
38
25
        case JsonbType::T_True:
39
50
        case JsonbType::T_False: {
40
50
            return CastToBool::from_number((UInt8)jsonb_value->isTrue(), to, params);
41
25
        }
42
43
        case JsonbType::T_Int8: {
43
43
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
44
43
            return CastToBool::from_number(val, to, params);
45
25
        }
46
40
        case JsonbType::T_Int16: {
47
40
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
48
40
            return CastToBool::from_number(val, to, params);
49
25
        }
50
20
        case JsonbType::T_Int32: {
51
20
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
52
20
            return CastToBool::from_number(val, to, params);
53
25
        }
54
34
        case JsonbType::T_Int64: {
55
34
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
56
34
            return CastToBool::from_number(val, to, params);
57
25
        }
58
29
        case JsonbType::T_Int128: {
59
29
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
60
29
            return CastToBool::from_number(val, to, params);
61
25
        }
62
44
        case JsonbType::T_Double: {
63
44
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
64
44
            return CastToBool::from_number(val, to, params);
65
25
        }
66
1
        case JsonbType::T_Float: {
67
1
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
68
1
            return CastToBool::from_number(val, to, params);
69
25
        }
70
1
        case JsonbType::T_Decimal32: {
71
1
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
72
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
73
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
74
1
            return CastToBool::from_decimal(Decimal32 {val}, to, precision, scale, params);
75
25
        }
76
1
        case JsonbType::T_Decimal64: {
77
1
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
78
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
79
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
80
1
            return CastToBool::from_decimal(Decimal64 {val}, to, precision, scale, params);
81
25
        }
82
1
        case JsonbType::T_Decimal128: {
83
1
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
84
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
85
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
86
1
            return CastToBool::from_decimal(Decimal128V3 {val}, to, precision, scale, params);
87
25
        }
88
1
        case JsonbType::T_Decimal256: {
89
1
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
90
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
91
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
92
1
            return CastToBool::from_decimal(Decimal256 {val}, to, precision, scale, params);
93
25
        }
94
62
        case JsonbType::T_String: {
95
62
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
96
62
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
97
62
            return CastToBool::from_string(str_ref, to, params);
98
25
        }
99
210
        default: {
100
210
            return false;
101
25
        }
102
537
        }
103
537
    }
104
105
    template <typename T>
106
    static bool cast_from_json_to_int(const JsonbValue* jsonb_value, T& to,
107
105k
                                      CastParameters& params) {
108
105k
        switch (jsonb_value->type) {
109
71
        case JsonbType::T_True:
110
142
        case JsonbType::T_False: {
111
142
            auto val = (UInt8)jsonb_value->isTrue();
112
142
            return CastToInt::from_bool(val, to, params);
113
71
        }
114
210
        case JsonbType::T_Int8: {
115
210
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
210
            return CastToInt::from_int(val, to, params);
117
71
        }
118
116
        case JsonbType::T_Int16: {
119
116
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
116
            return CastToInt::from_int(val, to, params);
121
71
        }
122
66
        case JsonbType::T_Int32: {
123
66
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
66
            return CastToInt::from_int(val, to, params);
125
71
        }
126
103k
        case JsonbType::T_Int64: {
127
103k
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
103k
            return CastToInt::from_int(val, to, params);
129
71
        }
130
92
        case JsonbType::T_Int128: {
131
92
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
92
            return CastToInt::from_int(val, to, params);
133
71
        }
134
175
        case JsonbType::T_Double: {
135
175
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
175
            return CastToInt::from_float(val, to, params);
137
71
        }
138
1
        case JsonbType::T_Float: {
139
1
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
1
            return CastToInt::from_float(val, to, params);
141
71
        }
142
1
        case JsonbType::T_Decimal32: {
143
1
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
1
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
71
        }
148
1
        case JsonbType::T_Decimal64: {
149
1
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
1
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
71
        }
154
1
        case JsonbType::T_Decimal128: {
155
1
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
1
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
71
        }
160
1
        case JsonbType::T_Decimal256: {
161
1
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
1
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
71
        }
166
507
        case JsonbType::T_String: {
167
507
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
507
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
507
            return std::visit(
170
507
                    [&](auto is_strict_mode) {
171
507
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
507
                    },
_ZZN5doris9JsonbCast21cast_from_json_to_intIaEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb0EEEEDaS5_
Line
Count
Source
170
101
                    [&](auto is_strict_mode) {
171
101
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
101
                    },
Unexecuted instantiation: _ZZN5doris9JsonbCast21cast_from_json_to_intIaEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb1EEEEDaS5_
_ZZN5doris9JsonbCast21cast_from_json_to_intIsEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb0EEEEDaS5_
Line
Count
Source
170
9
                    [&](auto is_strict_mode) {
171
9
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
9
                    },
Unexecuted instantiation: _ZZN5doris9JsonbCast21cast_from_json_to_intIsEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb1EEEEDaS5_
_ZZN5doris9JsonbCast21cast_from_json_to_intIiEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb0EEEEDaS5_
Line
Count
Source
170
284
                    [&](auto is_strict_mode) {
171
284
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
284
                    },
Unexecuted instantiation: _ZZN5doris9JsonbCast21cast_from_json_to_intIiEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb1EEEEDaS5_
_ZZN5doris9JsonbCast21cast_from_json_to_intIlEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb0EEEEDaS5_
Line
Count
Source
170
69
                    [&](auto is_strict_mode) {
171
69
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
69
                    },
Unexecuted instantiation: _ZZN5doris9JsonbCast21cast_from_json_to_intIlEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb1EEEEDaS5_
_ZZN5doris9JsonbCast21cast_from_json_to_intInEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb0EEEEDaS5_
Line
Count
Source
170
44
                    [&](auto is_strict_mode) {
171
44
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
44
                    },
Unexecuted instantiation: _ZZN5doris9JsonbCast21cast_from_json_to_intInEEbPKNS_10JsonbValueERT_RNS_14CastParametersEENKUlS5_E_clISt17integral_constantIbLb1EEEEDaS5_
173
507
                    make_bool_variant(params.is_strict));
174
71
        }
175
660
        default: {
176
660
            return false;
177
71
        }
178
105k
        }
179
105k
    }
_ZN5doris9JsonbCast21cast_from_json_to_intIaEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
107
4.31k
                                      CastParameters& params) {
108
4.31k
        switch (jsonb_value->type) {
109
2
        case JsonbType::T_True:
110
4
        case JsonbType::T_False: {
111
4
            auto val = (UInt8)jsonb_value->isTrue();
112
4
            return CastToInt::from_bool(val, to, params);
113
2
        }
114
2
        case JsonbType::T_Int8: {
115
2
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
2
            return CastToInt::from_int(val, to, params);
117
2
        }
118
1
        case JsonbType::T_Int16: {
119
1
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
1
            return CastToInt::from_int(val, to, params);
121
2
        }
122
1
        case JsonbType::T_Int32: {
123
1
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
1
            return CastToInt::from_int(val, to, params);
125
2
        }
126
4.19k
        case JsonbType::T_Int64: {
127
4.19k
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
4.19k
            return CastToInt::from_int(val, to, params);
129
2
        }
130
0
        case JsonbType::T_Int128: {
131
0
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
0
            return CastToInt::from_int(val, to, params);
133
2
        }
134
1
        case JsonbType::T_Double: {
135
1
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
1
            return CastToInt::from_float(val, to, params);
137
2
        }
138
0
        case JsonbType::T_Float: {
139
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
0
            return CastToInt::from_float(val, to, params);
141
2
        }
142
0
        case JsonbType::T_Decimal32: {
143
0
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
0
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
2
        }
148
0
        case JsonbType::T_Decimal64: {
149
0
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
0
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
2
        }
154
0
        case JsonbType::T_Decimal128: {
155
0
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
0
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
2
        }
160
0
        case JsonbType::T_Decimal256: {
161
0
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
0
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
2
        }
166
101
        case JsonbType::T_String: {
167
101
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
101
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
101
            return std::visit(
170
101
                    [&](auto is_strict_mode) {
171
101
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
101
                    },
173
101
                    make_bool_variant(params.is_strict));
174
2
        }
175
7
        default: {
176
7
            return false;
177
2
        }
178
4.31k
        }
179
4.31k
    }
_ZN5doris9JsonbCast21cast_from_json_to_intIsEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
107
190
                                      CastParameters& params) {
108
190
        switch (jsonb_value->type) {
109
9
        case JsonbType::T_True:
110
18
        case JsonbType::T_False: {
111
18
            auto val = (UInt8)jsonb_value->isTrue();
112
18
            return CastToInt::from_bool(val, to, params);
113
9
        }
114
9
        case JsonbType::T_Int8: {
115
9
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
9
            return CastToInt::from_int(val, to, params);
117
9
        }
118
10
        case JsonbType::T_Int16: {
119
10
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
10
            return CastToInt::from_int(val, to, params);
121
9
        }
122
9
        case JsonbType::T_Int32: {
123
9
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
9
            return CastToInt::from_int(val, to, params);
125
9
        }
126
15
        case JsonbType::T_Int64: {
127
15
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
15
            return CastToInt::from_int(val, to, params);
129
9
        }
130
12
        case JsonbType::T_Int128: {
131
12
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
12
            return CastToInt::from_int(val, to, params);
133
9
        }
134
9
        case JsonbType::T_Double: {
135
9
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
9
            return CastToInt::from_float(val, to, params);
137
9
        }
138
0
        case JsonbType::T_Float: {
139
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
0
            return CastToInt::from_float(val, to, params);
141
9
        }
142
0
        case JsonbType::T_Decimal32: {
143
0
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
0
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
9
        }
148
0
        case JsonbType::T_Decimal64: {
149
0
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
0
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
9
        }
154
0
        case JsonbType::T_Decimal128: {
155
0
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
0
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
9
        }
160
0
        case JsonbType::T_Decimal256: {
161
0
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
0
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
9
        }
166
9
        case JsonbType::T_String: {
167
9
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
9
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
9
            return std::visit(
170
9
                    [&](auto is_strict_mode) {
171
9
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
9
                    },
173
9
                    make_bool_variant(params.is_strict));
174
9
        }
175
99
        default: {
176
99
            return false;
177
9
        }
178
190
        }
179
190
    }
_ZN5doris9JsonbCast21cast_from_json_to_intIiEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
107
98.6k
                                      CastParameters& params) {
108
98.6k
        switch (jsonb_value->type) {
109
24
        case JsonbType::T_True:
110
48
        case JsonbType::T_False: {
111
48
            auto val = (UInt8)jsonb_value->isTrue();
112
48
            return CastToInt::from_bool(val, to, params);
113
24
        }
114
113
        case JsonbType::T_Int8: {
115
113
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
113
            return CastToInt::from_int(val, to, params);
117
24
        }
118
42
        case JsonbType::T_Int16: {
119
42
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
42
            return CastToInt::from_int(val, to, params);
121
24
        }
122
29
        case JsonbType::T_Int32: {
123
29
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
29
            return CastToInt::from_int(val, to, params);
125
24
        }
126
97.7k
        case JsonbType::T_Int64: {
127
97.7k
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
97.7k
            return CastToInt::from_int(val, to, params);
129
24
        }
130
28
        case JsonbType::T_Int128: {
131
28
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
28
            return CastToInt::from_int(val, to, params);
133
24
        }
134
79
        case JsonbType::T_Double: {
135
79
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
79
            return CastToInt::from_float(val, to, params);
137
24
        }
138
1
        case JsonbType::T_Float: {
139
1
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
1
            return CastToInt::from_float(val, to, params);
141
24
        }
142
1
        case JsonbType::T_Decimal32: {
143
1
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
1
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
24
        }
148
0
        case JsonbType::T_Decimal64: {
149
0
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
0
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
24
        }
154
0
        case JsonbType::T_Decimal128: {
155
0
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
0
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
24
        }
160
0
        case JsonbType::T_Decimal256: {
161
0
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
0
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
24
        }
166
284
        case JsonbType::T_String: {
167
284
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
284
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
284
            return std::visit(
170
284
                    [&](auto is_strict_mode) {
171
284
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
284
                    },
173
284
                    make_bool_variant(params.is_strict));
174
24
        }
175
250
        default: {
176
250
            return false;
177
24
        }
178
98.6k
        }
179
98.6k
    }
_ZN5doris9JsonbCast21cast_from_json_to_intIlEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
107
1.59k
                                      CastParameters& params) {
108
1.59k
        switch (jsonb_value->type) {
109
24
        case JsonbType::T_True:
110
48
        case JsonbType::T_False: {
111
48
            auto val = (UInt8)jsonb_value->isTrue();
112
48
            return CastToInt::from_bool(val, to, params);
113
24
        }
114
58
        case JsonbType::T_Int8: {
115
58
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
58
            return CastToInt::from_int(val, to, params);
117
24
        }
118
39
        case JsonbType::T_Int16: {
119
39
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
39
            return CastToInt::from_int(val, to, params);
121
24
        }
122
19
        case JsonbType::T_Int32: {
123
19
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
19
            return CastToInt::from_int(val, to, params);
125
24
        }
126
1.06k
        case JsonbType::T_Int64: {
127
1.06k
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
1.06k
            return CastToInt::from_int(val, to, params);
129
24
        }
130
35
        case JsonbType::T_Int128: {
131
35
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
35
            return CastToInt::from_int(val, to, params);
133
24
        }
134
54
        case JsonbType::T_Double: {
135
54
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
54
            return CastToInt::from_float(val, to, params);
137
24
        }
138
0
        case JsonbType::T_Float: {
139
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
0
            return CastToInt::from_float(val, to, params);
141
24
        }
142
0
        case JsonbType::T_Decimal32: {
143
0
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
0
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
24
        }
148
1
        case JsonbType::T_Decimal64: {
149
1
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
1
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
24
        }
154
0
        case JsonbType::T_Decimal128: {
155
0
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
0
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
24
        }
160
0
        case JsonbType::T_Decimal256: {
161
0
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
0
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
24
        }
166
69
        case JsonbType::T_String: {
167
69
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
69
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
69
            return std::visit(
170
69
                    [&](auto is_strict_mode) {
171
69
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
69
                    },
173
69
                    make_bool_variant(params.is_strict));
174
24
        }
175
210
        default: {
176
210
            return false;
177
24
        }
178
1.59k
        }
179
1.59k
    }
_ZN5doris9JsonbCast21cast_from_json_to_intInEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
107
289
                                      CastParameters& params) {
108
289
        switch (jsonb_value->type) {
109
12
        case JsonbType::T_True:
110
24
        case JsonbType::T_False: {
111
24
            auto val = (UInt8)jsonb_value->isTrue();
112
24
            return CastToInt::from_bool(val, to, params);
113
12
        }
114
28
        case JsonbType::T_Int8: {
115
28
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
116
28
            return CastToInt::from_int(val, to, params);
117
12
        }
118
24
        case JsonbType::T_Int16: {
119
24
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
120
24
            return CastToInt::from_int(val, to, params);
121
12
        }
122
8
        case JsonbType::T_Int32: {
123
8
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
124
8
            return CastToInt::from_int(val, to, params);
125
12
        }
126
16
        case JsonbType::T_Int64: {
127
16
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
128
16
            return CastToInt::from_int(val, to, params);
129
12
        }
130
17
        case JsonbType::T_Int128: {
131
17
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
132
17
            return CastToInt::from_int(val, to, params);
133
12
        }
134
32
        case JsonbType::T_Double: {
135
32
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
136
32
            return CastToInt::from_float(val, to, params);
137
12
        }
138
0
        case JsonbType::T_Float: {
139
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
140
0
            return CastToInt::from_float(val, to, params);
141
12
        }
142
0
        case JsonbType::T_Decimal32: {
143
0
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
144
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
145
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
146
0
            return CastToInt::from_decimal(Decimal32 {val}, precision, scale, to, params);
147
12
        }
148
0
        case JsonbType::T_Decimal64: {
149
0
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
150
0
            UInt32 precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
151
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
152
0
            return CastToInt::from_decimal(Decimal64 {val}, precision, scale, to, params);
153
12
        }
154
1
        case JsonbType::T_Decimal128: {
155
1
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
156
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
157
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
158
1
            return CastToInt::from_decimal(Decimal128V3 {val}, precision, scale, to, params);
159
12
        }
160
1
        case JsonbType::T_Decimal256: {
161
1
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
162
1
            UInt32 precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
163
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
164
1
            return CastToInt::from_decimal(Decimal256 {val}, precision, scale, to, params);
165
12
        }
166
44
        case JsonbType::T_String: {
167
44
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
168
44
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
169
44
            return std::visit(
170
44
                    [&](auto is_strict_mode) {
171
44
                        return CastToInt::from_string<is_strict_mode>(str_ref, to, params);
172
44
                    },
173
44
                    make_bool_variant(params.is_strict));
174
12
        }
175
94
        default: {
176
94
            return false;
177
12
        }
178
289
        }
179
289
    }
180
181
    template <typename T>
182
    static bool cast_from_json_to_float(const JsonbValue* jsonb_value, T& to,
183
1.03k
                                        CastParameters& params) {
184
1.03k
        switch (jsonb_value->type) {
185
25
        case JsonbType::T_True:
186
50
        case JsonbType::T_False: {
187
50
            auto val = (UInt8)jsonb_value->isTrue();
188
50
            return CastToFloat::from_bool(val, to, params);
189
25
        }
190
113
        case JsonbType::T_Int8: {
191
113
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
192
113
            return CastToFloat::from_int(val, to, params);
193
25
        }
194
115
        case JsonbType::T_Int16: {
195
115
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
196
115
            return CastToFloat::from_int(val, to, params);
197
25
        }
198
24
        case JsonbType::T_Int32: {
199
24
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
200
24
            return CastToFloat::from_int(val, to, params);
201
25
        }
202
126
        case JsonbType::T_Int64: {
203
126
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
204
126
            return CastToFloat::from_int(val, to, params);
205
25
        }
206
29
        case JsonbType::T_Int128: {
207
29
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
208
29
            return CastToFloat::from_int(val, to, params);
209
25
        }
210
293
        case JsonbType::T_Double: {
211
293
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
212
293
            return CastToFloat::from_float(val, to, params);
213
25
        }
214
2
        case JsonbType::T_Float: {
215
2
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
216
2
            return CastToFloat::from_float(val, to, params);
217
25
        }
218
1
        case JsonbType::T_Decimal32: {
219
1
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
220
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
221
1
            return CastToFloat::from_decimal(Decimal32 {val}, scale, to, params);
222
25
        }
223
1
        case JsonbType::T_Decimal64: {
224
1
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
225
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
226
1
            return CastToFloat::from_decimal(Decimal64 {val}, scale, to, params);
227
25
        }
228
2
        case JsonbType::T_Decimal128: {
229
2
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
230
2
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
231
2
            return CastToFloat::from_decimal(Decimal128V3 {val}, scale, to, params);
232
25
        }
233
1
        case JsonbType::T_Decimal256: {
234
1
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
235
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
236
1
            return CastToFloat::from_decimal(Decimal256 {val}, scale, to, params);
237
25
        }
238
63
        case JsonbType::T_String: {
239
63
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
240
63
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
241
63
            return CastToFloat::from_string(str_ref, to, params);
242
25
        }
243
210
        default: {
244
210
            return false;
245
25
        }
246
1.03k
        }
247
1.03k
    }
_ZN5doris9JsonbCast23cast_from_json_to_floatIfEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
183
14
                                        CastParameters& params) {
184
14
        switch (jsonb_value->type) {
185
1
        case JsonbType::T_True:
186
2
        case JsonbType::T_False: {
187
2
            auto val = (UInt8)jsonb_value->isTrue();
188
2
            return CastToFloat::from_bool(val, to, params);
189
1
        }
190
1
        case JsonbType::T_Int8: {
191
1
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
192
1
            return CastToFloat::from_int(val, to, params);
193
1
        }
194
1
        case JsonbType::T_Int16: {
195
1
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
196
1
            return CastToFloat::from_int(val, to, params);
197
1
        }
198
1
        case JsonbType::T_Int32: {
199
1
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
200
1
            return CastToFloat::from_int(val, to, params);
201
1
        }
202
1
        case JsonbType::T_Int64: {
203
1
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
204
1
            return CastToFloat::from_int(val, to, params);
205
1
        }
206
1
        case JsonbType::T_Int128: {
207
1
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
208
1
            return CastToFloat::from_int(val, to, params);
209
1
        }
210
1
        case JsonbType::T_Double: {
211
1
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
212
1
            return CastToFloat::from_float(val, to, params);
213
1
        }
214
2
        case JsonbType::T_Float: {
215
2
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
216
2
            return CastToFloat::from_float(val, to, params);
217
1
        }
218
1
        case JsonbType::T_Decimal32: {
219
1
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
220
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
221
1
            return CastToFloat::from_decimal(Decimal32 {val}, scale, to, params);
222
1
        }
223
1
        case JsonbType::T_Decimal64: {
224
1
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
225
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
226
1
            return CastToFloat::from_decimal(Decimal64 {val}, scale, to, params);
227
1
        }
228
1
        case JsonbType::T_Decimal128: {
229
1
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
230
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
231
1
            return CastToFloat::from_decimal(Decimal128V3 {val}, scale, to, params);
232
1
        }
233
1
        case JsonbType::T_Decimal256: {
234
1
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
235
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
236
1
            return CastToFloat::from_decimal(Decimal256 {val}, scale, to, params);
237
1
        }
238
0
        case JsonbType::T_String: {
239
0
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
240
0
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
241
0
            return CastToFloat::from_string(str_ref, to, params);
242
1
        }
243
0
        default: {
244
0
            return false;
245
1
        }
246
14
        }
247
14
    }
_ZN5doris9JsonbCast23cast_from_json_to_floatIdEEbPKNS_10JsonbValueERT_RNS_14CastParametersE
Line
Count
Source
183
1.01k
                                        CastParameters& params) {
184
1.01k
        switch (jsonb_value->type) {
185
24
        case JsonbType::T_True:
186
48
        case JsonbType::T_False: {
187
48
            auto val = (UInt8)jsonb_value->isTrue();
188
48
            return CastToFloat::from_bool(val, to, params);
189
24
        }
190
112
        case JsonbType::T_Int8: {
191
112
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
192
112
            return CastToFloat::from_int(val, to, params);
193
24
        }
194
114
        case JsonbType::T_Int16: {
195
114
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
196
114
            return CastToFloat::from_int(val, to, params);
197
24
        }
198
23
        case JsonbType::T_Int32: {
199
23
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
200
23
            return CastToFloat::from_int(val, to, params);
201
24
        }
202
125
        case JsonbType::T_Int64: {
203
125
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
204
125
            return CastToFloat::from_int(val, to, params);
205
24
        }
206
28
        case JsonbType::T_Int128: {
207
28
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
208
28
            return CastToFloat::from_int(val, to, params);
209
24
        }
210
292
        case JsonbType::T_Double: {
211
292
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
212
292
            return CastToFloat::from_float(val, to, params);
213
24
        }
214
0
        case JsonbType::T_Float: {
215
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
216
0
            return CastToFloat::from_float(val, to, params);
217
24
        }
218
0
        case JsonbType::T_Decimal32: {
219
0
            auto val = jsonb_value->unpack<JsonbDecimal32>()->val();
220
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
221
0
            return CastToFloat::from_decimal(Decimal32 {val}, scale, to, params);
222
24
        }
223
0
        case JsonbType::T_Decimal64: {
224
0
            auto val = jsonb_value->unpack<JsonbDecimal64>()->val();
225
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
226
0
            return CastToFloat::from_decimal(Decimal64 {val}, scale, to, params);
227
24
        }
228
1
        case JsonbType::T_Decimal128: {
229
1
            auto val = jsonb_value->unpack<JsonbDecimal128>()->val();
230
1
            UInt32 scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
231
1
            return CastToFloat::from_decimal(Decimal128V3 {val}, scale, to, params);
232
24
        }
233
0
        case JsonbType::T_Decimal256: {
234
0
            auto val = jsonb_value->unpack<JsonbDecimal256>()->val();
235
0
            UInt32 scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
236
0
            return CastToFloat::from_decimal(Decimal256 {val}, scale, to, params);
237
24
        }
238
63
        case JsonbType::T_String: {
239
63
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
240
63
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
241
63
            return CastToFloat::from_string(str_ref, to, params);
242
24
        }
243
210
        default: {
244
210
            return false;
245
24
        }
246
1.01k
        }
247
1.01k
    }
248
249
    template <typename T>
250
    static bool cast_from_json_to_decimal(const JsonbValue* jsonb_value, T& to, UInt32 to_precision,
251
75
                                          UInt32 to_scale, CastParameters& params) {
252
75
        switch (jsonb_value->type) {
253
1
        case JsonbType::T_True:
254
2
        case JsonbType::T_False: {
255
2
            UInt8 val = jsonb_value->isTrue();
256
2
            return CastToDecimal::from_bool(val, to, to_precision, to_scale, params);
257
1
        }
258
1
        case JsonbType::T_Int8: {
259
1
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
260
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
261
1
        }
262
1
        case JsonbType::T_Int16: {
263
1
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
264
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
265
1
        }
266
1
        case JsonbType::T_Int32: {
267
1
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
268
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
269
1
        }
270
62
        case JsonbType::T_Int64: {
271
62
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
272
62
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
273
1
        }
274
1
        case JsonbType::T_Int128: {
275
1
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
276
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
277
1
        }
278
1
        case JsonbType::T_Double: {
279
1
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
280
1
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
281
1
        }
282
1
        case JsonbType::T_Float: {
283
1
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
284
1
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
285
1
        }
286
1
        case JsonbType::T_Decimal32: {
287
1
            auto val = Decimal32 {jsonb_value->unpack<JsonbDecimal32>()->val()};
288
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
289
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
290
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
291
1
                                                 to_scale, params);
292
1
        }
293
1
        case JsonbType::T_Decimal64: {
294
1
            auto val = Decimal64 {jsonb_value->unpack<JsonbDecimal64>()->val()};
295
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
296
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
297
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
298
1
                                                 to_scale, params);
299
1
        }
300
2
        case JsonbType::T_Decimal128: {
301
2
            auto val = Decimal128V3 {jsonb_value->unpack<JsonbDecimal128>()->val()};
302
2
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
303
2
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
304
2
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
305
2
                                                 to_scale, params);
306
1
        }
307
1
        case JsonbType::T_Decimal256: {
308
1
            auto val = Decimal256 {jsonb_value->unpack<JsonbDecimal256>()->val()};
309
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
310
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
311
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
312
1
                                                 to_scale, params);
313
1
        }
314
0
        case JsonbType::T_String: {
315
0
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
316
0
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
317
0
            return CastToDecimal::from_string(str_ref, to, to_precision, to_scale, params);
318
1
        }
319
0
        default: {
320
0
            return false;
321
1
        }
322
75
        }
323
75
    }
_ZN5doris9JsonbCast25cast_from_json_to_decimalINS_7DecimalIiEEEEbPKNS_10JsonbValueERT_jjRNS_14CastParametersE
Line
Count
Source
251
13
                                          UInt32 to_scale, CastParameters& params) {
252
13
        switch (jsonb_value->type) {
253
1
        case JsonbType::T_True:
254
2
        case JsonbType::T_False: {
255
2
            UInt8 val = jsonb_value->isTrue();
256
2
            return CastToDecimal::from_bool(val, to, to_precision, to_scale, params);
257
1
        }
258
1
        case JsonbType::T_Int8: {
259
1
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
260
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
261
1
        }
262
1
        case JsonbType::T_Int16: {
263
1
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
264
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
265
1
        }
266
1
        case JsonbType::T_Int32: {
267
1
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
268
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
269
1
        }
270
1
        case JsonbType::T_Int64: {
271
1
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
272
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
273
1
        }
274
1
        case JsonbType::T_Int128: {
275
1
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
276
1
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
277
1
        }
278
1
        case JsonbType::T_Double: {
279
1
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
280
1
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
281
1
        }
282
1
        case JsonbType::T_Float: {
283
1
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
284
1
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
285
1
        }
286
1
        case JsonbType::T_Decimal32: {
287
1
            auto val = Decimal32 {jsonb_value->unpack<JsonbDecimal32>()->val()};
288
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
289
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
290
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
291
1
                                                 to_scale, params);
292
1
        }
293
1
        case JsonbType::T_Decimal64: {
294
1
            auto val = Decimal64 {jsonb_value->unpack<JsonbDecimal64>()->val()};
295
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
296
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
297
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
298
1
                                                 to_scale, params);
299
1
        }
300
1
        case JsonbType::T_Decimal128: {
301
1
            auto val = Decimal128V3 {jsonb_value->unpack<JsonbDecimal128>()->val()};
302
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
303
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
304
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
305
1
                                                 to_scale, params);
306
1
        }
307
1
        case JsonbType::T_Decimal256: {
308
1
            auto val = Decimal256 {jsonb_value->unpack<JsonbDecimal256>()->val()};
309
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
310
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
311
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
312
1
                                                 to_scale, params);
313
1
        }
314
0
        case JsonbType::T_String: {
315
0
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
316
0
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
317
0
            return CastToDecimal::from_string(str_ref, to, to_precision, to_scale, params);
318
1
        }
319
0
        default: {
320
0
            return false;
321
1
        }
322
13
        }
323
13
    }
Unexecuted instantiation: _ZN5doris9JsonbCast25cast_from_json_to_decimalINS_7DecimalIlEEEEbPKNS_10JsonbValueERT_jjRNS_14CastParametersE
_ZN5doris9JsonbCast25cast_from_json_to_decimalINS_12Decimal128V3EEEbPKNS_10JsonbValueERT_jjRNS_14CastParametersE
Line
Count
Source
251
62
                                          UInt32 to_scale, CastParameters& params) {
252
62
        switch (jsonb_value->type) {
253
0
        case JsonbType::T_True:
254
0
        case JsonbType::T_False: {
255
0
            UInt8 val = jsonb_value->isTrue();
256
0
            return CastToDecimal::from_bool(val, to, to_precision, to_scale, params);
257
0
        }
258
0
        case JsonbType::T_Int8: {
259
0
            auto val = jsonb_value->unpack<JsonbInt8Val>()->val();
260
0
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
261
0
        }
262
0
        case JsonbType::T_Int16: {
263
0
            auto val = jsonb_value->unpack<JsonbInt16Val>()->val();
264
0
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
265
0
        }
266
0
        case JsonbType::T_Int32: {
267
0
            auto val = jsonb_value->unpack<JsonbInt32Val>()->val();
268
0
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
269
0
        }
270
61
        case JsonbType::T_Int64: {
271
61
            auto val = jsonb_value->unpack<JsonbInt64Val>()->val();
272
61
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
273
0
        }
274
0
        case JsonbType::T_Int128: {
275
0
            auto val = jsonb_value->unpack<JsonbInt128Val>()->val();
276
0
            return CastToDecimal::from_int(val, to, to_precision, to_scale, params);
277
0
        }
278
0
        case JsonbType::T_Double: {
279
0
            auto val = jsonb_value->unpack<JsonbDoubleVal>()->val();
280
0
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
281
0
        }
282
0
        case JsonbType::T_Float: {
283
0
            auto val = jsonb_value->unpack<JsonbFloatVal>()->val();
284
0
            return CastToDecimal::from_float(val, to, to_precision, to_scale, params);
285
0
        }
286
0
        case JsonbType::T_Decimal32: {
287
0
            auto val = Decimal32 {jsonb_value->unpack<JsonbDecimal32>()->val()};
288
0
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal32>()->precision;
289
0
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal32>()->scale;
290
0
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
291
0
                                                 to_scale, params);
292
0
        }
293
0
        case JsonbType::T_Decimal64: {
294
0
            auto val = Decimal64 {jsonb_value->unpack<JsonbDecimal64>()->val()};
295
0
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal64>()->precision;
296
0
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal64>()->scale;
297
0
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
298
0
                                                 to_scale, params);
299
0
        }
300
1
        case JsonbType::T_Decimal128: {
301
1
            auto val = Decimal128V3 {jsonb_value->unpack<JsonbDecimal128>()->val()};
302
1
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal128>()->precision;
303
1
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal128>()->scale;
304
1
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
305
1
                                                 to_scale, params);
306
0
        }
307
0
        case JsonbType::T_Decimal256: {
308
0
            auto val = Decimal256 {jsonb_value->unpack<JsonbDecimal256>()->val()};
309
0
            UInt32 from_precision = jsonb_value->unpack<JsonbDecimal256>()->precision;
310
0
            UInt32 from_scale = jsonb_value->unpack<JsonbDecimal256>()->scale;
311
0
            return CastToDecimal::from_decimalv3(val, from_precision, from_scale, to, to_precision,
312
0
                                                 to_scale, params);
313
0
        }
314
0
        case JsonbType::T_String: {
315
0
            const auto* blob = jsonb_value->unpack<JsonbBinaryVal>();
316
0
            StringRef str_ref {blob->getBlob(), blob->getBlobLen()};
317
0
            return CastToDecimal::from_string(str_ref, to, to_precision, to_scale, params);
318
0
        }
319
0
        default: {
320
0
            return false;
321
0
        }
322
62
        }
323
62
    }
Unexecuted instantiation: _ZN5doris9JsonbCast25cast_from_json_to_decimalINS_7DecimalIN4wide7integerILm256EiEEEEEEbPKNS_10JsonbValueERT_jjRNS_14CastParametersE
324
};
325
} // namespace doris