[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:
amory
2023-10-31 18:24:09 +08:00
committed by GitHub
parent b98744ae90
commit aadd220eff
3 changed files with 41 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -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));"""
}