This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new f0dbce4cf58 [fix](Nereids) compound predicate need cast children to 
boolean (#27649)
f0dbce4cf58 is described below

commit f0dbce4cf58ec829734175e05bf2188c7158078d
Author: morrySnow <[email protected]>
AuthorDate: Tue Nov 28 16:55:44 2023 +0800

    [fix](Nereids) compound predicate need cast children to boolean (#27649)
---
 .../doris/nereids/rules/analysis/BindExpression.java       |  6 ++++++
 .../nereids/rules/rewrite/AdjustConjunctsReturnType.java   |  3 +--
 .../doris/nereids/trees/plans/logical/LogicalFilter.java   |  2 +-
 .../doris/nereids/trees/plans/logical/LogicalHaving.java   |  2 +-
 .../org/apache/doris/nereids/util/TypeCoercionUtils.java   | 14 ++------------
 5 files changed, 11 insertions(+), 16 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
index dd967984c3e..970858c4a1a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
@@ -76,6 +76,7 @@ import 
org.apache.doris.nereids.trees.plans.logical.LogicalSubQueryAlias;
 import org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation;
 import org.apache.doris.nereids.trees.plans.logical.UsingJoin;
 import org.apache.doris.nereids.trees.plans.visitor.InferPlanOutputAlias;
+import org.apache.doris.nereids.types.BooleanType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
 import org.apache.doris.qe.ConnectContext;
@@ -158,6 +159,7 @@ public class BindExpression implements AnalysisRuleFactory {
                     Set<Expression> boundConjuncts = 
filter.getConjuncts().stream()
                             .map(expr -> bindSlot(expr, filter.child(), 
ctx.cascadesContext))
                             .map(expr -> bindFunction(expr, ctx.root, 
ctx.cascadesContext))
+                            .map(expr -> 
TypeCoercionUtils.castIfNotSameType(expr, BooleanType.INSTANCE))
                             .collect(ImmutableSet.toImmutableSet());
                     return new LogicalFilter<>(boundConjuncts, filter.child());
                 })
@@ -211,10 +213,12 @@ public class BindExpression implements 
AnalysisRuleFactory {
                     List<Expression> cond = 
join.getOtherJoinConjuncts().stream()
                             .map(expr -> bindSlot(expr, join.children(), 
ctx.cascadesContext))
                             .map(expr -> bindFunction(expr, ctx.root, 
ctx.cascadesContext))
+                            .map(expr -> 
TypeCoercionUtils.castIfNotSameType(expr, BooleanType.INSTANCE))
                             .collect(Collectors.toList());
                     List<Expression> hashJoinConjuncts = 
join.getHashJoinConjuncts().stream()
                             .map(expr -> bindSlot(expr, join.children(), 
ctx.cascadesContext))
                             .map(expr -> bindFunction(expr, ctx.root, 
ctx.cascadesContext))
+                            .map(expr -> 
TypeCoercionUtils.castIfNotSameType(expr, BooleanType.INSTANCE))
                             .collect(Collectors.toList());
                     return new LogicalJoin<>(join.getJoinType(),
                             hashJoinConjuncts, cond, join.getHint(), 
join.getMarkJoinSlotReference(),
@@ -476,6 +480,7 @@ public class BindExpression implements AnalysisRuleFactory {
                                 return bindSlot(expr, childPlan, 
ctx.cascadesContext, false);
                             })
                             .map(expr -> bindFunction(expr, ctx.root, 
ctx.cascadesContext))
+                            .map(expr -> 
TypeCoercionUtils.castIfNotSameType(expr, BooleanType.INSTANCE))
                             .collect(Collectors.toSet());
                     
checkIfOutputAliasNameDuplicatedForGroupBy(ImmutableList.copyOf(boundConjuncts),
                             childPlan.getOutputExpressions());
@@ -492,6 +497,7 @@ public class BindExpression implements AnalysisRuleFactory {
                                 return bindSlot(expr, childPlan.children(), 
ctx.cascadesContext, false);
                             })
                             .map(expr -> bindFunction(expr, ctx.root, 
ctx.cascadesContext))
+                            .map(expr -> 
TypeCoercionUtils.castIfNotSameType(expr, BooleanType.INSTANCE))
                             .collect(Collectors.toSet());
                     
checkIfOutputAliasNameDuplicatedForGroupBy(ImmutableList.copyOf(boundConjuncts),
                             
childPlan.getOutput().stream().map(NamedExpression.class::cast)
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustConjunctsReturnType.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustConjunctsReturnType.java
index 096799bec8f..9c1a60fdf5f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustConjunctsReturnType.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustConjunctsReturnType.java
@@ -22,7 +22,6 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter;
 import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
 import org.apache.doris.nereids.types.BooleanType;
@@ -44,7 +43,7 @@ public class AdjustConjunctsReturnType extends 
DefaultPlanRewriter<Void> impleme
 
     @Override
     public Plan visit(Plan plan, Void context) {
-        return (LogicalPlan) super.visit(plan, context);
+        return super.visit(plan, context);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
index a1817555436..cb5502d1b69 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
@@ -63,7 +63,7 @@ public class LogicalFilter<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_T
     }
 
     public List<Expression> getExpressions() {
-        return ImmutableList.of(getPredicate());
+        return ImmutableList.copyOf(conjuncts);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHaving.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHaving.java
index 6537770b401..8524b35d827 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHaving.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalHaving.java
@@ -61,7 +61,7 @@ public class LogicalHaving<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_T
     }
 
     public List<Expression> getExpressions() {
-        return ImmutableList.of(getPredicate());
+        return ImmutableList.copyOf(conjuncts);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
index 35740518175..c940e08de1f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
@@ -1028,19 +1028,9 @@ public class TypeCoercionUtils {
     public static Expression processCompoundPredicate(CompoundPredicate 
compoundPredicate) {
         // check
         compoundPredicate.checkLegalityBeforeTypeCoercion();
-
-        compoundPredicate.children().forEach(e -> {
-                    if (!e.getDataType().isBooleanType() && 
!e.getDataType().isNullType()
-                            && !(e instanceof SubqueryExpr)) {
-                        throw new AnalysisException(String.format(
-                                "Operand '%s' part of predicate " + "'%s' 
should return type 'BOOLEAN' but "
-                                        + "returns type '%s'.",
-                                e.toSql(), compoundPredicate.toSql(), 
e.getDataType()));
-                    }
-                }
-        );
         List<Expression> children = compoundPredicate.children().stream()
-                .map(e -> e.getDataType().isNullType() ? new 
NullLiteral(BooleanType.INSTANCE) : e)
+                .map(e -> e.getDataType().isNullType() ? new 
NullLiteral(BooleanType.INSTANCE)
+                        : castIfNotSameType(e, BooleanType.INSTANCE))
                 .collect(Collectors.toList());
         return compoundPredicate.withChildren(children);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to