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 970959d96ee support parse index hint. (#29314)
970959d96ee is described below

commit 970959d96eeecf0a544993c380830ca2601ab860
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Dec 7 18:44:45 2023 +0800

    support parse index hint. (#29314)
    
    * support parse index hint.
    
    * support parse index hint.
---
 .../visitor/statement/MySQLStatementVisitor.java   |  8 +++--
 .../statement/type/MySQLDMLStatementVisitor.java   | 32 ++++++++++++++++++++
 .../segment/generic/table/IndexHintSegment.java    | 31 ++++++++++++-------
 .../segment/generic/table/SimpleTableSegment.java  |  4 +++
 .../asserts/segment/table/TableAssert.java         | 35 ++++++++++++++++++++--
 ...SimpleTable.java => ExpectedHintIndexName.java} | 17 ++---------
 ...ctedSimpleTable.java => ExpectedIndexHint.java} | 16 +++++-----
 .../segment/impl/table/ExpectedSimpleTable.java    |  5 ++++
 .../parser/src/main/resources/case/dml/select.xml  |  6 +++-
 9 files changed, 116 insertions(+), 38 deletions(-)

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 821b8c117dc..de19a3cb4d0 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,7 +177,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.mysql.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.RowExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.UnaryOperationExpression;
@@ -217,13 +216,14 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseS
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WindowSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.IndexHintSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -233,6 +233,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.Number
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.OtherLiteralValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.StringLiteralValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.parametermarker.ParameterMarkerValue;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.mysql.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
@@ -1852,6 +1853,9 @@ public abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
+            if (null != ctx.indexHintList()) {
+                ctx.indexHintList().indexHint().forEach(each -> 
result.getIndexHintSegments().add((IndexHintSegment) visit(each)));
+            }
             return result;
         }
         return visit(ctx.tableReferences());
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java
index 010d3228a48..189e2b515ea 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java
@@ -23,11 +23,13 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CallCon
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DoStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.HandlerStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ImportStatementContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IndexHintContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LoadDataStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LoadStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LoadXmlStatementContext;
 import 
org.apache.shardingsphere.sql.parser.mysql.visitor.statement.MySQLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.IndexHintSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLCallStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDoStatement;
@@ -37,6 +39,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQ
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLLoadXMLStatement;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -82,4 +86,32 @@ public final class MySQLDMLStatementVisitor extends 
MySQLStatementVisitor implem
     public ASTNode visitLoadXmlStatement(final LoadXmlStatementContext ctx) {
         return new MySQLLoadXMLStatement((SimpleTableSegment) 
visit(ctx.tableName()));
     }
