enable run match expression outer of filter plan, e.g join conjunct support eliminate outer join by match expression, if any arguments of match expression is null literal
This commit is contained in:
@ -24,7 +24,6 @@ import org.apache.doris.nereids.rules.RuleType;
|
||||
import org.apache.doris.nereids.trees.expressions.Alias;
|
||||
import org.apache.doris.nereids.trees.expressions.ExprId;
|
||||
import org.apache.doris.nereids.trees.expressions.Expression;
|
||||
import org.apache.doris.nereids.trees.expressions.Match;
|
||||
import org.apache.doris.nereids.trees.expressions.NamedExpression;
|
||||
import org.apache.doris.nereids.trees.expressions.Slot;
|
||||
import org.apache.doris.nereids.trees.expressions.SlotNotFromChildren;
|
||||
@ -39,9 +38,6 @@ import org.apache.doris.nereids.trees.expressions.functions.window.WindowFunctio
|
||||
import org.apache.doris.nereids.trees.plans.Plan;
|
||||
import org.apache.doris.nereids.trees.plans.algebra.Generate;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalDeferMaterializeOlapScan;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
|
||||
@ -64,7 +60,6 @@ public class CheckAfterRewrite extends OneAnalysisRuleFactory {
|
||||
checkAllSlotReferenceFromChildren(plan);
|
||||
checkUnexpectedExpression(plan);
|
||||
checkMetricTypeIsUsedCorrectly(plan);
|
||||
checkMatchIsUsedCorrectly(plan);
|
||||
return null;
|
||||
}).toRule(RuleType.CHECK_ANALYSIS);
|
||||
}
|
||||
@ -181,19 +176,4 @@ public class CheckAfterRewrite extends OneAnalysisRuleFactory {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void checkMatchIsUsedCorrectly(Plan plan) {
|
||||
for (Expression expression : plan.getExpressions()) {
|
||||
if (expression instanceof Match) {
|
||||
if (plan instanceof LogicalFilter && (plan.child(0) instanceof LogicalOlapScan
|
||||
|| plan.child(0) instanceof LogicalDeferMaterializeOlapScan)) {
|
||||
return;
|
||||
} else {
|
||||
throw new AnalysisException(String.format(
|
||||
"Not support match in %s in plan: %s, only support in olapScan filter",
|
||||
plan.child(0), plan));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,6 +43,7 @@ import org.apache.doris.nereids.trees.expressions.InPredicate;
|
||||
import org.apache.doris.nereids.trees.expressions.IsNull;
|
||||
import org.apache.doris.nereids.trees.expressions.LessThan;
|
||||
import org.apache.doris.nereids.trees.expressions.LessThanEqual;
|
||||
import org.apache.doris.nereids.trees.expressions.Match;
|
||||
import org.apache.doris.nereids.trees.expressions.Not;
|
||||
import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
|
||||
import org.apache.doris.nereids.trees.expressions.Or;
|
||||
@ -190,6 +191,16 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule
|
||||
return literal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitMatch(Match match, ExpressionRewriteContext context) {
|
||||
match = rewriteChildren(match, context);
|
||||
Optional<Expression> checkedExpr = preProcess(match);
|
||||
if (checkedExpr.isPresent()) {
|
||||
return checkedExpr.get();
|
||||
}
|
||||
return super.visitMatch(match, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitEncryptKeyRef(EncryptKeyRef encryptKeyRef, ExpressionRewriteContext context) {
|
||||
String dbName = encryptKeyRef.getDbName();
|
||||
|
||||
@ -130,7 +130,7 @@ public class PartitionPruner extends DefaultExpressionRewriter<Void> {
|
||||
partitionPredicate, new ExpressionRewriteContext(cascadesContext));
|
||||
if (BooleanLiteral.TRUE.equals(partitionPredicate)) {
|
||||
return Utils.fastToImmutableList(idToPartitions.keySet());
|
||||
} else if (Boolean.FALSE.equals(partitionPredicate) || partitionPredicate.isNullLiteral()) {
|
||||
} else if (BooleanLiteral.FALSE.equals(partitionPredicate) || partitionPredicate.isNullLiteral()) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user