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]

Reply via email to