You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2023/04/11 01:37:07 UTC

[doris] branch master updated: [Bug](round) fix wrong scale for round-like function (#18507)

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 101737023c [Bug](round) fix wrong scale for round-like function (#18507)
101737023c is described below

commit 101737023c9260414268280b1a935ba6b945766a
Author: Gabriel <ga...@gmail.com>
AuthorDate: Tue Apr 11 09:36:59 2023 +0800

    [Bug](round) fix wrong scale for round-like function (#18507)
---
 be/src/pipeline/exec/meta_scan_operator.cpp        | 37 +++++++++++++++++
 be/src/pipeline/exec/meta_scan_operator.h          | 46 ++++++++++++++++++++++
 .../apache/doris/analysis/FunctionCallExpr.java    |  2 +-
 .../sql_functions/math_functions/test_round.out    | 19 ++++++++-
 .../sql_functions/math_functions/test_round.groovy |  8 +++-
 5 files changed, 108 insertions(+), 4 deletions(-)

diff --git a/be/src/pipeline/exec/meta_scan_operator.cpp b/be/src/pipeline/exec/meta_scan_operator.cpp
new file mode 100644
index 0000000000..30e8daf53d
--- /dev/null
+++ b/be/src/pipeline/exec/meta_scan_operator.cpp
@@ -0,0 +1,37 @@
+// 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.
+
+#include "meta_scan_operator.h"
+
+#include "vec/exec/scan/vmeta_scan_node.h"
+
+namespace doris::pipeline {
+
+OPERATOR_CODE_GENERATOR(MetaScanOperator, SourceOperator)
+
+Status MetaScanOperator::open(RuntimeState* state) {
+    SCOPED_TIMER(_runtime_profile->total_time_counter());
+    return _node->open(state);
+}
+
+Status MetaScanOperator::close(RuntimeState* state) {
+    RETURN_IF_ERROR(SourceOperator::close(state));
+    _node->close(state);
+    return Status::OK();
+}
+
+} // namespace doris::pipeline
diff --git a/be/src/pipeline/exec/meta_scan_operator.h b/be/src/pipeline/exec/meta_scan_operator.h
new file mode 100644
index 0000000000..f1f6194628
--- /dev/null
+++ b/be/src/pipeline/exec/meta_scan_operator.h
@@ -0,0 +1,46 @@
+// 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.
+
+#pragma once
+
+#include "operator.h"
+
+namespace doris::vectorized {
+class VMetaScanNode;
+} // namespace doris::vectorized
+
+namespace doris::pipeline {
+
+class MetaScanOperatorBuilder : public OperatorBuilder<vectorized::VMetaScanNode> {
+public:
+    MetaScanOperatorBuilder(int32_t id, ExecNode* exec_node);
+    bool is_source() const override { return true; }
+    OperatorPtr build_operator() override;
+};
+
+class MetaScanOperator : public SourceOperator<MetaScanOperatorBuilder> {
+public:
+    MetaScanOperator(OperatorBuilderBase* operator_builder, ExecNode* scan_node);
+
+    bool can_read() override { return true; }
+
+    Status open(RuntimeState* state) override;
+
+    Status close(RuntimeState* state) override;
+};
+
+} // namespace doris::pipeline
\ No newline at end of file
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index bac630a45a..0dbbe6f62a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -125,7 +125,7 @@ public class FunctionCallExpr extends Expr {
                 }
                 int scaleArg = (int) (((IntLiteral) children.get(1)).getValue());
                 return ScalarType.createDecimalV3Type(children.get(0).getType().getPrecision(),
-                        Math.max(scaleArg, 0));
+                        Math.min(Math.max(scaleArg, 0), ((ScalarType) children.get(0).getType()).decimalScale()));
             } else {
                 return returnType;
             }
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 1b7e8645db..9cbc25841f 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
@@ -1,12 +1,12 @@
 -- This file is automatically generated. You should know what you did if you want to edit this
 -- !select --
-10.0
+10
 
 -- !select --
 10.12
 
 -- !select --
-10.0
+10
 
 -- !select --
 10.12
@@ -58,6 +58,21 @@
 -- !select --
 20	20	20
 
+-- !select --
+16.025	16.02500	16.02500
+
+-- !select --
+16.025	16.02500	16.02500
+
+-- !select --
+16.025	16.02500	16.02500
+
+-- !select --
+16.025	16.02500	16.02500
+
+-- !select --
+16.025	16.02500	16.02500
+
 -- !nereids_round_arg1 --
 10.0
 
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 005f0c7172..115e8a5b1d 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
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_round") {
+    suite("test_round") {
     qt_select "SELECT round(10.12345)"
     qt_select "SELECT round(10.12345, 2)"
     qt_select "SELECT round_bankers(10.12345)"
@@ -51,6 +51,12 @@ suite("test_round") {
     qt_select """ SELECT truncate(col1, -1), truncate(col2, -1), truncate(col3, -1) FROM `${tableName}`; """
     qt_select """ SELECT round_bankers(col1, -1), round_bankers(col2, -1), round_bankers(col3, -1) FROM `${tableName}`; """
 
+    qt_select """ SELECT round(col1, 7), round(col2, 7), round(col3, 7) FROM `${tableName}`; """
+    qt_select """ SELECT floor(col1, 7), floor(col2, 7), floor(col3, 7) FROM `${tableName}`; """
+    qt_select """ SELECT ceil(col1, 7), ceil(col2, 7), ceil(col3, 7) FROM `${tableName}`; """
+    qt_select """ SELECT truncate(col1, 7), truncate(col2, 7), truncate(col3, 7) FROM `${tableName}`; """
+    qt_select """ SELECT round_bankers(col1, 7), round_bankers(col2, 7), round_bankers(col3, 7) FROM `${tableName}`; """
+
     sql """ DROP TABLE IF EXISTS `${tableName}` """
 
     sql "SET enable_nereids_planner=true"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org