This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch pick_56671 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 3b3a73b1ff4c9e6e17d081ebe9f43a2be46ce167 Author: morrySnow <[email protected]> AuthorDate: Sat Oct 11 14:13:48 2025 +0800 branch-3.1: [fix](fold constant) fix result's scale of some datetime related function #56671 picked from #56671 --- .../executable/DateTimeExtractAndTransform.java | 19 +++++++++------ .../functions/scalar/FromMicrosecond.java | 3 ++- .../functions/scalar/FromMillisecond.java | 4 ++-- .../expressions/functions/scalar/FromSecond.java | 3 ++- .../nereids/rules/expression/FoldConstantTest.java | 6 ++--- .../DateTimeExtractAndTransformTest.java | 28 ++++++++++++++++++++-- .../nereids_p0/javaudf/test_alias_function.groovy | 2 +- 7 files changed, 48 insertions(+), 17 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java index d1e8a88a0a9..fda880d8dd4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java @@ -23,6 +23,9 @@ import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.rules.expression.rules.SupportJavaDateFormatter; import org.apache.doris.nereids.trees.expressions.ExecFunction; import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.scalar.FromMicrosecond; +import org.apache.doris.nereids.trees.expressions.functions.scalar.FromMillisecond; +import org.apache.doris.nereids.trees.expressions.functions.scalar.FromSecond; import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.literal.DateLiteral; @@ -378,7 +381,8 @@ public class DateTimeExtractAndTransform { @ExecFunction(name = "date_trunc") public static Expression dateTrunc(DateTimeV2Literal date, StringLikeLiteral trunc) { - return DateTimeV2Literal.fromJavaDateType(dateTruncHelper(date.toJavaDateType(), trunc.getValue())); + return DateTimeV2Literal.fromJavaDateType( + dateTruncHelper(date.toJavaDateType(), trunc.getValue()), date.getDataType().getScale()); } @ExecFunction(name = "date_trunc") @@ -398,7 +402,8 @@ public class DateTimeExtractAndTransform { @ExecFunction(name = "date_trunc") public static Expression dateTrunc(StringLikeLiteral trunc, DateTimeV2Literal date) { - return DateTimeV2Literal.fromJavaDateType(dateTruncHelper(date.toJavaDateType(), trunc.getValue())); + return DateTimeV2Literal.fromJavaDateType( + dateTruncHelper(date.toJavaDateType(), trunc.getValue()), date.getDataType().getScale()); } @ExecFunction(name = "date_trunc") @@ -1011,27 +1016,27 @@ public class DateTimeExtractAndTransform { @ExecFunction(name = "from_second") public static Expression fromSecond(BigIntLiteral second) { - return fromMicroSecond(second.getValue() * 1000 * 1000); + return fromMicroSecond(second.getValue() * 1000 * 1000, FromSecond.RESULT_SCALE); } @ExecFunction(name = "from_millisecond") public static Expression fromMilliSecond(BigIntLiteral milliSecond) { - return fromMicroSecond(milliSecond.getValue() * 1000); + return fromMicroSecond(milliSecond.getValue() * 1000, FromMillisecond.RESULT_SCALE); } @ExecFunction(name = "from_microsecond") public static Expression fromMicroSecond(BigIntLiteral microSecond) { - return fromMicroSecond(microSecond.getValue()); + return fromMicroSecond(microSecond.getValue(), FromMicrosecond.RESULT_SCALE); } - private static Expression fromMicroSecond(long microSecond) { + private static Expression fromMicroSecond(long microSecond, int scale) { if (microSecond < 0 || microSecond > 253402271999999999L) { return new NullLiteral(DateTimeV2Type.SYSTEM_DEFAULT); } LocalDateTime dateTime = LocalDateTime.ofInstant( Instant.ofEpochMilli(microSecond / 1000).plusNanos(microSecond % 1000 * 1000), DateUtils.getTimeZone()); - return new DateTimeV2Literal(DateTimeV2Type.MAX, dateTime.getYear(), + return new DateTimeV2Literal(DateTimeV2Type.of(scale), dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(), dateTime.getNano() / 1000); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java index f99f7ca9dbc..ac9569f4378 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java @@ -39,8 +39,9 @@ public class FromMicrosecond extends ScalarFunction implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullableOnDateLikeV2Args, FromSecondMonotonic { + public static final int RESULT_SCALE = 6; private static final List<FunctionSignature> SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DateTimeV2Type.MAX).args(BigIntType.INSTANCE)); + FunctionSignature.ret(DateTimeV2Type.of(RESULT_SCALE)).args(BigIntType.INSTANCE)); public FromMicrosecond(Expression arg0) { super("from_microsecond", arg0); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java index ad0c385bf36..c333ae8b674 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java @@ -38,9 +38,9 @@ import java.util.List; public class FromMillisecond extends ScalarFunction implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullableOnDateLikeV2Args, FromSecondMonotonic { - public static final DateTimeV2Type MillisecondDateTimeV2 = DateTimeV2Type.of(3); + public static final int RESULT_SCALE = 3; private static final List<FunctionSignature> SIGNATURES = ImmutableList.of( - FunctionSignature.ret(MillisecondDateTimeV2).args(BigIntType.INSTANCE)); + FunctionSignature.ret(DateTimeV2Type.of(RESULT_SCALE)).args(BigIntType.INSTANCE)); public FromMillisecond(Expression arg0) { super("from_millisecond", arg0); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java index fdbbbebf870..a359f9b74d6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java @@ -39,8 +39,9 @@ public class FromSecond extends ScalarFunction implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullableOnDateLikeV2Args, FromSecondMonotonic { + public static final int RESULT_SCALE = 0; private static final List<FunctionSignature> SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(BigIntType.INSTANCE)); + FunctionSignature.ret(DateTimeV2Type.of(RESULT_SCALE)).args(BigIntType.INSTANCE)); public FromSecond(Expression arg0) { super("from_second", arg0); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java index 9ccc75fc797..0561db1d214 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java @@ -1302,14 +1302,14 @@ class FoldConstantTest extends ExpressionRewriteTestHelper { String[] answer = { "'2001-01-01 00:00:00'", "'2001-01-01 00:00:00.000000'", "'2001-12-01 00:00:00'", - "'2001-12-01 00:00:00.000000'", "'2001-12-31 00:00:00'", "'2001-12-31 00:00:00.000000'", + "'2001-12-01 00:00:00'", "'2001-12-31 00:00:00'", "'2001-12-31 00:00:00'", "'2001-12-31 01:00:00'", "'2001-12-31 01:00:00.000000'", "'2001-12-31 01:01:00'", - "'2001-12-31 01:01:00.000000'", "'2001-12-31 01:01:01'", "'2001-12-31 01:01:01.000000'", + "'2001-12-31 01:01:00'", "'2001-12-31 01:01:01'", "'2001-12-31 01:01:01'", "'2001-01-01 00:00:00'", "'2001-01-01 00:00:00'", "'2001-01-01 00:00:00'", "'2001-04-01 00:00:00'", "'2001-04-01 00:00:00'", "'2001-04-01 00:00:00'", "'2001-07-01 00:00:00'", "'2001-07-01 00:00:00'", "'2001-07-01 00:00:00'", "'2001-10-01 00:00:00'", "'2001-10-01 00:00:00'", "'2001-10-01 00:00:00'", - "'2001-01-15 00:00:00'", "'2001-02-12 00:00:00'", "'2001-03-12 00:00:00'", + "'2001-01-15 00:00:00'", "'2001-02-12 00:00:00'", "'2001-03-12 00:00:00'" }; int answerIdx = 0; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/DateTimeExtractAndTransformTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransformTest.java similarity index 87% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/DateTimeExtractAndTransformTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransformTest.java index 11ebeb42f56..c6289a45f9f 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/DateTimeExtractAndTransformTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransformTest.java @@ -15,12 +15,14 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.trees.expressions.functions; +package org.apache.doris.nereids.trees.expressions.functions.executable; -import org.apache.doris.nereids.trees.expressions.functions.executable.DateTimeExtractAndTransform; +import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal; import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral; +import org.apache.doris.nereids.trees.expressions.literal.StringLiteral; import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral; +import org.apache.doris.nereids.types.DateTimeV2Type; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -124,4 +126,26 @@ class DateTimeExtractAndTransformTest { Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx3)); Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx4)); } + + @Test + void testDateTruncScale() { + DateTimeV2Literal literal = new DateTimeV2Literal(DateTimeV2Type.of(3), 2025, 9, 25, 14, 57, 36, 123); + StringLiteral unit = new StringLiteral("HOUR"); + DateTimeV2Literal result = (DateTimeV2Literal) DateTimeExtractAndTransform.dateTrunc(literal, unit); + Assertions.assertEquals(3, result.getDataType().getScale()); + result = (DateTimeV2Literal) DateTimeExtractAndTransform.dateTrunc(unit, literal); + Assertions.assertEquals(3, result.getDataType().getScale()); + } + + @Test + void testFromSecondSacle() { + BigIntLiteral second = new BigIntLiteral(10000); + DateTimeV2Literal result; + result = (DateTimeV2Literal) DateTimeExtractAndTransform.fromSecond(second); + Assertions.assertEquals(0, result.getDataType().getScale()); + result = (DateTimeV2Literal) DateTimeExtractAndTransform.fromMilliSecond(second); + Assertions.assertEquals(3, result.getDataType().getScale()); + result = (DateTimeV2Literal) DateTimeExtractAndTransform.fromMicroSecond(second); + Assertions.assertEquals(6, result.getDataType().getScale()); + } } diff --git a/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy b/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy index c7c138e9934..ebd622bfa64 100644 --- a/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy +++ b/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy @@ -46,7 +46,7 @@ suite("nereids_test_alias_function") { test { sql 'select cast(f1(\'2023-06-01\', 3) as string);' - result([['2023-05-29 00:00:00.000000']]) + result([['2023-05-29 00:00:00']]) } test { sql 'select f2(f1(\'2023-05-20\', 2), 3)' --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
