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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]