[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)

View File

@ -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

View File

@ -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"
}
}