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

gabriellee pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
     new bf95651981 [round](decimalv2) round precise decimalv2 value (#22257)
bf95651981 is described below

commit bf956519814760b941e2e3622d1d804bfb5938b8
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Thu Jul 27 10:01:34 2023 +0800

    [round](decimalv2) round precise decimalv2 value (#22257)
---
 .../main/java/org/apache/doris/catalog/Type.java   | 17 +++++++++++++++
 .../apache/doris/analysis/FunctionCallExpr.java    | 16 ++++++++++-----
 .../java/org/apache/doris/catalog/FunctionSet.java | 14 +++++++++++++
 .../java/org/apache/doris/qe/SessionVariable.java  |  5 +++++
 gensrc/script/doris_builtins_functions.py          | 24 ++++++++--------------
 .../sql_functions/math_functions/test_round.out    | 23 ++++++++++++++++-----
 .../sql_functions/math_functions/test_round.groovy |  9 ++++++--
 7 files changed, 81 insertions(+), 27 deletions(-)

diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java 
b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
index 10a0b7d6f7..f43951e803 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
@@ -945,6 +945,23 @@ public abstract class Type {
         }
     }
 
+    public boolean isDecimalV3OrContainsDecimalV3() {
+        if (isDecimalV3()) {
+            return true;
+        } else if (isStructType()) {
+            for (StructField field : ((StructType) this).getFields()) {
+                if (field.getType().isDecimalV3()) {
+                    return true;
+                }
+            }
+        } else if (isMapType()) {
+            return ((MapType) this).getKeyType().isDecimalV3() || ((MapType) 
this).getValueType().isDecimalV3();
+        } else if (isArrayType()) {
+            return ((ArrayType) this).getItemType().isDecimalV3();
+        }
+        return false;
+    }
+
     /**
      * JDBC data type description
      * Returns the number of fractional digits for this type, or null if not 
applicable.
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 6c05c84b21..271ba4a41c 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
@@ -28,7 +28,6 @@ import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
-import org.apache.doris.catalog.MapType;
 import org.apache.doris.catalog.ScalarFunction;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Type;
@@ -1474,10 +1473,17 @@ public class FunctionCallExpr extends Expr {
                                             && ((ArrayType) 
args[ix]).getItemType().isDecimalV2()))) {
                         continue;
                     } else if (!argTypes[i].matchesType(args[ix])
-                            && !(argTypes[i].isDateOrDateTime() && 
args[ix].isDateOrDateTime())
-                            && (!fn.getReturnType().isDecimalV3()
-                                    || (argTypes[i].isValid() && 
!argTypes[i].isDecimalV3()
-                                            && args[ix].isDecimalV3()))) {
+                            && 
ROUND_FUNCTION_SET.contains(fnName.getFunction())
+                            && ConnectContext.get() != null
+                            && 
ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
+                            && argTypes[i].isDecimalV2()
+                            && args[ix].isDecimalV3()) {
+                        
uncheckedCastChild(ScalarType.createDecimalV3Type(ScalarType.MAX_DECIMALV2_PRECISION,
+                                ((ScalarType) argTypes[i]).getScalarScale()), 
i);
+                    } else if (!argTypes[i].matchesType(args[ix])
+                            && !(argTypes[i].isDecimalV3OrContainsDecimalV3()
+                            && args[ix].isDecimalV3OrContainsDecimalV3())) {
+                        // Do not do this cast if types are both decimalv3 
with different precision/scale.
                         uncheckedCastChild(args[ix], i);
                     }
                 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
index 079fa823e9..af5600078e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
@@ -21,11 +21,13 @@ import org.apache.doris.analysis.ArithmeticExpr;
 import org.apache.doris.analysis.BinaryPredicate;
 import org.apache.doris.analysis.CastExpr;
 import org.apache.doris.analysis.CompoundPredicate;
+import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.InPredicate;
 import org.apache.doris.analysis.IsNullPredicate;
 import org.apache.doris.analysis.LikePredicate;
 import org.apache.doris.builtins.ScalarBuiltins;
 import org.apache.doris.catalog.Function.NullableMode;
+import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
@@ -1288,6 +1290,18 @@ public class FunctionSet<T> {
                 return false;
             }
         }
+        // If set `roundPreciseDecimalV2Value`, only use decimalv3 as target 
type to execute round function
+        if (ConnectContext.get() != null
+                && 
ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
+                && 
FunctionCallExpr.ROUND_FUNCTION_SET.contains(desc.functionName())
+                && descArgType.isDecimalV2() && 
candicateArgType.getPrimitiveType() != PrimitiveType.DECIMAL128) {
+            return false;
+        } else if (ConnectContext.get() != null
+                && 
ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
+                && 
FunctionCallExpr.ROUND_FUNCTION_SET.contains(desc.functionName())
+                && descArgType.isDecimalV2() && 
candicateArgType.getPrimitiveType() == PrimitiveType.DECIMAL128) {
+            return true;
+        }
         if ((descArgType.isDecimalV3() && candicateArgType.isDecimalV2())
                 || (descArgType.isDecimalV2() && 
candicateArgType.isDecimalV3())) {
             return false;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 40dfa11e8e..ce3660d2d9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -264,12 +264,17 @@ public class SessionVariable implements Serializable, 
Writable {
 
     public static final String ENABLE_STRONG_CONSISTENCY = 
"enable_strong_consistency_read";
 
+    public static final String ROUND_PRECISE_DECIMALV2_VALUE = 
"round_precise_decimalv2_value";
+
     // session origin value
     public Map<Field, String> sessionOriginValue = new HashMap<Field, 
String>();
     // check stmt is or not [select /*+ SET_VAR(...)*/ ...]
     // if it is setStmt, we needn't collect session origin value
     public boolean isSingleSetVar = false;
 
