[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:
@ -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)
|
||||
|
||||
@ -1,4 +1,34 @@
|
||||
-- This file is automatically generated. You should know what you did if you want to edit this
|
||||
-- !alias_scalar --
|
||||
1 2
|
||||
1 3
|
||||
|
||||
-- !alias_in --
|
||||
3 3
|
||||
|
||||
-- !alias_not_in --
|
||||
1 2
|
||||
1 3
|
||||
2 4
|
||||
2 5
|
||||
3 4
|
||||
20 2
|
||||
22 3
|
||||
24 4
|
||||
|
||||
-- !alias_exist --
|
||||
1 2
|
||||
1 3
|
||||
2 4
|
||||
3 3
|
||||
3 4
|
||||
20 2
|
||||
22 3
|
||||
24 4
|
||||
|
||||
-- !alias_not_exist --
|
||||
2 5
|
||||
|
||||
-- !exists_subquery_with_limit --
|
||||
1 2
|
||||
1 3
|
||||
|
||||
@ -120,7 +120,7 @@ suite ("sub_query_diff_old_optimize") {
|
||||
|
||||
//----------with subquery alias----------
|
||||
//----------remove temporarily-----------
|
||||
/*qt_alias_scalar """
|
||||
qt_alias_scalar """
|
||||
select * from sub_query_diff_old_optimize_subquery1
|
||||
where sub_query_diff_old_optimize_subquery1.k1 < (select max(aa) from
|
||||
(select k1 as aa from sub_query_diff_old_optimize_subquery3 where sub_query_diff_old_optimize_subquery1.k2 = sub_query_diff_old_optimize_subquery3.v2) sub_query_diff_old_optimize_subquery3) order by k1, k2
|
||||
@ -148,7 +148,7 @@ suite ("sub_query_diff_old_optimize") {
|
||||
select * from sub_query_diff_old_optimize_subquery1
|
||||
where not exists (select aa from
|
||||
(select k1 as aa from sub_query_diff_old_optimize_subquery3 where sub_query_diff_old_optimize_subquery1.k2 = sub_query_diff_old_optimize_subquery3.v2) sub_query_diff_old_optimize_subquery3) order by k1, k2
|
||||
"""*/
|
||||
"""
|
||||
|
||||
//----------subquery with limit----------
|
||||
order_qt_exists_subquery_with_limit """
|
||||
@ -176,12 +176,4 @@ suite ("sub_query_diff_old_optimize") {
|
||||
exception "java.sql.SQLException: errCode = 2, detailMessage = Unexpected exception: scalar subquery's correlatedPredicates's operator must be EQ"
|
||||
|
||||
}
|
||||
|
||||
test {
|
||||
sql """
|
||||
SELECT * FROM sub_query_diff_old_optimize_subquery1 WHERE (k1 IN (SELECT k1 FROM sub_query_diff_old_optimize_subquery3) OR k1 < 10) != true;
|
||||
"""
|
||||
exception "java.sql.SQLException: errCode = 2, detailMessage = Unexpected exception: Not support binaryOperator children at least one is in or exists subquery"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user