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

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


The following commit(s) were added to refs/heads/master by this push:
     new bcc77c3416c Add MySQL interval expression sql parsing (#35468)
bcc77c3416c is described below

commit bcc77c3416ca98dd87bf9d4603d425b86f85a0e7
Author: ZhangCheng <[email protected]>
AuthorDate: Tue May 20 13:38:12 2025 +0800

    Add MySQL interval expression sql parsing (#35468)
    
    * Add MySQL interval sql parsing
    
    * Add mysql adddate function
    
    * Add mysql adddate function
---
 RELEASE-NOTES.md                                   |  1 +
 .../operator/common/SQLExtensionOperatorTable.java |  5 ++
 .../segment/expression/ExpressionConverter.java    |  7 +-
 .../impl/IntervalExpressionConverter.java          | 81 ++++++++++++++++++++++
 .../visitor/statement/MySQLStatementVisitor.java   | 10 +--
 .../core/segment/dml/expr/IntervalExpression.java  | 29 +++-----
 .../core/segment/dml/expr/IntervalUnit.java        | 26 +++++++
 .../segment/expression/ExpressionAssert.java       | 18 ++++-
 .../jaxb/segment/impl/expr/ExpectedExpression.java |  3 +
 .../impl/expr/ExpectedIntervalExpression.java      | 25 +++----
 ...a => ExpectedIntervalExpressionProjection.java} |  2 +-
 .../parser/src/main/resources/case/dml/insert.xml  | 14 ++--
 .../parser/src/main/resources/case/dml/replace.xml | 14 ++--
 .../main/resources/case/dml/select-expression.xml  | 26 +++----
 .../resources/case/dml/select-special-function.xml | 28 ++++----
 15 files changed, 198 insertions(+), 91 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index e46eaf2ef7b..2bed1b89ca1 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -38,6 +38,7 @@
 1. SQL Parser: Support Oracle SQL parsing V1 keywords as identifiers - 
[#35373](https://github.com/apache/shardingsphere/pull/35373)
 1. SQL Parser: Support Oracle in literal sql parsing - 
[#35384](https://github.com/apache/shardingsphere/pull/35384)
 1. SQL Bind: Support explain statement sql bind - 
[#35439](https://github.com/apache/shardingsphere/pull/35439)
+1. SQL Parser: Add MySQL interval expression sql parsing - 
[#35468](https://github.com/apache/shardingsphere/pull/35468)
 
 ### Bug Fixes
 
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/operator/common/SQLExtensionOperatorTable.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/operator/common/SQLExtensionOperatorTable.java
index 110f80291c1..bb23f0ccf6a 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/operator/common/SQLExtensionOperatorTable.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/operator/common/SQLExtensionOperatorTable.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.sqlfederation.optimizer.converter.operator.com
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.calcite.sql.SqlBinaryOperator;
+import org.apache.calcite.sql.SqlFunction;
+import org.apache.calcite.sql.SqlFunctionCategory;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlPrefixOperator;
 import org.apache.calcite.sql.type.InferTypes;
@@ -66,4 +68,7 @@ public final class SQLExtensionOperatorTable {
     public static final SqlPrefixOperator NOT = new SqlPrefixOperator("NOT", 
SqlKind.NOT, 26, ReturnTypes.BIGINT, InferTypes.BOOLEAN, OperandTypes.ANY);
     
     public static final MySQLMatchAgainstOperator MATCH_AGAINST = new 
MySQLMatchAgainstOperator();
+    
+    public static final SqlFunction INTERVAL_OPERATOR =
+            new SqlFunction("INTERVAL_OPERATOR", SqlKind.OTHER, 
ReturnTypes.BIGINT_NULLABLE, InferTypes.FIRST_KNOWN, OperandTypes.VARIADIC, 
SqlFunctionCategory.STRING);
 }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/ExpressionConverter.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/ExpressionConverter.java
index 7c3fed4d47b..70a9e59698b 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/ExpressionConverter.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/ExpressionConverter.java
@@ -32,8 +32,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Expr
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExtractArgExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.RowExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.TypeCastExpression;
@@ -44,6 +44,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simp
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.BetweenExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.BinaryOperationExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.CaseWhenExpressionConverter;
@@ -53,6 +54,7 @@ import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expre
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ExtractArgExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.FunctionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.InExpressionConverter;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.IntervalExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ListExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.LiteralExpressionConverter;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.MatchExpressionConverter;
@@ -152,6 +154,9 @@ public final class ExpressionConverter {
         if (segment instanceof UnaryOperationExpression) {
             return 
UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment);
         }
+        if (segment instanceof IntervalExpression) {
+            return IntervalExpressionConverter.convert((IntervalExpression) 
segment);
+        }
         throw new UnsupportedSQLOperationException("unsupported TableSegment 
type: " + segment.getClass());
     }
 }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/IntervalExpressionConverter.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/IntervalExpressionConverter.java
new file mode 100644
index 00000000000..6e822d9a2a2
--- /dev/null
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/IntervalExpressionConverter.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.calcite.avatica.util.TimeUnit;
+import org.apache.calcite.sql.SqlBasicCall;
+import org.apache.calcite.sql.SqlIntervalQualifier;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.parser.SqlParserPos;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.operator.common.SQLExtensionOperatorTable;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.ExpressionConverter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Interval expression converter.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class IntervalExpressionConverter {
+    
+    /**
+     * Convert unary operation expression to sql node.
+     *
+     * @param segment unary operation expression
+     * @return sql node
+     */
+    public static Optional<SqlNode> convert(final IntervalExpression segment) {
+        TimeUnit timeUnit = getTimeUnit(segment.getIntervalUnit());
+        List<SqlNode> sqlNodes = new ArrayList<>();
+        
ExpressionConverter.convert(segment.getValue()).ifPresent(sqlNodes::add);
+        sqlNodes.add(new SqlIntervalQualifier(timeUnit, timeUnit, 
SqlParserPos.ZERO));
+        SqlBasicCall result = new 
SqlBasicCall(SQLExtensionOperatorTable.INTERVAL_OPERATOR, sqlNodes, 
SqlParserPos.ZERO);
+        return Optional.of(result);
+    }
+    
+    private static TimeUnit getTimeUnit(final IntervalUnit unit) {
+        switch (unit) {
+            case MICROSECOND:
+                return TimeUnit.MICROSECOND;
+            case SECOND:
+                return TimeUnit.SECOND;
+            case MINUTE:
+                return TimeUnit.MINUTE;
+            case HOUR:
+                return TimeUnit.HOUR;
+            case DAY:
+                return TimeUnit.DAY;
+            case WEEK:
+                return TimeUnit.WEEK;
+            case MONTH:
+                return TimeUnit.MONTH;
+            case QUARTER:
+                return TimeUnit.QUARTER;
+            case YEAR:
+                return TimeUnit.YEAR;
+            default:
+                throw new UnsupportedOperationException("Unsupported interval 
unit");
+        }
+    }
+}
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 69e716c37ea..02c40955540 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -177,6 +177,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Exis
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.RowExpression;
@@ -869,11 +871,9 @@ public abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
     
     @Override
     public final ASTNode visitIntervalExpression(final 
IntervalExpressionContext ctx) {
-        FunctionSegment result = new 
FunctionSegment(ctx.INTERVAL().getSymbol().getStartIndex(), 
ctx.INTERVAL().getSymbol().getStopIndex(), ctx.INTERVAL().getText(), 
ctx.INTERVAL().getText());
-        result.getParameters().add((ExpressionSegment) 
visit(ctx.intervalValue().expr()));
-        result.getParameters().add(new 
LiteralExpressionSegment(ctx.intervalValue().intervalUnit().getStart().getStartIndex(),
 ctx.intervalValue().intervalUnit().getStop().getStopIndex(),
-                ctx.intervalValue().intervalUnit().getText()));
-        return result;
+        IntervalUnit intervalUnit = 
IntervalUnit.valueOf(ctx.intervalValue().intervalUnit().getText().toUpperCase());
+        return new 
IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(), 
ctx.INTERVAL().getSymbol().getStopIndex(), (ExpressionSegment) 
visit(ctx.intervalValue().expr()), intervalUnit,
+                getOriginalText(ctx));
     }
     
     @Override
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalExpression.java
similarity index 50%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalExpression.java
index 22543b3d5ab..13208c95cf7 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalExpression.java
@@ -15,34 +15,25 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr;
+package org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr;
 
 import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-
-import javax.xml.bind.annotation.XmlElement;
+import lombok.RequiredArgsConstructor;
 
 /**
- * Expected match expression.
+ * Interval expression.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public class ExpectedIntervalExpression extends AbstractExpectedSQLSegment 
implements ExpectedExpressionSegment {
-    
-    @XmlElement
-    private ExpectedExpression left;
+public final class IntervalExpression implements ExpressionSegment {
     
-    @XmlElement
-    private ExpectedExpression right;
+    private final int startIndex;
     
-    @XmlElement
-    private ExpectedExpression operator;
+    private final int stopIndex;
     
-    @XmlElement(name = "interval-day-to-second-expr")
-    private ExpectedIntervalDayToSecondExpression dayToSecondExpression;
+    private final ExpressionSegment value;
     
-    @XmlElement(name = "interval-year-to-month-expr")
-    private ExpectedIntervalYearToMonthExpression yearToMonthExpression;
+    private final IntervalUnit intervalUnit;
     
+    private final String text;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalUnit.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalUnit.java
new file mode 100644
index 00000000000..b4adb99579e
--- /dev/null
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/expr/IntervalUnit.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr;
+
+/**
+ * Interval unit.
+ */
+public enum IntervalUnit {
+    YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MICROSECOND, 
YEAR_MONTH, DAY_HOUR, DAY_MINUTE, DAY_SECOND, DAY_MICROSECOND, HOUR_MINUTE, 
HOUR_SECOND, MINUTE_SECOND, SECOND_MICROSECOND,
+    MINUTE_MICROSECOND, HOUR_MICROSECOND
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
index e9424e8e3cf..65e605d6776 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Expr
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExtractArgExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.KeyValueSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
@@ -73,6 +74,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedInExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedIntervalDayToSecondExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedIntervalExpression;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedIntervalExpressionProjection;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedIntervalYearToMonthExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedKeyValueSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedListExpression;
@@ -444,6 +446,16 @@ public final class ExpressionAssert {
         }
     }
     
+    private static void assertIntervalExpression(final SQLCaseAssertContext 
assertContext, final IntervalExpression actual, final 
ExpectedIntervalExpression expected) {
+        if (null == expected) {
+            assertNull(actual, assertContext.getText("Actual interval 
expression should not exist."));
+        } else {
+            assertNotNull(actual, assertContext.getText("Actual interval 
expression should exist"));
+            assertExpression(assertContext, actual.getValue(), 
expected.getValue());
+            assertThat(assertContext.getText("Actual interval unit is 
different with expected interval unit."), actual.getIntervalUnit(), 
is(expected.getIntervalUnit()));
+        }
+    }
+    
     /**
      * Assert expression by actual expression segment class type.
      *
@@ -451,7 +463,7 @@ public final class ExpressionAssert {
      * @param actual actual interval expression
      * @param expected expected interval expression
      */
-    private static void assertIntervalExpression(final SQLCaseAssertContext 
assertContext, final IntervalExpressionProjection actual, final 
ExpectedIntervalExpression expected) {
+    private static void assertIntervalExpression(final SQLCaseAssertContext 
assertContext, final IntervalExpressionProjection actual, final 
ExpectedIntervalExpressionProjection expected) {
         if (null == expected) {
             assertNull(actual, assertContext.getText("Actual interval 
expression should not exist."));
         } else {
@@ -682,7 +694,7 @@ public final class ExpressionAssert {
         } else if (actual instanceof OuterJoinExpression) {
             OuterJoinExpressionAssert.assertIs(assertContext, 
(OuterJoinExpression) actual, expected.getOuterJoinExpression());
         } else if (actual instanceof IntervalExpressionProjection) {
-            assertIntervalExpression(assertContext, 
(IntervalExpressionProjection) actual, expected.getIntervalExpression());
+            assertIntervalExpression(assertContext, 
(IntervalExpressionProjection) actual, 
expected.getIntervalExpressionProjection());
         } else if (actual instanceof MultisetExpression) {
             assertMultisetExpression(assertContext, (MultisetExpression) 
actual, expected.getMultisetExpression());
         } else if (actual instanceof RowExpression) {
@@ -695,6 +707,8 @@ public final class ExpressionAssert {
             assertKeyValueSegment(assertContext, (KeyValueSegment) actual, 
expected.getKeyValueSegment());
         } else if (actual instanceof JsonNullClauseSegment) {
             assertJsonNullClauseSegment(assertContext, (JsonNullClauseSegment) 
actual, expected.getJsonNullClauseSegment());
+        } else if (actual instanceof IntervalExpression) {
+            assertIntervalExpression(assertContext, (IntervalExpression) 
actual, expected.getIntervalExpression());
         } else {
             throw new UnsupportedOperationException(String.format("Unsupported 
expression: %s", actual.getClass().getName()));
         }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
index d6dc7cc2846..50e62624462 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
@@ -110,6 +110,9 @@ public final class ExpectedExpression extends 
AbstractExpectedSQLSegment {
     @XmlElement(name = "outer-join-expression")
     private ExpectedOuterJoinExpression outerJoinExpression;
     
+    @XmlElement(name = "interval-expression-projection")
+    private ExpectedIntervalExpressionProjection intervalExpressionProjection;
+    
     @XmlElement(name = "interval-expression")
     private ExpectedIntervalExpression intervalExpression;
     
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
index 22543b3d5ab..a4f61160f87 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
@@ -19,30 +19,23 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 
 import lombok.Getter;
 import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
 
 /**
- * Expected match expression.
+ * Expected expression.
  */
 @Getter
 @Setter
-public class ExpectedIntervalExpression extends AbstractExpectedSQLSegment 
implements ExpectedExpressionSegment {
+@XmlRootElement
+public final class ExpectedIntervalExpression extends 
AbstractExpectedSQLSegment {
     
-    @XmlElement
-    private ExpectedExpression left;
-    
-    @XmlElement
-    private ExpectedExpression right;
-    
-    @XmlElement
-    private ExpectedExpression operator;
-    
-    @XmlElement(name = "interval-day-to-second-expr")
-    private ExpectedIntervalDayToSecondExpression dayToSecondExpression;
-    
-    @XmlElement(name = "interval-year-to-month-expr")
-    private ExpectedIntervalYearToMonthExpression yearToMonthExpression;
+    @XmlElement(name = "value")
+    private ExpectedExpression value;
     
+    @XmlElement(name = "interval-unit")
+    private IntervalUnit intervalUnit;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpressionProjection.java
similarity index 92%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpressionProjection.java
index 22543b3d5ab..8763663d50a 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpression.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedIntervalExpressionProjection.java
@@ -28,7 +28,7 @@ import javax.xml.bind.annotation.XmlElement;
  */
 @Getter
 @Setter
-public class ExpectedIntervalExpression extends AbstractExpectedSQLSegment 
implements ExpectedExpressionSegment {
+public class ExpectedIntervalExpressionProjection extends 
AbstractExpectedSQLSegment implements ExpectedExpressionSegment {
     
     @XmlElement
     private ExpectedExpression left;
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml 
b/test/it/parser/src/main/resources/case/dml/insert.xml
index c4b61d368ee..0264019ae6a 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -1626,15 +1626,13 @@
                             <function function-name="now" text="now()" 
start-index="70" stop-index="74" />
                         </parameter>
                         <parameter>
-                            <function function-name="interval" text="interval" 
start-index="76" stop-index="83" >
-                                <parameter>
+                            <interval-expression value="interval" 
text="interval" start-index="77" stop-index="84" >
+                                <value start-index="85" stop-index="85">
                                     <parameter-marker-expression 
parameter-index="0" start-index="85" stop-index="85" />
-                                    <literal-expression value="1" 
start-index="85" stop-index="85" />
-                                </parameter>
-                                <parameter>
-                                    <literal-expression value="second" 
start-index="87" stop-index="92" />
-                                </parameter>
-                            </function>
+                                    <literal-expression value="1" 
start-index="85" stop-index="85"/>
+                                </value>
+                                <interval-unit>SECOND</interval-unit>
+                            </interval-expression>
                         </parameter>
                     </function>
                 </assignment-value>
diff --git a/test/it/parser/src/main/resources/case/dml/replace.xml 
b/test/it/parser/src/main/resources/case/dml/replace.xml
index d9c57d84e27..8b3e843540e 100644
--- a/test/it/parser/src/main/resources/case/dml/replace.xml
+++ b/test/it/parser/src/main/resources/case/dml/replace.xml
@@ -836,15 +836,13 @@
                             <function function-name="now" text="now()" 
start-index="71" stop-index="75" />
                         </parameter>
                         <parameter>
-                            <function function-name="interval" text="interval" 
start-index="77" stop-index="84" >
-                                <parameter>
+                            <interval-expression value="interval" 
text="interval" start-index="77" stop-index="84" >
+                                <value start-index="86" stop-index="86">
                                     <parameter-marker-expression 
parameter-index="0" start-index="86" stop-index="86" />
-                                    <literal-expression value="1" 
start-index="86" stop-index="86" />
-                                </parameter>
-                                <parameter>
-                                    <literal-expression value="second" 
start-index="88" stop-index="93" />
-                                </parameter>
-                            </function>
+                                    <literal-expression value="1" 
start-index="86" stop-index="86"/>
+                                </value>
+                                <interval-unit>SECOND</interval-unit>
+                            </interval-expression>
                         </parameter>
                     </function>
                 </assignment-value>
diff --git a/test/it/parser/src/main/resources/case/dml/select-expression.xml 
b/test/it/parser/src/main/resources/case/dml/select-expression.xml
index f9fb6c9d9d9..68983998341 100644
--- a/test/it/parser/src/main/resources/case/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-expression.xml
@@ -1604,14 +1604,12 @@
                     </left>
                     <operator>+</operator>
                     <right>
-                        <function function-name="INTERVAL" text="INTERVAL" 
start-index="47" stop-index="54" >
-                            <parameter>
+                        <interval-expression value="interval" start-index="47" 
stop-index="54" >
+                            <value>
                                 <literal-expression value="1" start-index="56" 
stop-index="56" />
-                            </parameter>
-                            <parameter>
-                                <literal-expression value="SECOND" 
start-index="58" stop-index="63" />
-                            </parameter>
-                        </function>
+                            </value>
+                            <interval-unit>SECOND</interval-unit>
+                        </interval-expression>
                     </right>
                 </binary-operation-expression>
             </expr>
@@ -1635,14 +1633,12 @@
                     </left>
                     <operator>-</operator>
                     <right>
-                        <function function-name="INTERVAL" text="INTERVAL" 
start-index="47" stop-index="54" >
-                            <parameter>
-                                <literal-expression value="1" start-index="56" 
stop-index="56" />
-                            </parameter>
-                            <parameter>
-                                <literal-expression value="SECOND" 
start-index="58" stop-index="63" />
-                            </parameter>
-                        </function>
+                        <interval-expression value="interval" start-index="47" 
stop-index="54" >
+                            <value start-index="56" stop-index="56">
+                                <literal-expression value="1" start-index="56" 
stop-index="56"/>
+                            </value>
+                            <interval-unit>SECOND</interval-unit>
+                        </interval-expression>
                     </right>
                 </binary-operation-expression>
             </expr>
diff --git 
a/test/it/parser/src/main/resources/case/dml/select-special-function.xml 
b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index 0e68d5d897a..26cf7b5a667 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -2447,15 +2447,13 @@
                             <literal-expression value="2018-05-01" 
start-index="16" stop-index="27" />
                         </parameter>
                         <parameter>
-                            <function function-name="INTERVAL" text="INTERVAL" 
start-index="29" stop-index="36" >
-                                <parameter>
+                            <interval-expression value="interval" 
text="interval" start-index="29" stop-index="36" >
+                                <value start-index="38" stop-index="38">
                                     <parameter-marker-expression 
parameter-index="0" start-index="38" stop-index="38" />
-                                    <literal-expression value="1" 
start-index="38" stop-index="38" />
-                                </parameter>
-                                <parameter>
-                                    <literal-expression value="DAY" 
start-index="40" stop-index="42" />
-                                </parameter>
-                            </function>
+                                    <literal-expression value="1" 
start-index="38" stop-index="38"/>
+                                </value>
+                                <interval-unit>DAY</interval-unit>
+                            </interval-expression>
                         </parameter>
                     </function>
                 </expr>
@@ -2489,15 +2487,13 @@
                             <literal-expression value="2018-05-01" 
start-index="16" stop-index="27" />
                         </parameter>
                         <parameter>
-                            <function function-name="INTERVAL" text="INTERVAL" 
start-index="29" stop-index="36" >
-                                <parameter>
+                            <interval-expression value="interval" 
text="interval" start-index="29" stop-index="36" >
+                                <value start-index="38" stop-index="38">
                                     <parameter-marker-expression 
parameter-index="0" start-index="38" stop-index="38" />
-                                    <literal-expression value="1" 
start-index="38" stop-index="38" />
-                                </parameter>
-                                <parameter>
-                                    <literal-expression value="DAY" 
start-index="40" stop-index="42" />
-                                </parameter>
-                            </function>
+                                    <literal-expression value="1" 
start-index="38" stop-index="38"/>
+                                </value>
+                                <interval-unit>DAY</interval-unit>
+                            </interval-expression>
                         </parameter>
                     </function>
                 </expr>


Reply via email to