+    @VariableMgr.VarAttr(name = ROUND_PRECISE_DECIMALV2_VALUE)
+    public boolean roundPreciseDecimalV2Value = false;
+
     @VariableMgr.VarAttr(name = INSERT_VISIBLE_TIMEOUT_MS, needForward = true)
     public long insertVisibleTimeoutMs = DEFAULT_INSERT_VISIBLE_TIMEOUT_MS;
 
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index b6d8318299..63dd7b3d01 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -1751,12 +1751,18 @@ visible_functions = [
             
'_ZN5doris13MathFunctions5floorEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
     [['round', 'dround'], 'DOUBLE', ['DOUBLE'],
             
'_ZN5doris13MathFunctions5roundEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
-    [['ceil', 'ceiling', 'dceil'], 'DECIMALV2', ['DECIMALV2'],
+    [['truncate'], 'DOUBLE', ['DOUBLE'],
+            
'_ZN5doris13MathFunctions5roundEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
+
+    [['ceil', 'ceiling', 'dceil'], 'DOUBLE', ['DOUBLE', 'INT'],
             
'_ZN5doris13MathFunctions4ceilEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
-    [['floor', 'dfloor'], 'DECIMALV2', ['DECIMALV2'],
+    [['floor', 'dfloor'], 'DOUBLE', ['DOUBLE', 'INT'],
             
'_ZN5doris13MathFunctions5floorEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
-    [['round', 'dround'], 'DECIMALV2', ['DECIMALV2'],
+    [['round', 'dround'], 'DOUBLE', ['DOUBLE', 'INT'],
             
'_ZN5doris13MathFunctions5roundEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
+    [['truncate'], 'DOUBLE', ['DOUBLE', 'INT'],
+             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
+             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
 
     [['ceil', 'ceiling', 'dceil'], 'DECIMAL32', ['DECIMAL32'],
             
'_ZN5doris13MathFunctions4ceilEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
 '', '', 'vec', ''],
@@ -1779,9 +1785,6 @@ visible_functions = [
     [['round', 'dround'], 'DOUBLE', ['DOUBLE', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
-    [['round', 'dround'], 'DECIMALV2', ['DECIMALV2', 'INT'],
-             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
-             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
     [['round', 'dround'], 'DECIMAL32', ['DECIMAL32', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
@@ -1791,9 +1794,6 @@ visible_functions = [
     [['round', 'dround'], 'DECIMAL128', ['DECIMAL128', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
-    [['floor', 'dfloor'], 'DECIMALV2', ['DECIMALV2', 'INT'],
-             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
-             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
     [['floor', 'dfloor'], 'DECIMAL32', ['DECIMAL32', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
@@ -1803,9 +1803,6 @@ visible_functions = [
     [['floor', 'dfloor'], 'DECIMAL128', ['DECIMAL128', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
-    [['ceil', 'dceil'], 'DECIMALV2', ['DECIMALV2', 'INT'],
-             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
-             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
     [['ceil', 'dceil'], 'DECIMAL32', ['DECIMAL32', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
@@ -1818,9 +1815,6 @@ visible_functions = [
     [['truncate'], 'DOUBLE', ['DOUBLE', 'INT'],
             '_ZN5doris13MathFunctions8truncateEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
-    [['truncate'], 'DECIMALV2', ['DECIMALV2', 'INT'],
-             '_ZN5doris13MathFunctions8truncateEPN9doris_udf'
-             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
     [['truncate'], 'DECIMAL32', ['DECIMAL32', 'INT'],
             '_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
             '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 
'vec', ''],
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 9a03815435..9bc56187f3 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
@@ -20,7 +20,7 @@
 17     17      17
 
 -- !select --
-16.030 16.03000        16.03000
+16.03  16.03   16.03
 
 -- !select --
 16.02  16.02   16.02
@@ -53,10 +53,10 @@
 247.14 469.36  691.58
 
 -- !query --
-200    500     700
+200.0  500.0   700.0
 
 -- !query --
-0      0       0
+0.0    0.0     0.0
 
 -- !query --
 247.135        469.357 691.579
@@ -70,6 +70,18 @@
 -- !query --
 0.000  0.000   0.000
 
+-- !query --
+16.02
+
+-- !query --
+16.02
+
+-- !query --
+16.03
+
+-- !query --
+16.02
+
 -- !query --
 16.03
 
@@ -77,7 +89,8 @@
 16.02
 
 -- !query --
-16.030000000
+16.03
 
 -- !query --
-16.020000000
+16.02
+
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 5ddbde7813..fe809e3b64 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
@@ -91,6 +91,7 @@ suite("test_round") {
 
 
     def tableName3 = "test_round_decimal"
+    sql """DROP TABLE IF EXISTS `${tableName3}`"""
     sql """ CREATE TABLE `${tableName3}` (
           `id` int NOT NULL COMMENT 'id',
           `d1` decimalv3(9, 4) NULL COMMENT '',
@@ -117,11 +118,15 @@ suite("test_round") {
     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} """
 
     sql """ ADMIN SET FRONTEND CONFIG ("enable_decimal_conversion" = "false"); 
"""
-    sql """ ADMIN SET FRONTEND CONFIG ("disable_decimalv2" = "false"); """
-    sql """ set experimental_enable_nereids_planner=false; """
     sql """ DROP TABLE IF EXISTS `test_decimalv2` """
     sql """ CREATE TABLE `test_decimalv2` ( id int, decimal_col DECIMAL(19,5)) 
ENGINE=OLAP duplicate KEY (id) DISTRIBUTED BY HASH(id) BUCKETS 1 PROPERTIES ( 
"replication_allocation" = "tag.location.default: 1"); """
     sql """ insert into test_decimalv2 values (1, 16.025); """
+    sql """ set round_precise_decimalv2_value=false; """
+    qt_query """ select round(decimal_col,2) from test_decimalv2; """
+    qt_query """ select truncate(decimal_col,2) from test_decimalv2; """
+    qt_query """ select ceil(decimal_col,2) from test_decimalv2; """
+    qt_query """ select floor(decimal_col,2) from test_decimalv2; """
+    sql """ set round_precise_decimalv2_value=true; """
     qt_query """ select round(decimal_col,2) from test_decimalv2; """
     qt_query """ select truncate(decimal_col,2) from test_decimalv2; """
     qt_query """ select ceil(decimal_col,2) from test_decimalv2; """


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

Reply via email to