diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 index 5f2628e656..d16bf96b30 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 @@ -217,6 +217,8 @@ INTERVAL: 'INTERVAL'; INTO: 'INTO'; IS: 'IS'; ISNULL: 'ISNULL'; +IS_NULL_PRED: 'IS_NULL_PRED'; +IS_NOT_NULL_PRED: 'IS_NOT_NULL_PRED'; ITEMS: 'ITEMS'; JOIN: 'JOIN'; KEYS: 'KEYS'; diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 8e36202897..9672e651dd 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -241,7 +241,8 @@ expression booleanExpression : NOT booleanExpression #logicalNot | EXISTS LEFT_PAREN query RIGHT_PAREN #exist - | ISNULL LEFT_PAREN valueExpression RIGHT_PAREN #isnull + | (ISNULL | IS_NULL_PRED) LEFT_PAREN valueExpression RIGHT_PAREN #isnull + | IS_NOT_NULL_PRED LEFT_PAREN valueExpression RIGHT_PAREN #is_not_null_pred | valueExpression predicate? #predicated | left=booleanExpression operator=AND right=booleanExpression #logicalBinary | left=booleanExpression operator=OR right=booleanExpression #logicalBinary @@ -478,6 +479,8 @@ ansiNonReserved | LAZY | LIKE | ILIKE + | IS_NOT_NULL_PRED + | IS_NULL_PRED | LIMIT | OFFSET | LINES diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 7194fccabf..65e1773fe4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -47,6 +47,7 @@ import org.apache.doris.nereids.DorisParser.IdentifierListContext; import org.apache.doris.nereids.DorisParser.IdentifierSeqContext; import org.apache.doris.nereids.DorisParser.IntegerLiteralContext; import org.apache.doris.nereids.DorisParser.IntervalContext; +import org.apache.doris.nereids.DorisParser.Is_not_null_predContext; import org.apache.doris.nereids.DorisParser.IsnullContext; import org.apache.doris.nereids.DorisParser.JoinCriteriaContext; import org.apache.doris.nereids.DorisParser.JoinRelationContext; @@ -1357,6 +1358,11 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { return ParserUtils.withOrigin(context, () -> new IsNull(typedVisit(context.valueExpression()))); } + @Override + public Expression visitIs_not_null_pred(Is_not_null_predContext context) { + return ParserUtils.withOrigin(context, () -> new Not(new IsNull(typedVisit(context.valueExpression())))); + } + public List withInList(PredicateContext ctx) { return ctx.expression().stream().map(this::getExpression).collect(ImmutableList.toImmutableList()); }