This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.0 by this push:
new 174daa7ebc0 branch-4.0: [fix](parser) isNull should under
primaryExpression #63619 (#64977)
174daa7ebc0 is described below
commit 174daa7ebc0d088fce781fcea3d7dd872f65758e
Author: morrySnow <[email protected]>
AuthorDate: Tue Jun 30 17:06:49 2026 +0800
branch-4.0: [fix](parser) isNull should under primaryExpression #63619
(#64977)
Cherry-pick #63619
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 4 ++--
.../doris/nereids/parser/LogicalPlanBuilder.java | 4 ++--
.../doris/nereids/parser/NereidsParserTest.java | 24 ++++++++++++++++++++++
3 files changed, 28 insertions(+), 4 deletions(-)
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 f81cbf9f7d6..d5e0a3159ea 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
@@ -1604,8 +1604,6 @@ lambdaExpression
booleanExpression
: LOGICALNOT booleanExpression
#logicalNot
| EXISTS LEFT_PAREN query RIGHT_PAREN
#exist
- | (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
| NOT booleanExpression
#logicalNot
| left=booleanExpression operator=(AND | LOGICALAND)
right=booleanExpression #logicalBinary
@@ -1683,6 +1681,8 @@ primaryExpression
| (SUBSTR | SUBSTRING | MID) LEFT_PAREN
expression FROM expression (FOR expression)? RIGHT_PAREN
#substring
| POSITION LEFT_PAREN expression IN expression RIGHT_PAREN
#position
+ | (ISNULL | IS_NULL_PRED) LEFT_PAREN expression RIGHT_PAREN
#isnull
+ | IS_NOT_NULL_PRED LEFT_PAREN expression RIGHT_PAREN
#is_not_null_pred
| functionCallExpression
#functionCall
| value=primaryExpression LEFT_BRACKET index=valueExpression RIGHT_BRACKET
#elementAt
| value=primaryExpression LEFT_BRACKET begin=valueExpression
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 4e54eab537f..640a86f9c56 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
@@ -4873,12 +4873,12 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
@Override
public Expression visitIsnull(IsnullContext context) {
- return ParserUtils.withOrigin(context, () -> new
IsNull(typedVisit(context.valueExpression())));
+ return ParserUtils.withOrigin(context, () -> new
IsNull(typedVisit(context.expression())));
}
@Override
public Expression visitIs_not_null_pred(Is_not_null_predContext context) {
- return ParserUtils.withOrigin(context, () -> new Not(new
IsNull(typedVisit(context.valueExpression()))));
+ return ParserUtils.withOrigin(context, () -> new Not(new
IsNull(typedVisit(context.expression()))));
}
public List<Expression> withInList(PredicateContext ctx) {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
index e2f7f5c267b..30ebd2f9f42 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
@@ -29,7 +29,10 @@ import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.exceptions.SyntaxParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.trees.expressions.Cast;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.IsNull;
+import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.OrderExpression;
import org.apache.doris.nereids.trees.expressions.literal.DecimalLiteral;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLikeLiteral;
@@ -1607,4 +1610,25 @@ public class NereidsParserTest extends ParserTestBase {
plan = nereidsParser.parseSingle(sql);
Assertions.assertInstanceOf(UpdateCommand.class, plan);
}
+
+ @Test
+ public void testIsNullAndIsNotNullExpression() {
+ NereidsParser nereidsParser = new NereidsParser();
+ String sql = "ISNULL(X) = 1";
+ Expression expression = nereidsParser.parseExpression(sql);
+
+ Assertions.assertInstanceOf(EqualTo.class, expression);
+ Assertions.assertInstanceOf(IsNull.class, expression.child(0));
+
+ sql = "IS_NULL_PRED(X) = 1";
+ expression = nereidsParser.parseExpression(sql);
+ Assertions.assertInstanceOf(EqualTo.class, expression);
+ Assertions.assertInstanceOf(IsNull.class, expression.child(0));
+
+ sql = "IS_NOT_NULL_PRED(X) = 1";
+ expression = nereidsParser.parseExpression(sql);
+ Assertions.assertInstanceOf(EqualTo.class, expression);
+ Assertions.assertInstanceOf(Not.class, expression.child(0));
+ Assertions.assertInstanceOf(IsNull.class,
expression.child(0).child(0));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]