[fix](nereids) allow in or exits subquery in binary operator (#22391)

support subquery in binary operator like if( xx  in ( subquery ), 1, 0 )
This commit is contained in:
starocean999
2023-08-04 15:35:19 +08:00
committed by GitHub
parent d379b04b39
commit ef53a27887
3 changed files with 32 additions and 19 deletions

View File

@ -21,7 +21,6 @@ import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.analyzer.Scope;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.BinaryOperator;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.Exists;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.InSubquery;
@ -104,14 +103,6 @@ class SubExprAnalyzer extends DefaultExpressionRewriter<CascadesContext> {
return new ScalarSubquery(analyzedResult.getLogicalPlan(), analyzedResult.getCorrelatedSlots());
}
@Override
public Expression visitBinaryOperator(BinaryOperator binaryOperator, CascadesContext context) {
if (childrenAtLeastOneInOrExistsSub(binaryOperator) && (binaryOperator instanceof ComparisonPredicate)) {
throw new AnalysisException("Not support binaryOperator children at least one is in or exists subquery");
}
return visit(binaryOperator, context);
}
private boolean childrenAtLeastOneInOrExistsSub(BinaryOperator binaryOperator) {
return binaryOperator.left().anyMatch(InSubquery.class::isInstance)
|| binaryOperator.left().anyMatch(Exists.class::isInstance)