diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java index 2852c1c4415d81..a9d07433c3acea 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java @@ -182,7 +182,7 @@ private static Expression replace( private static void collectConst(Expression expr, Map constMap, Map tExprMap, IdGenerator idGenerator) { - if (expr.isConstant() && !shouldSkipFold(expr)) { + if (expr.isConstant() && !expr.isLiteral() && !expr.anyMatch(e -> shouldSkipFold((Expression) e))) { String id = idGenerator.getNextId().toString(); constMap.put(id, expr); Expr staleExpr; @@ -208,11 +208,6 @@ private static void collectConst(Expression expr, Map constM // Some expressions should not do constant folding private static boolean shouldSkipFold(Expression expr) { - // Skip literal expr - if (expr.isLiteral()) { - return true; - } - // Frontend can not represent those types if (expr.getDataType().isAggStateType() || expr.getDataType().isObjectType() || expr.getDataType().isVariantType() || expr.getDataType().isTimeLikeType() diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java index cdea9eea5d3162..ccfbce80589832 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java @@ -23,9 +23,12 @@ import org.apache.doris.analysis.IntLiteral; import org.apache.doris.catalog.Function.NullableMode; import org.apache.doris.catalog.Type; -import org.apache.doris.common.AnalysisException; +import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.trees.expressions.BitNot; +import org.apache.doris.nereids.trees.expressions.MatchAny; import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral; +import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; +import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -33,7 +36,7 @@ public class ExpressionTranslatorTest { @Test - public void testUnaryArithmetic() throws AnalysisException { + public void testUnaryArithmetic() throws Exception { BitNot bitNot = new BitNot(new IntegerLiteral(1)); ExpressionTranslator translator = ExpressionTranslator.INSTANCE; Expr actual = translator.visitUnaryArithmetic(bitNot, null); @@ -41,4 +44,11 @@ public void testUnaryArithmetic() throws AnalysisException { new IntLiteral(1, Type.INT), null, Type.INT, NullableMode.DEPEND_ON_ARGUMENT); Assertions.assertEquals(actual, expected); } + + @Test + public void testMatch() { + MatchAny matchAny = new MatchAny(new VarcharLiteral("collections"), new NullLiteral()); + ExpressionTranslator translator = ExpressionTranslator.INSTANCE; + Assertions.assertThrows(AnalysisException.class, () -> translator.visitMatch(matchAny, null)); + } }