LiBinfeng-01 commented on code in PR #21171:
URL: https://github.com/apache/doris/pull/21171#discussion_r1264792470
##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PredicatePropagation.java:
##########
@@ -70,19 +72,44 @@ public Expression visit(Expression expr, Void context) {
@Override
public Expression visitComparisonPredicate(ComparisonPredicate cp,
Void context) {
- if (cp.left().isSlot() && cp.right().isConstant()) {
- return replaceSlot(cp);
- } else if (cp.left().isConstant() && cp.right().isSlot()) {
- return replaceSlot(cp);
+ if (isExpressionSlotCoveredByCast(cp.left()) &&
(cp.right().isConstant())) {
+ return replaceSlot(cp,
getDatatypeCoveredByCast(cp.left()));
+ } else if (isExpressionSlotCoveredByCast(cp.right()) &&
cp.left().isConstant()) {
+ return replaceSlot(cp,
getDatatypeCoveredByCast(cp.right()));
}
return super.visit(cp, context);
}
- private Expression replaceSlot(Expression expr) {
+ private boolean isTwoExpressionEqualWithCast(Expression left,
Expression right) {
+ return
getSlotCoveredByCast(left).equals(getSlotCoveredByCast(right));
+ }
+
+ private boolean canCompareType(DataType dataType) {
+ return dataType.isBigIntType() || dataType.isIntegerType() ||
dataType.isSmallIntType()
+ || dataType.isTinyIntType() ||
dataType.isLargeIntType();
+ }
+
+ private boolean isOriginDataTypeBigger(DataType originDataType,
Expression expr) {
+ if
(canCompareType(leftSlotEqualToRightSlot.child(0).getDataType())
+ &&
canCompareType(leftSlotEqualToRightSlot.child(1).getDataType())
+ && canCompareType(originDataType)) {
+ // infer filter can not be lower than original datatype,
or dataset would be wrong
+ if (originDataType.width() >
leftSlotEqualToRightSlot.child(0).getDataType().width()
+ || originDataType.width() >
leftSlotEqualToRightSlot.child(1).getDataType().width()) {
Review Comment:
done
##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PredicatePropagation.java:
##########
@@ -70,19 +72,44 @@ public Expression visit(Expression expr, Void context) {
@Override
public Expression visitComparisonPredicate(ComparisonPredicate cp,
Void context) {
- if (cp.left().isSlot() && cp.right().isConstant()) {
- return replaceSlot(cp);
- } else if (cp.left().isConstant() && cp.right().isSlot()) {
- return replaceSlot(cp);
+ if (isExpressionSlotCoveredByCast(cp.left()) &&
(cp.right().isConstant())) {
+ return replaceSlot(cp,
getDatatypeCoveredByCast(cp.left()));
+ } else if (isExpressionSlotCoveredByCast(cp.right()) &&
cp.left().isConstant()) {
+ return replaceSlot(cp,
getDatatypeCoveredByCast(cp.right()));
}
return super.visit(cp, context);
}
- private Expression replaceSlot(Expression expr) {
+ private boolean isTwoExpressionEqualWithCast(Expression left,
Expression right) {
+ return
getSlotCoveredByCast(left).equals(getSlotCoveredByCast(right));
+ }
+
+ private boolean canCompareType(DataType dataType) {
Review Comment:
done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]