+    
+    @Override
+    public ASTNode visitIndexHint(final IndexHintContext ctx) {
+        Collection<String> indexNames = new LinkedList<>();
+        ctx.indexName().forEach(each -> indexNames.add(each.getText()));
+        String useType;
+        if (null != ctx.USE()) {
+            useType = ctx.USE().getText();
+        } else if (null != ctx.IGNORE()) {
+            useType = ctx.IGNORE().getText();
+        } else {
+            useType = ctx.FORCE().getText();
+        }
+        IndexHintSegment result = new 
IndexHintSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
indexNames, useType,
+                null == ctx.INDEX() ? ctx.KEY().getText() : 
ctx.INDEX().getText(), getOriginalText(ctx));
+        if (null != ctx.FOR()) {
+            String hintScope;
+            if (null != ctx.JOIN()) {
+                hintScope = "JOIN";
+            } else if (null != ctx.ORDER()) {
+                hintScope = "ORDER BY";
+            } else {
+                hintScope = "GROUP BY";
+            }
+            result.setHintScope(hintScope);
+        }
+        return result;
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/IndexHintSegment.java
similarity index 58%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/IndexHintSegment.java
index 6446c6e1a59..053b6a991d0 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/IndexHintSegment.java
@@ -15,25 +15,34 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
+import java.util.Collection;
 
 /**
- * Expected simple table.
+ * Index hint segment.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
+public final class IndexHintSegment implements SQLSegment {
     
-    @XmlAttribute
-    private String alias;
+    private final int startIndex;
     
-    @XmlElement
-    private ExpectedOwner owner;
+    private final int stopIndex;
+    
+    private final Collection<String> indexNames;
+    
+    private final String useType;
+    
+    private final String indexType;
+    
+    @Setter
+    private String hintScope;
+    
+    private final String originText;
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
index fa16925e53e..1d540884b8f 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
@@ -26,6 +26,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegm
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.PivotSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Optional;
 
 /**
@@ -43,6 +45,8 @@ public final class SimpleTableSegment implements 
TableSegment, OwnerAvailable {
     @Setter
     private AliasSegment alias;
     
+    private final Collection<IndexHintSegment> indexHintSegments = new 
LinkedList<>();
+    
     @Setter
     private PivotSegment pivot;
     
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
index 9040d2ee9ee..5a414a5f231 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
@@ -22,13 +22,14 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.xml.XmlTableFunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.CollectionTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.FunctionTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.IndexHintSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.xml.XmlTableFunctionSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
@@ -39,13 +40,16 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.d
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedTableFunction;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedCollectionTable;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedFunctionTable;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedHintIndexName;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedIndexHint;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedJoinTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSubqueryTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedTable;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedFunctionTable;
 
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -124,9 +128,36 @@ public final class TableAssert {
             assertTrue(actual.getOwner().isPresent(), 
assertContext.getText("Actual owner should exist."));
             OwnerAssert.assertIs(assertContext, actual.getOwner().get(), 
expected.getOwner());
         }
+        if (!expected.getIndexHints().isEmpty()) {
+            assertFalse(actual.getIndexHintSegments().isEmpty());
+            assertIs(assertContext, actual.getIndexHintSegments(), 
expected.getIndexHints());
+        }
         SQLSegmentAssert.assertIs(assertContext, actual, expected);
     }
     
+    private static void assertIs(final SQLCaseAssertContext assertContext, 
final Collection<IndexHintSegment> actual, final Collection<ExpectedIndexHint> 
expected) {
+        assertThat(expected.size(), is(actual.size()));
+        Iterator<ExpectedIndexHint> expectedIndexHintIterator = 
expected.iterator();
+        Iterator<IndexHintSegment> actualIndexHintIterator = actual.iterator();
+        while (expectedIndexHintIterator.hasNext()) {
+            ExpectedIndexHint expectedIndexHint = 
expectedIndexHintIterator.next();
+            IndexHintSegment actualIndexHint = actualIndexHintIterator.next();
+            assertIs(assertContext, actualIndexHint, expectedIndexHint);
+        }
+    }
+    
+    private static void assertIs(final SQLCaseAssertContext assertContext, 
final IndexHintSegment actual, final ExpectedIndexHint expected) {
+        assertThat(expected.getHintIndexNames().size(), 
is(actual.getIndexNames().size()));
+        Iterator<ExpectedHintIndexName> expectedIndexNameIterator = 
expected.getHintIndexNames().iterator();
+        Iterator<String> actualIndexNameIterator = 
actual.getIndexNames().iterator();
+        while (expectedIndexNameIterator.hasNext()) {
+            ExpectedHintIndexName expectedIndexName = 
expectedIndexNameIterator.next();
+            String actualIndexName = actualIndexNameIterator.next();
+            assertThat(assertContext.getText("Index hint name assertion error: 
"), actualIndexName, is(expectedIndexName.getName()));
+        }
+        assertThat(assertContext.getText("Index hint origin text assertion 
error: "), actual.getOriginText(), is(expected.getOriginText()));
+    }
+    
     /**
      * Assert subquery expression.
      *
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedHintIndexName.java
similarity index 73%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedHintIndexName.java
index 6446c6e1a59..62d709f2e82 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedHintIndexName.java
@@ -17,23 +17,10 @@
 
 package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
 
-import lombok.Getter;
-import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-
 /**
- * Expected simple table.
+ * Expected hint index name.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
+public final class ExpectedHintIndexName extends 
AbstractExpectedIdentifierSQLSegment {
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedIndexHint.java
similarity index 72%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedIndexHint.java
index 6446c6e1a59..5d2d810226d 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedIndexHint.java
@@ -19,21 +19,23 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 
 import lombok.Getter;
 import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedDelimiterSQLSegment;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
- * Expected simple table.
+ * Expected index hint.
  */
 @Getter
 @Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
+public final class ExpectedIndexHint extends 
AbstractExpectedDelimiterSQLSegment {
     
-    @XmlAttribute
-    private String alias;
+    @XmlElement(name = "hint-index-name")
+    private final Collection<ExpectedHintIndexName> hintIndexNames = new 
LinkedList<>();
     
-    @XmlElement
-    private ExpectedOwner owner;
+    @XmlAttribute(name = "origin-text")
+    private String originText;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
index 6446c6e1a59..7354ce47e0d 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
@@ -23,6 +23,8 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * Expected simple table.
@@ -36,4 +38,7 @@ public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegm
     
     @XmlElement
     private ExpectedOwner owner;
+    
+    @XmlElement(name = "index-hint")
+    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
 }
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml 
b/test/it/parser/src/main/resources/case/dml/select.xml
index 2e4c1d956f7..4068b52514b 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -2521,7 +2521,11 @@
         <from>
             <join-table join-type="INNER">
                 <left>
-                    <simple-table name="t_order" alias="o" start-index="16" 
stop-index="24" />
+                    <simple-table name="t_order" alias="o" start-index="16" 
stop-index="24">
+                        <index-hint origin-text="FORCE INDEX(order_index)" 
start-index="26" stop-index="49">
+                            <hint-index-name name="order_index" 
start-index="38" stop-index="48"/>
+                        </index-hint>
+                    </simple-table>
                 </left>
                 <right>
                     <simple-table name="t_order_item" alias="i" 
start-index="56" stop-index="69" />

Reply via email to