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

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 13d39887d63 branch-4.0: [fix](fold constant) fix result's scale of 
some datetime related function #56671 (#56831)
13d39887d63 is described below

commit 13d39887d632f8cd8b29aadeab0747a48783f942
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sat Oct 11 18:47:06 2025 +0800

    branch-4.0: [fix](fold constant) fix result's scale of some datetime 
related function #56671 (#56831)
    
    Cherry-picked from #56671
    
    Co-authored-by: morrySnow <[email protected]>
---
 .../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 |  4 ++--
 .../DateTimeExtractAndTransformTest.java           | 28 ++++++++++++++++++++--
 .../nereids_p0/javaudf/test_alias_function.groovy  |  2 +-
 7 files changed, 47 insertions(+), 16 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 92b8a8d0e9a..b43588d39cb 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
@@ -21,6 +21,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;
@@ -404,7 +407,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.getScale());
     }
 
     @ExecFunction(name = "date_trunc")
@@ -414,7 +418,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.getScale());
     }
 
     @ExecFunction(name = "date_trunc")
@@ -1057,27 +1062,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) {
             throw new AnalysisException("Operation from_microsecond of " + 
microSecond + " out of range");
         }
         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 11af6b27106..a7c21daae0b 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
@@ -40,8 +40,9 @@ public class FromMicrosecond extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullLiteral, PropagateNullable,
         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 c446bf622ed..b2a719f17fa 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
@@ -39,9 +39,9 @@ import java.util.List;
 public class FromMillisecond extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullLiteral, PropagateNullable,
         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 ebc8f4a200c..bde4678aefe 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
@@ -40,8 +40,9 @@ public class FromSecond extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullLiteral, PropagateNullable,
         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 0ba1f18c054..66f9b5f3f1f 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
@@ -1367,8 +1367,8 @@ class FoldConstantTest extends 
ExpressionRewriteTestHelper {
         String[] tags = {"year", "month", "day", "hour", "minute", "second"};
 
         String[] answer = {
-                "'2001-01-01 00:00:00.000000'", "'2001-12-01 
00:00:00.000000'", "'2001-12-31 00:00:00.000000'",
-                "'2001-12-31 01:00:00.000000'", "'2001-12-31 
01:01:00.000000'", "'2001-12-31 01:01:01.000000'"
+                "'2001-01-01 00:00:00'", "'2001-12-01 00:00:00'", "'2001-12-31 
00:00:00'",
+                "'2001-12-31 01:00:00'", "'2001-12-31 01:01:00'", "'2001-12-31 
01:01:01'"
         };
         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..53f73c85903 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.getScale());
+        result = (DateTimeV2Literal) 
DateTimeExtractAndTransform.dateTrunc(unit, literal);
+        Assertions.assertEquals(3, result.getScale());
+    }
+
+    @Test
+    void testFromSecondSacle() {
+        BigIntLiteral second = new BigIntLiteral(10000);
+        DateTimeV2Literal result;
+        result = (DateTimeV2Literal) 
DateTimeExtractAndTransform.fromSecond(second);
+        Assertions.assertEquals(0, result.getScale());
+        result = (DateTimeV2Literal) 
DateTimeExtractAndTransform.fromMilliSecond(second);
+        Assertions.assertEquals(3, result.getScale());
+        result = (DateTimeV2Literal) 
DateTimeExtractAndTransform.fromMicroSecond(second);
+        Assertions.assertEquals(6, result.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]

Reply via email to