[FIX](decimalv3) fix large int cast to decimalv3 #26159
fix large int cast to decimalv3 , before if we make data more than max int64 cast to decimalv3 will make result overflow and incorrect such as mysql> select CAST(12345678901234567890123456789012345678 AS DECIMALV3(38, 0)); +------------------------------------------------------------------+ | CAST(12345678901234567890123456789012345678 AS DECIMALV3(38, 0)) | +------------------------------------------------------------------+ | -4302749291975740594 | +------------------------------------------------------------------+
This commit is contained in:
@ -596,6 +596,13 @@ ToDataType::FieldType convert_to_decimal(const typename FromDataType::FieldType&
|
||||
return convert_decimals<DataTypeDecimal<Decimal128>, ToDataType>(value, 0, scale);
|
||||
}
|
||||
}
|
||||
if constexpr (std::is_same_v<FromFieldType, Int128>) {
|
||||
return convert_decimals<DataTypeDecimal<Decimal128>, ToDataType>(value, 0, scale);
|
||||
}
|
||||
|
||||
if constexpr (std::is_same_v<FromFieldType, Int256>) {
|
||||
return convert_decimals<DataTypeDecimal<Decimal256>, ToDataType>(value, 0, scale);
|
||||
}
|
||||
return convert_decimals<DataTypeDecimal<Decimal64>, ToDataType>(value, 0, scale);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
-- This file is automatically generated. You should know what you did if you want to edit this
|
||||
-- !sql_string --
|
||||
12345678901234567890123456789012345678
|
||||
|
||||
-- !sql_largeint --
|
||||
12345678901234567890123456789012345678
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
suite('test_cast_with_decimalv3') {
|
||||
sql """ set enable_nereids_planner=false; """
|
||||
sql """ set enable_fold_constant_by_be=true; """
|
||||
|
||||
// string to decimalv3 with max value
|
||||
qt_sql_string """ select CAST("12345678901234567890123456789012345678" AS DECIMALV3(38, 0)); """
|
||||
|
||||
// largeint to decimalv3 with max value
|
||||
qt_sql_largeint """select CAST(12345678901234567890123456789012345678 AS DECIMALV3(38, 0));"""
|
||||
}
|
||||
Reference in New Issue
Block a user