This is an automated email from the ASF dual-hosted git repository.
jakevin 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 983f948ec4 [fix](Nereids): fix SimplifyComparisonPredicate (#24899)
983f948ec4 is described below
commit 983f948ec4a74638555d449a92bc67ffa7884be7
Author: jakevin <[email protected]>
AuthorDate: Tue Sep 26 14:28:03 2023 +0800
[fix](Nereids): fix SimplifyComparisonPredicate (#24899)
#16061 exist BUG, it causes wrong cast
---
.../rules/SimplifyComparisonPredicate.java | 71 ++++------------------
.../rules/SimplifyComparisonPredicateTest.java | 7 ++-
2 files changed, 17 insertions(+), 61 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
index 5c6025f060..74627eae9f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
@@ -17,7 +17,6 @@
package org.apache.doris.nereids.rules.expression.rules;
-import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
import org.apache.doris.nereids.trees.expressions.And;
@@ -76,8 +75,14 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
@Override
public Expression visitComparisonPredicate(ComparisonPredicate cp,
ExpressionRewriteContext context) {
- Expression left = rewrite(cp.left(), context);
- Expression right = rewrite(cp.right(), context);
+ cp = (ComparisonPredicate) visit(cp, context);
+
+ if (cp.left() instanceof Literal && !(cp.right() instanceof Literal)) {
+ cp = cp.commute();
+ }
+
+ Expression left = cp.left();
+ Expression right = cp.right();
// float like type: float, double
if (left.getDataType().isFloatLikeType() &&
right.getDataType().isFloatLikeType()) {
@@ -94,11 +99,7 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
return processDateLikeTypeCoercion(cp, left, right);
}
- if (left != cp.left() || right != cp.right()) {
- return cp.withChildren(left, right);
- } else {
- return cp;
- }
+ return cp;
}
private static Expression processComparisonPredicateDateTimeV2Literal(
@@ -145,14 +146,6 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
}
private Expression processDateLikeTypeCoercion(ComparisonPredicate cp,
Expression left, Expression right) {
- Expression originalRight = right;
- if (left instanceof DateLiteral) {
- cp = cp.commute();
- Expression temp = left;
- left = right;
- right = temp;
- }
-
if (left instanceof Cast && right instanceof DateLiteral) {
Cast cast = (Cast) left;
if (cast.child().getDataType() instanceof DateTimeType) {
@@ -164,8 +157,7 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
if (cast.child().getDataType() instanceof DateTimeV2Type) {
if (right instanceof DateTimeV2Literal) {
left = cast.child();
- return processComparisonPredicateDateTimeV2Literal(cp,
left,
- (DateTimeV2Literal) right);
+ return processComparisonPredicateDateTimeV2Literal(cp,
left, (DateTimeV2Literal) right);
}
}
// datetime to datev2
@@ -200,9 +192,10 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
// Date cp Date is not supported in BE storage engine. So cast to
DateTime
left = new Cast(left, DateTimeType.INSTANCE);
if (right instanceof DateLiteral) {
- right = migrateLiteralToDateTime((DateLiteral) originalRight);
+ DateLiteral l = (DateLiteral) right;
+ right = new DateTimeLiteral(l.getYear(), l.getMonth(),
l.getDay(), 0, 0, 0);
} else {
- right = new Cast(originalRight, DateTimeType.INSTANCE);
+ right = new Cast(right, DateTimeType.INSTANCE);
}
}
if (left != cp.left() || right != cp.right()) {
@@ -214,13 +207,6 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
private Expression processFloatLikeTypeCoercion(ComparisonPredicate
comparisonPredicate,
Expression left, Expression right) {
- if (left instanceof Literal) {
- comparisonPredicate = comparisonPredicate.commute();
- Expression temp = left;
- left = right;
- right = temp;
- }
-
if (left instanceof Cast &&
left.child(0).getDataType().isIntegerLikeType()
&& (right instanceof DoubleLiteral || right instanceof
FloatLiteral)) {
Cast cast = (Cast) left;
@@ -234,13 +220,6 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
private Expression processDecimalV3TypeCoercion(ComparisonPredicate
comparisonPredicate,
Expression left, Expression right) {
- if (left instanceof DecimalV3Literal) {
- comparisonPredicate = comparisonPredicate.commute();
- Expression temp = left;
- left = right;
- right = temp;
- }
-
if (left instanceof Cast && right instanceof DecimalV3Literal) {
Cast cast = (Cast) left;
left = cast.child();
@@ -348,30 +327,6 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule {
}
}
- /*
- derive tree:
- DateLiteral
- |
- +--->DateTimeLiteral
- | |
- | +----->DateTimeV2Literal
- +--->DateV2Literal
- */
- private Expression migrateLiteralToDateTime(DateLiteral l) {
- if (l instanceof DateV2Literal) {
- return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(),
0, 0, 0);
- } else if (l instanceof DateTimeV2Literal) {
- DateTimeV2Literal dtv2 = (DateTimeV2Literal) l;
- return new DateTimeLiteral(dtv2.getYear(), dtv2.getMonth(),
dtv2.getDay(),
- dtv2.getHour(), dtv2.getMinute(), dtv2.getSecond());
- } else if (l instanceof DateTimeLiteral) {
- return l;
- } else if (l instanceof DateLiteral) {
- return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(),
0, 0, 0);
- }
- throw new AnalysisException("cannot convert" + l.toSql() + " to
DateTime");
- }
-
private Expression migrateToDateTime(DateTimeV2Literal l) {
return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(),
l.getHour(), l.getMinute(), l.getSecond());
}
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 b06d914b65..898bc2b619 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
@@ -39,7 +39,8 @@ class SimplifyComparisonPredicateTest extends
ExpressionRewriteTestHelper {
@Test
void testSimplifyComparisonPredicateRule() {
- executor = new
ExpressionRuleExecutor(ImmutableList.of(SimplifyCastRule.INSTANCE,
SimplifyComparisonPredicate.INSTANCE));
+ executor = new ExpressionRuleExecutor(
+ ImmutableList.of(SimplifyCastRule.INSTANCE,
SimplifyComparisonPredicate.INSTANCE));
Expression dtv2 = new DateTimeV2Literal(1, 1, 1, 1, 1, 1, 0);
Expression dt = new DateTimeLiteral(1, 1, 1, 1, 1, 1);
@@ -67,10 +68,10 @@ class SimplifyComparisonPredicateTest extends
ExpressionRewriteTestHelper {
// DateTimeV2 -> Date
assertRewrite(
new GreaterThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT),
dtv2),
- new GreaterThan(new Cast(d, DateTimeType.INSTANCE), dt));
+ new GreaterThan(new Cast(d, DateTimeType.INSTANCE), new
DateTimeLiteral(1, 1, 1, 0, 0, 0)));
assertRewrite(
new LessThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2),
- new LessThan(new Cast(d, DateTimeType.INSTANCE), dt));
+ new LessThan(new Cast(d, DateTimeType.INSTANCE), new
DateTimeLiteral(1, 1, 2, 0, 0, 0)));
assertRewrite(
new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2),
new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]