Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.doris.nereids.trees.expressions.LessThanEqual;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
import org.apache.doris.nereids.trees.expressions.TryCast;
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;
Expand Down Expand Up @@ -544,6 +545,7 @@ private static Expression processIntegerDecimalLiteralComparison(

private static Expression processTypeRangeLimitComparison(ComparisonPredicate cp, Expression left,
NumericLiteral right) {
Expression nullabilityExpression = left;
BigDecimal typeMinValue = null;
BigDecimal typeMaxValue = null;
// cmp float like have lost precision, for example float.max_value + 0.01 still eval to float.max_value
Expand All @@ -559,7 +561,11 @@ private static Expression processTypeRangeLimitComparison(ComparisonPredicate cp
// cast(child as dataType2) range should be:
// [ max(childDataType.min_value, dataType2.min_value), min(childDataType.max_value, dataType2.max_value)]
if (left instanceof Cast) {
boolean isTryCast = left instanceof TryCast;
left = ((Cast) left).child();
if (!isTryCast) {
nullabilityExpression = left;
}
if (left.getDataType().isIntegerLikeType() || left.getDataType().isDecimalV3Type()) {
Optional<Pair<BigDecimal, BigDecimal>> minMaxOpt =
TypeCoercionUtils.getDataTypeMinMaxValue(left.getDataType());
Expand All @@ -582,45 +588,45 @@ private static Expression processTypeRangeLimitComparison(ComparisonPredicate cp
int cmpMax = literal.compareTo(typeMaxValue);
if (cp instanceof EqualTo) {
if (cmpMin < 0 || cmpMax > 0) {
return ExpressionUtils.falseOrNull(left);
return ExpressionUtils.falseOrNull(nullabilityExpression);
}
} else if (cp instanceof NullSafeEqual) {
if (cmpMin < 0 || cmpMax > 0) {
return BooleanLiteral.of(false);
}
} else if (cp instanceof GreaterThan) {
if (cmpMin < 0) {
return ExpressionUtils.trueOrNull(left);
return ExpressionUtils.trueOrNull(nullabilityExpression);
}
if (cmpMax >= 0) {
return ExpressionUtils.falseOrNull(left);
return ExpressionUtils.falseOrNull(nullabilityExpression);
}
} else if (cp instanceof GreaterThanEqual) {
if (cmpMin <= 0) {
return ExpressionUtils.trueOrNull(left);
return ExpressionUtils.trueOrNull(nullabilityExpression);
}
if (cmpMax == 0) {
return new EqualTo(cp.left(), cp.right());
}
if (cmpMax > 0) {
return ExpressionUtils.falseOrNull(left);
return ExpressionUtils.falseOrNull(nullabilityExpression);
}
} else if (cp instanceof LessThan) {
if (cmpMin <= 0) {
return ExpressionUtils.falseOrNull(left);
return ExpressionUtils.falseOrNull(nullabilityExpression);
}
if (cmpMax > 0) {
return ExpressionUtils.trueOrNull(left);
return ExpressionUtils.trueOrNull(nullabilityExpression);
}
} else if (cp instanceof LessThanEqual) {
if (cmpMin < 0) {
return ExpressionUtils.falseOrNull(left);
return ExpressionUtils.falseOrNull(nullabilityExpression);
}
if (cmpMin == 0) {
return new EqualTo(cp.left(), cp.right());
}
if (cmpMax >= 0) {
return ExpressionUtils.trueOrNull(left);
return ExpressionUtils.trueOrNull(nullabilityExpression);
}
}
return cp;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.TryCast;
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;
Expand Down Expand Up @@ -1071,6 +1072,23 @@ private enum RangeLimitResult {
NO_CHANGE_CP // no change cmp type
}

@Test
void testTypeRangeLimitPreservesTryCastNullability() {
executor = new ExpressionRuleExecutor(ImmutableList.of(
bottomUp(SimplifyComparisonPredicate.INSTANCE)
));

SlotReference nonNullableSlot = new SlotReference("slot", BigIntType.INSTANCE, false);
TryCast tryCast = new TryCast(nonNullableSlot, TinyIntType.INSTANCE);

assertRewrite(new GreaterThan(tryCast, new TinyIntLiteral((byte) 127)),
ExpressionUtils.falseOrNull(tryCast));
assertRewrite(new LessThan(tryCast, new TinyIntLiteral((byte) -128)),
ExpressionUtils.falseOrNull(tryCast));
assertRewrite(new LessThanEqual(tryCast, new TinyIntLiteral((byte) 127)),
ExpressionUtils.trueOrNull(tryCast));
}

@Test
void testTypeRangeLimit() {
executor = new ExpressionRuleExecutor(ImmutableList.of(
Expand Down
Loading