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