This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new aadd220eff8 [FIX](decimalv3) fix large int cast to decimalv3 #26159
aadd220eff8 is described below
commit aadd220eff8c15586de9608d87de22236e44c182
Author: amory <[email protected]>
AuthorDate: Tue Oct 31 18:24:09 2023 +0800
[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 ++++++
.../data/query_p0/cast/test_cast_decimalv3.out | 7 ++++++
.../query_p0/cast/test_cast_decimalv3.groovy | 27 ++++++++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/be/src/vec/data_types/data_type_decimal.h
b/be/src/vec/data_types/data_type_decimal.h
index c7128c9b828..6b8692c17ba 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<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);
}
}
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 00000000000..29f8134b82b
--- /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 00000000000..f7567c4f49e
--- /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));"""
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]