From aadd220eff8c15586de9608d87de22236e44c182 Mon Sep 17 00:00:00 2001 From: amory Date: Tue, 31 Oct 2023 18:24:09 +0800 Subject: [PATCH] [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 | +------------------------------------------------------------------+ --- be/src/vec/data_types/data_type_decimal.h | 7 +++++ .../query_p0/cast/test_cast_decimalv3.out | 7 +++++ .../query_p0/cast/test_cast_decimalv3.groovy | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 regression-test/data/query_p0/cast/test_cast_decimalv3.out create mode 100644 regression-test/suites/query_p0/cast/test_cast_decimalv3.groovy diff --git a/be/src/vec/data_types/data_type_decimal.h b/be/src/vec/data_types/data_type_decimal.h index c7128c9b82..6b8692c17b 100644 --- a/be/src/vec/data_types/data_type_decimal.h +++ b/be/src/vec/data_types/data_type_decimal.h @@ -596,6 +596,13 @@ ToDataType::FieldType convert_to_decimal(const typename FromDataType::FieldType& return convert_decimals, ToDataType>(value, 0, scale); } } + if constexpr (std::is_same_v) { + return convert_decimals, ToDataType>(value, 0, scale); + } + + if constexpr (std::is_same_v) { + return convert_decimals, ToDataType>(value, 0, scale); + } return convert_decimals, ToDataType>(value, 0, scale); } } diff --git a/regression-test/data/query_p0/cast/test_cast_decimalv3.out b/regression-test/data/query_p0/cast/test_cast_decimalv3.out new file mode 100644 index 0000000000..29f8134b82 --- /dev/null +++ b/regression-test/data/query_p0/cast/test_cast_decimalv3.out @@ -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 + diff --git a/regression-test/suites/query_p0/cast/test_cast_decimalv3.groovy b/regression-test/suites/query_p0/cast/test_cast_decimalv3.groovy new file mode 100644 index 0000000000..f7567c4f49 --- /dev/null +++ b/regression-test/suites/query_p0/cast/test_cast_decimalv3.groovy @@ -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));""" +}