This is an automated email from the ASF dual-hosted git repository.

kxiao 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 0cf9de8cef [fix](decimalv3) fix result error when cast a round 
decimalv3 to double (#20678)
0cf9de8cef is described below

commit 0cf9de8cefdf74c5fdcfa0693553778a1d7bf4f8
Author: dujl <[email protected]>
AuthorDate: Wed Jun 21 00:02:48 2023 +0800

    [fix](decimalv3) fix result error when cast a round decimalv3 to double 
(#20678)
---
 be/src/vec/functions/round.h                       |  6 ++++-
 .../sql_functions/math_functions/test_round.out    | 27 +++++++++++++++++++
 .../sql_functions/math_functions/test_round.groovy | 30 ++++++++++++++++++++++
 3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/be/src/vec/functions/round.h b/be/src/vec/functions/round.h
index 15565c87c7..1460fc12ec 100644
--- a/be/src/vec/functions/round.h
+++ b/be/src/vec/functions/round.h
@@ -28,6 +28,7 @@
 #else
 #include <fenv.h>
 #endif
+#include <algorithm>
 
 #include "vec/columns/column.h"
 #include "vec/columns/column_decimal.h"
@@ -461,7 +462,10 @@ struct Dispatcher {
             const auto* const decimal_col = 
check_and_get_column<ColumnDecimal<T>>(col_general);
             const auto& vec_src = decimal_col->get_data();
 
-            auto col_res = ColumnDecimal<T>::create(vec_src.size(), scale_arg);
+            UInt32 result_scale =
+                    std::min(static_cast<UInt32>(std::max(scale_arg, 
static_cast<Int16>(0))),
+                             decimal_col->get_scale());
+            auto col_res = ColumnDecimal<T>::create(vec_src.size(), 
result_scale);
             auto& vec_res = col_res->get_data();
 
             if (!vec_res.empty()) {
diff --git 
a/regression-test/data/query_p0/sql_functions/math_functions/test_round.out 
b/regression-test/data/query_p0/sql_functions/math_functions/test_round.out
index 82d286a5d2..155e438c9e 100644
--- a/regression-test/data/query_p0/sql_functions/math_functions/test_round.out
+++ b/regression-test/data/query_p0/sql_functions/math_functions/test_round.out
@@ -88,3 +88,30 @@
 -- !query --
 111    001     15.0700 0.2300
 
+-- !query --
+123.5679       234.6790        345.7896
+123.5679       234.6790        345.7896
+
+-- !query --
+247.1358       469.358 691.5792
+
+-- !query --
+247.14 469.36  691.58
+
+-- !query --
+200    500     700
+
+-- !query --
+0      0       0
+
+-- !query --
+247.136        469.358 691.579
+
+-- !query --
+247.140        469.360 691.580
+
+-- !query --
+200.000        500.000 700.000
+
+-- !query --
+0.000  0.000   0.000
\ No newline at end of file
diff --git 
a/regression-test/suites/query_p0/sql_functions/math_functions/test_round.groovy
 
b/regression-test/suites/query_p0/sql_functions/math_functions/test_round.groovy
index 115e8a5b1d..96564e1400 100644
--- 
a/regression-test/suites/query_p0/sql_functions/math_functions/test_round.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/math_functions/test_round.groovy
@@ -108,4 +108,34 @@
     sql """ insert into ${tableName1} values ('111', 1.2432, '001', 0.2341, 
12.1234123); """
     sql """ insert into ${tableName2} select  
TENANT_ID,PRODENTP_CODE,ROUND((MAX(PURC_CNT)*MAX(PUBONLN_PRC)),2) 
delv_amt,ROUND(SUM(ORD_SUMAMT),2) from ${tableName1} GROUP BY 
TENANT_ID,PRODENTP_CODE; """
     qt_query """ select * from ${tableName2} """
+
+
+    def tableName3 = "test_round_decimal"
+    sql """ CREATE TABLE `${tableName3}` (
+          `id` int NOT NULL COMMENT 'id',
+          `d1` decimalv3(9, 4) NULL COMMENT '',
+          `d2` decimalv3(27, 4)  NULL DEFAULT "0" ,
+          `d3` decimalv3(38, 4)  NULL
+        ) ENGINE=OLAP
+        UNIQUE KEY(`id`)
+        DISTRIBUTED BY HASH(`id`) BUCKETS 10
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1"
+        );                """
+
+    sql """ insert into ${tableName3} values (1, 123.56789, 234.67895, 
345.78956); """
+    sql """ insert into ${tableName3} values (2, 123.56789, 234.67895, 
345.78956); """
+
+    qt_query """ select d1, d2, d3 from ${tableName3} order by d1 """
+
+    qt_query """ select cast(round(sum(d1), 6) as double), cast(round(sum(d2), 
6) as double), cast(round(sum(d3), 6) as double) from ${tableName3} """
+    qt_query """ select cast(round(sum(d1), 2) as double), cast(round(sum(d2), 
2) as double), cast(round(sum(d3),2) as double) from ${tableName3} """
+    qt_query """ select cast(round(sum(d1), -2) as double), 
cast(round(sum(d2), -2) as double), cast(round(sum(d3), -2) as double) from 
${tableName3} """
+    qt_query """ select cast(round(sum(d1), -4) as double), 
cast(round(sum(d2), -4) as double), cast(round(sum(d3), -4) as double) from 
${tableName3} """
+
+    qt_query """ select cast(round(sum(d1), 6) as decimalv3(27, 3)), 
cast(round(sum(d2), 6) as decimalv3(27, 3)), cast(round(sum(d3), 6) as 
decimalv3(27, 3)) from ${tableName3} """
+    qt_query """ select cast(round(sum(d1), 2) as decimalv3(27, 3)), 
cast(round(sum(d2), 2) as decimalv3(27, 3)), cast(round(sum(d3),2) as 
decimalv3(27, 3)) from ${tableName3} """
+    qt_query """ select cast(round(sum(d1), -2) as decimalv3(27, 3)), 
cast(round(sum(d2), -2) as decimalv3(27, 3)), cast(round(sum(d3), -2) as 
decimalv3(27, 3)) from ${tableName3} """
+    qt_query """ select cast(round(sum(d1), -4) as decimalv3(27, 3)), 
cast(round(sum(d2), -4) as decimalv3(27, 3)), cast(round(sum(d3), -4) as 
decimalv3(27, 3)) from ${tableName3} """
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to