This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new e4f41dbf1ec [fix](Nereids) DatetimeV2 round floor and round ceiling is wrong (#35153) e4f41dbf1ec is described below commit e4f41dbf1ec03f5937fdeba2ee1454a20254015b Author: morrySnow <101034200+morrys...@users.noreply.github.com> AuthorDate: Wed May 22 16:11:45 2024 +0800 [fix](Nereids) DatetimeV2 round floor and round ceiling is wrong (#35153) 1. round floor was incorrectly implemented as round 2. round ceiling not really round because use double type when divide --- .../expressions/literal/DateTimeV2Literal.java | 6 +-- .../rules/SimplifyComparisonPredicateSqlTest.java | 4 +- .../rules/SimplifyComparisonPredicateTest.java | 4 +- .../expressions/literal/DateTimeLiteralTest.java | 47 ++++++++++++++++++++++ 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java index 2417d92e89a..778d74e1e3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java @@ -232,7 +232,7 @@ public class DateTimeV2Literal extends DateTimeLiteral { long newYear = year; if (remain != 0) { newMicroSecond = Double - .valueOf((microSecond + (Math.pow(10, 6 - newScale))) + .valueOf((microSecond + (int) (Math.pow(10, 6 - newScale))) / (int) (Math.pow(10, 6 - newScale)) * (Math.pow(10, 6 - newScale))) .longValue(); } @@ -251,8 +251,8 @@ public class DateTimeV2Literal extends DateTimeLiteral { } public DateTimeV2Literal roundFloor(int newScale) { - // use roundMicroSecond in constructor - return new DateTimeV2Literal(DateTimeV2Type.of(newScale), year, month, day, hour, minute, second, microSecond); + return new DateTimeV2Literal(DateTimeV2Type.of(newScale), year, month, day, hour, minute, second, + microSecond / (int) Math.pow(10, 6 - newScale) * (int) Math.pow(10, 6 - newScale)); } public static Expression fromJavaDateType(LocalDateTime dateTime) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateSqlTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateSqlTest.java index 72da944fdac..29889efdd6c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateSqlTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateSqlTest.java @@ -67,7 +67,7 @@ class SimplifyComparisonPredicateSqlTest extends TestWithFeService implements Me .rewrite() .matches( logicalFilter() - .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(a <= '2023-06-16 00:00:00')"))) + .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(a <= '2023-06-15 23:59:59')"))) .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(b <= 111.11)"))) ); @@ -83,7 +83,7 @@ class SimplifyComparisonPredicateSqlTest extends TestWithFeService implements Me .rewrite() .matches( logicalFilter() - .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(a > '2023-06-16 00:00:00')"))) + .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(a > '2023-06-15 23:59:59')"))) .when(f -> f.getConjuncts().stream().anyMatch(e -> e.toSql().equals("(b > 111.11)"))) ); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java index 1955571231b..e85cf38a737 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java @@ -131,8 +131,8 @@ class SimplifyComparisonPredicateTest extends ExpressionRewriteTestHelper { Expression expression = new GreaterThan(left, right); Expression rewrittenExpression = executor.rewrite(typeCoercion(expression), context); - // right should round to be 2021-01-02 00:00:00.00 - Assertions.assertEquals(new DateTimeLiteral("2021-01-02 00:00:00"), rewrittenExpression.child(1)); + // right should round to be 2021-01-01 23:59:59 + Assertions.assertEquals(new DateTimeLiteral("2021-01-01 23:59:59"), rewrittenExpression.child(1)); } @Test diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java index 184cf5dbf63..6774e96227c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java @@ -443,4 +443,51 @@ class DateTimeLiteralTest { new DateTimeV2Literal(DateTimeV2Type.of(5), "2016-12-31 23:59:59.999999"), new DateTimeV2Literal("2017-01-01 00:00:00.0")); } + + @Test + void testRoundFloor() { + DateTimeV2Literal literal; + literal = new DateTimeV2Literal(DateTimeV2Type.of(6), 2000, 2, 2, 2, 2, 2, 222222); + Assertions.assertEquals(222222, literal.roundFloor(6).microSecond); + Assertions.assertEquals(222220, literal.roundFloor(5).microSecond); + Assertions.assertEquals(222200, literal.roundFloor(4).microSecond); + Assertions.assertEquals(222000, literal.roundFloor(3).microSecond); + Assertions.assertEquals(220000, literal.roundFloor(2).microSecond); + Assertions.assertEquals(200000, literal.roundFloor(1).microSecond); + Assertions.assertEquals(0, literal.roundFloor(0).microSecond); + } + + @Test + void testRoundCeiling() { + DateTimeV2Literal literal; + literal = new DateTimeV2Literal(DateTimeV2Type.of(6), 2000, 12, 31, 23, 59, 59, 111111); + Assertions.assertEquals(111111, literal.roundCeiling(6).microSecond); + Assertions.assertEquals(111120, literal.roundCeiling(5).microSecond); + Assertions.assertEquals(111200, literal.roundCeiling(4).microSecond); + Assertions.assertEquals(112000, literal.roundCeiling(3).microSecond); + Assertions.assertEquals(120000, literal.roundCeiling(2).microSecond); + Assertions.assertEquals(200000, literal.roundCeiling(1).microSecond); + Assertions.assertEquals(0, literal.roundCeiling(0).microSecond); + Assertions.assertEquals(0, literal.roundCeiling(0).second); + Assertions.assertEquals(0, literal.roundCeiling(0).minute); + Assertions.assertEquals(0, literal.roundCeiling(0).hour); + Assertions.assertEquals(1, literal.roundCeiling(0).day); + Assertions.assertEquals(1, literal.roundCeiling(0).month); + Assertions.assertEquals(2001, literal.roundCeiling(0).year); + + literal = new DateTimeV2Literal(DateTimeV2Type.of(6), 2000, 12, 31, 23, 59, 59, 888888); + Assertions.assertEquals(888888, literal.roundCeiling(6).microSecond); + Assertions.assertEquals(888890, literal.roundCeiling(5).microSecond); + Assertions.assertEquals(888900, literal.roundCeiling(4).microSecond); + Assertions.assertEquals(889000, literal.roundCeiling(3).microSecond); + Assertions.assertEquals(890000, literal.roundCeiling(2).microSecond); + Assertions.assertEquals(900000, literal.roundCeiling(1).microSecond); + Assertions.assertEquals(0, literal.roundCeiling(0).microSecond); + Assertions.assertEquals(0, literal.roundCeiling(0).second); + Assertions.assertEquals(0, literal.roundCeiling(0).minute); + Assertions.assertEquals(0, literal.roundCeiling(0).hour); + Assertions.assertEquals(1, literal.roundCeiling(0).day); + Assertions.assertEquals(1, literal.roundCeiling(0).month); + Assertions.assertEquals(2001, literal.roundCeiling(0).year); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org