This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch fix_unbound in repository https://gitbox.apache.org/repos/asf/doris.git
commit ffbb73a37ba8ba8e6d63f46a26bbc7b09e8571b0 Author: morrySnow <morrys...@126.com> AuthorDate: Fri Oct 20 11:29:42 2023 +0800 [fix](Nereids) throw unbound exception when do type coercion intro by PR #25609 --- .../nereids/rules/expression/rules/FunctionBinder.java | 18 ++++++++++++++++-- .../nereids/trees/expressions/TimestampArithmetic.java | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java index 135bf3e0008..b56fe657633 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java @@ -20,7 +20,6 @@ package org.apache.doris.nereids.rules.expression.rules; import org.apache.doris.analysis.ArithmeticExpr.Operator; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.FunctionRegistry; -import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.nereids.analyzer.UnboundFunction; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.rules.analysis.ArithmeticFunctionBinder; @@ -42,11 +41,13 @@ import org.apache.doris.nereids.trees.expressions.ListQuery; import org.apache.doris.nereids.trees.expressions.Match; import org.apache.doris.nereids.trees.expressions.Not; import org.apache.doris.nereids.trees.expressions.TimestampArithmetic; +import org.apache.doris.nereids.trees.expressions.WhenClause; import org.apache.doris.nereids.trees.expressions.functions.BoundFunction; import org.apache.doris.nereids.trees.expressions.functions.FunctionBuilder; import org.apache.doris.nereids.trees.expressions.functions.udf.AliasUdfBuilder; import org.apache.doris.nereids.trees.expressions.typecoercion.ImplicitCastInputTypes; import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.coercion.AbstractDataType; import org.apache.doris.nereids.util.TypeCoercionUtils; @@ -129,6 +130,8 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { Expression left = arithmetic.left().accept(this, context); Expression right = arithmetic.right().accept(this, context); + arithmetic = (TimestampArithmetic) arithmetic.withChildren(left, right); + // bind function String funcOpName; if (arithmetic.getFuncName() == null) { @@ -152,7 +155,7 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { public Expression visitBitNot(BitNot bitNot, ExpressionRewriteContext context) { Expression child = bitNot.child().accept(this, context); // type coercion - if (child.getDataType().toCatalogDataType().getPrimitiveType().ordinal() > PrimitiveType.LARGEINT.ordinal()) { + if (!(child.getDataType().isIntegralType() || child.getDataType().isBooleanType())) { child = new Cast(child, BigIntType.INSTANCE); } return bitNot.withChildren(child); @@ -162,6 +165,7 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { public Expression visitDivide(Divide divide, ExpressionRewriteContext context) { Expression left = divide.left().accept(this, context); Expression right = divide.right().accept(this, context); + divide = (Divide) divide.withChildren(left, right); // type coercion return TypeCoercionUtils.processDivide(divide, left, right); @@ -171,6 +175,7 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { public Expression visitIntegralDivide(IntegralDivide integralDivide, ExpressionRewriteContext context) { Expression left = integralDivide.left().accept(this, context); Expression right = integralDivide.right().accept(this, context); + integralDivide = (IntegralDivide) integralDivide.withChildren(left, right); // type coercion return TypeCoercionUtils.processIntegralDivide(integralDivide, left, right); @@ -180,6 +185,7 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { public Expression visitBinaryArithmetic(BinaryArithmetic binaryArithmetic, ExpressionRewriteContext context) { Expression left = binaryArithmetic.left().accept(this, context); Expression right = binaryArithmetic.right().accept(this, context); + binaryArithmetic = (BinaryArithmetic) binaryArithmetic.withChildren(left, right); return TypeCoercionUtils.processBinaryArithmetic(binaryArithmetic, left, right); } @@ -207,6 +213,7 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { public Expression visitComparisonPredicate(ComparisonPredicate cp, ExpressionRewriteContext context) { Expression left = cp.left().accept(this, context); Expression right = cp.right().accept(this, context); + cp = (ComparisonPredicate) cp.withChildren(left, right); return TypeCoercionUtils.processComparisonPredicate(cp, left, right); } @@ -219,6 +226,13 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { return TypeCoercionUtils.processCaseWhen(newCaseWhen); } + @Override + public Expression visitWhenClause(WhenClause whenClause, ExpressionRewriteContext context) { + return whenClause.withChildren(TypeCoercionUtils.castIfNotSameType( + whenClause.getOperand().accept(this, context), BooleanType.INSTANCE), + whenClause.getResult().accept(this, context)); + } + @Override public Expression visitInPredicate(InPredicate inPredicate, ExpressionRewriteContext context) { List<Expression> rewrittenChildren = inPredicate.children().stream() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java index 19e720ffeee..9406d782f35 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java @@ -172,10 +172,10 @@ public class TimestampArithmetic extends Expression implements BinaryExpression, public void checkLegalityBeforeTypeCoercion() { children().forEach(c -> { if (c.getDataType().isObjectType()) { - throw new AnalysisException("in predicate could not contains object type: " + this.toSql()); + throw new AnalysisException("timestamp arithmetic could not contains object type: " + this.toSql()); } if (c.getDataType().isComplexType()) { - throw new AnalysisException("in predicate could not contains complex type: " + this.toSql()); + throw new AnalysisException("timestamp arithmetic could not contains complex type: " + this.toSql()); } }); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org