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 7a7a0c8e3cb Support engine parse for mysql (#26332)
7a7a0c8e3cb is described below

commit 7a7a0c8e3cb7964531ee05aa487ab99d3538019c
Author: niu niu <[email protected]>
AuthorDate: Thu Jul 13 15:23:43 2023 +0800

    Support engine parse for mysql (#26332)
    
    * Support mysql engine parse (#25535)
    
    * Add sql test (#25535)
    
    * Support string engine parse (#25535)
    
    * Change code (#25535)
    
    * Fix engine parse
    
    * Format code
    
    * Change engine parse
    
    * Add engine lexical definition
    
    * Change mysql engine parse
    
    * Support create option comment parse
    
    * Format code
    
    * Fix test case
    
    * Format code
    
    * Format code
---
 .../src/main/antlr4/imports/mysql/BaseRule.g4      | 11 +++++
 .../src/main/antlr4/imports/mysql/DDLStatement.g4  |  6 +--
 .../mysql/src/main/antlr4/imports/mysql/Keyword.g4 | 52 ++++++++++++++++++--
 .../visitor/statement/MySQLStatementVisitor.java   |  7 +++
 .../statement/type/MySQLDDLStatementVisitor.java   | 21 ++++++++
 .../segment/ddl/engine/EngineSegment.java}         | 27 +++-------
 .../ddl/table/CreateTableOptionSegment.java}       | 39 ++++++++++-----
 .../handler/ddl/CreateTableStatementHandler.java   | 14 ++++++
 .../mysql/ddl/MySQLCreateTableStatement.java       | 12 +++++
 .../CreateTableOptionDefinitionAssert.java         | 57 ++++++++++++++++++++++
 .../ddl/impl/CreateTableStatementAssert.java       | 13 +++++
 .../ExpectedCreateTableOptionDefinition.java       | 37 ++++++++++++++
 .../segment/impl/engine/ExpectedEngineClause.java  | 28 +++++++++++
 .../ddl/CreateTableStatementTestCase.java          |  4 ++
 .../src/main/resources/case/ddl/create-table.xml   | 42 ++++++++++++++++
 .../resources/sql/supported/ddl/create-table.xml   |  3 ++
 16 files changed, 333 insertions(+), 40 deletions(-)

diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4 
b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index c5d113cdcc2..7d8773f9d2d 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -44,7 +44,18 @@ customKeyword
     | COPY
     | UL_BINARY
     | AUTOCOMMIT
+    | ARCHIVE
+    | BLACKHOLE
+    | CSV
+    | FEDERATED
     | INNODB
+    | MEMORY
+    | MRG_MYISAM
+    | MYISAM
+    | NDB
+    | NDBCLUSTER
+    | PERFORMANCE_SCHEMA
+    | TOKUDB
     | REDO_LOG
     | LAST_VALUE
     | PRIMARY
diff --git 
a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4 
b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
index 7dd0fb895c8..06264b80739 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
@@ -353,7 +353,7 @@ createTablespaceInnodb
       ADD DATAFILE string_
       (FILE_BLOCK_SIZE EQ_ fileSizeLiteral)?
       (ENCRYPTION EQ_ y_or_n=string_)?
-      (ENGINE EQ_? identifier)?
+      (ENGINE EQ_? engineRef)?
       (COMMENT EQ_? string_)?
     ;
 
@@ -368,7 +368,7 @@ createTablespaceNdb
       (NODEGROUP EQ_? identifier)?
       WAIT?
       (COMMENT EQ_? string_)?
-      (ENGINE EQ_? identifier)?
+      (ENGINE EQ_? engineRef)?
     ;
 
 alterTablespace
@@ -459,7 +459,7 @@ columnAttribute
     | value = SRID NUMBER_
     | constraintClause? checkConstraint
     | constraintEnforcement
-    | visibility 
+    | visibility
     ;
 
 checkConstraint
diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4 
b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
index 63445ac28a4..882e72c3fe0 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
@@ -108,10 +108,6 @@ AUTOCOMMIT
     : A U T O C O M M I T
     ;
 
-INNODB
-    : 'INNODB'
-    ;
-
 REDO_LOG
     : 'REDO_LOG'
     ;
@@ -119,3 +115,51 @@ REDO_LOG
 DELIMITER
     : D E L I M I T E R
     ;
+
+ARCHIVE
+    : A R C H I V E
+    ;
+
+BLACKHOLE
+    : B L A C K H O L E
+    ;
+
+CSV
+    : C S V
+    ;
+
+FEDERATED
+    : F E D E R A T E D
+    ;
+
+INNODB
+    : I N N O D B
+    ;
+
+MEMORY
+    : M E M O R Y
+    ;
+
+MRG_MYISAM
+    : M R G UL_ M Y I S A M
+    ;
+
+MYISAM
+    : M Y I S A M
+    ;
+
+NDB
+    : N D B
+    ;
+
+NDBCLUSTER
+    : N D B C L U S T E R
+    ;
+
+PERFORMANCE_SCHEMA
+    : P E R F O R M A N C E UL_ S C H E M A
+    ;
+
+TOKUDB
+    : T O K U D B
+    ;
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 86e4f97f680..7a1f7d7fcad 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
@@ -55,6 +55,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.Duplica
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.EscapedTableReferenceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExtractFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.EngineRefContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldLengthContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FromClauseContext;
@@ -153,6 +154,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.enums.ParameterMarkerType;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.engine.EngineSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
@@ -1921,6 +1923,11 @@ public abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
         return segment;
     }
     
+    @Override
+    public ASTNode visitEngineRef(final EngineRefContext ctx) {
+        return new EngineSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), 
SQLUtils.getExactlyValue(ctx.textOrIdentifier().getText()));
+    }
+    
     /**
      * Get original text.
      *
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index a4571d3b99c..364ac7cdf3d 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -61,6 +61,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateP
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateServerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTablespaceContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTriggerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateViewContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DeallocateContext;
@@ -122,6 +124,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.Co
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.engine.EngineSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.DropIndexDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
@@ -131,11 +134,13 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.Routi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.ValidStatementSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.AlgorithmTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.ConvertTableDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.CreateTableOptionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.LockTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.tablespace.TablespaceSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.SimpleExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -260,6 +265,22 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
         if (null != ctx.createLikeClause()) {
             result.setLikeTable((SimpleTableSegment) 
visit(ctx.createLikeClause()));
         }
+        if (null != ctx.createTableOptions()) {
+            result.setCreateTableOptionSegment((CreateTableOptionSegment) 
visit(ctx.createTableOptions()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitCreateTableOptions(final CreateTableOptionsContext 
ctx) {
+        CreateTableOptionSegment result = new 
CreateTableOptionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex());
+        for (CreateTableOptionContext each : ctx.createTableOption()) {
+            if (null != each.engineRef()) {
+                result.setEngine((EngineSegment) visit(each.engineRef()));
+            } else if (null != each.COMMENT()) {
+                result.setCommentSegment(new 
CommentSegment(each.string_().getText(), 
each.string_().getStart().getStartIndex(), 
each.string_().getStop().getStopIndex()));
+            }
+        }
         return result;
     }
     
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/engine/EngineSegment.java
similarity index 53%
copy from 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/engine/EngineSegment.java
index 0281b9c7bdc..930a8cd6a31 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/engine/EngineSegment.java
@@ -15,35 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.engine;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
-
-import java.util.Optional;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
 /**
- * MySQL create table statement.
+ * Engine segment.
  */
 @RequiredArgsConstructor
 @Getter
-@Setter
-public final class MySQLCreateTableStatement extends CreateTableStatement 
implements MySQLStatement {
+public final class EngineSegment implements SQLSegment {
     
-    private final boolean ifNotExists;
+    private final int startIndex;
     
-    private SimpleTableSegment likeTable;
+    private final int stopIndex;
     
-    /**
-     * Get like table.
-     *
-     * @return like table
-     */
-    public Optional<SimpleTableSegment> getLikeTable() {
-        return Optional.ofNullable(likeTable);
-    }
+    private final String engine;
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/CreateTableOptionSegment.java
similarity index 55%
copy from 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/CreateTableOptionSegment.java
index 0281b9c7bdc..7f3983642c8 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/CreateTableOptionSegment.java
@@ -15,35 +15,48 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.CreateDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.engine.EngineSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSegment;
 
 import java.util.Optional;
 
 /**
- * MySQL create table statement.
+ * Create table option segment.
  */
-@RequiredArgsConstructor
 @Getter
 @Setter
-public final class MySQLCreateTableStatement extends CreateTableStatement 
implements MySQLStatement {
+@RequiredArgsConstructor
+public final class CreateTableOptionSegment implements CreateDefinitionSegment 
{
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private EngineSegment engine;
     
-    private final boolean ifNotExists;
+    private CommentSegment commentSegment;
     
-    private SimpleTableSegment likeTable;
+    /**
+     * Get engine.
+     *
+     * @return engine
+     */
+    public Optional<EngineSegment> getEngine() {
+        return Optional.ofNullable(engine);
+    }
     
     /**
-     * Get like table.
+     * Get comment.
      *
-     * @return like table
+     * @return comment
      */
-    public Optional<SimpleTableSegment> getLikeTable() {
-        return Optional.ofNullable(likeTable);
+    public Optional<CommentSegment> getComment() {
+        return Optional.ofNullable(commentSegment);
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
index a2f86e29137..b1b8ae3dd53 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.CreateTableOptionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
@@ -100,4 +101,17 @@ public final class CreateTableStatementHandler implements 
SQLStatementHandler {
         }
         return Optional.empty();
     }
+    
+    /**
+     * Get create table option.
+     *
+     * @param createTableStatement create table statement
+     * @return create table option
+     */
+    public static Optional<CreateTableOptionSegment> 
getCreateTableOption(final CreateTableStatement createTableStatement) {
+        if (createTableStatement instanceof MySQLCreateTableStatement) {
+            return ((MySQLCreateTableStatement) 
createTableStatement).getCreateTableOptionSegment();
+        }
+        return Optional.empty();
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
index 0281b9c7bdc..832ee05ad12 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.CreateTableOptionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
@@ -38,6 +39,8 @@ public final class MySQLCreateTableStatement extends 
CreateTableStatement implem
     
     private SimpleTableSegment likeTable;
     
+    private CreateTableOptionSegment createTableOptionSegment;
+    
     /**
      * Get like table.
      *
@@ -46,4 +49,13 @@ public final class MySQLCreateTableStatement extends 
CreateTableStatement implem
     public Optional<SimpleTableSegment> getLikeTable() {
         return Optional.ofNullable(likeTable);
     }
+    
+    /**
+     * Get create table option segment.
+     *
+     * @return create table option segment
+     */
+    public Optional<CreateTableOptionSegment> getCreateTableOptionSegment() {
+        return Optional.ofNullable(createTableOptionSegment);
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
new file mode 100644
index 00000000000..eff207d8baa
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
@@ -0,0 +1,57 @@
+/*
+ * 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.test.it.sql.parser.internal.asserts.segment.definition;
+
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.CreateTableOptionSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedCreateTableOptionDefinition;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Create table option assert.
+ */
+public final class CreateTableOptionDefinitionAssert {
+    
+    /**
+     * Assert actual create table option segment is correct with expected 
create table option.
+     *
+     * @param assertContext assert context
+     * @param actual actual create table option segment
+     * @param expected expected create table option
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final CreateTableOptionSegment actual, final 
ExpectedCreateTableOptionDefinition expected) {
+        if (null == expected.getEngine()) {
+            assertFalse(actual.getEngine().isPresent(), 
assertContext.getText("Actual engine should not exist."));
+        } else {
+            assertTrue(actual.getEngine().isPresent(), 
assertContext.getText("Actual engine should exist."));
+            assertThat(assertContext.getText(String.format("`%s`'s engine 
assertion error: ", actual.getClass().getSimpleName())), 
actual.getEngine().get().getEngine(),
+                    is(expected.getEngine().getName()));
+        }
+        if (null == expected.getComment()) {
+            assertFalse(actual.getComment().isPresent(), 
assertContext.getText("Actual comment should not exist."));
+        } else {
+            assertTrue(actual.getComment().isPresent(), 
assertContext.getText("Actual comment should exist."));
+            assertThat(assertContext.getText(String.format("`%s`'s comment 
assertion error: ", actual.getClass().getSimpleName())), 
actual.getComment().get().getText(),
+                    is(expected.getComment().getText()));
+        }
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
index 872d73726f3..3c98ac57767 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.CreateTableOptionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
@@ -30,6 +31,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAsse
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnDefinitionAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ConstraintDefinitionAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.CreateTableOptionDefinitionAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.SelectStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateTableStatementTestCase;
@@ -62,6 +64,7 @@ public final class CreateTableStatementAssert {
         assertCreateTableAsSelectStatement(assertContext, actual, expected);
         assertCreateTableAsSelectStatementColumns(assertContext, actual, 
expected);
         assertLikeTableStatement(assertContext, actual, expected);
+        assertCreateTableOptionStatement(assertContext, actual, expected);
     }
     
     private static void assertTable(final SQLCaseAssertContext assertContext, 
final CreateTableStatement actual, final CreateTableStatementTestCase expected) 
{
@@ -115,4 +118,14 @@ public final class CreateTableStatementAssert {
             TableAssert.assertIs(assertContext, likeTableSegment.get(), 
expected.getLikeTable());
         }
     }
+    
+    private static void assertCreateTableOptionStatement(final 
SQLCaseAssertContext assertContext, final CreateTableStatement actual, final 
CreateTableStatementTestCase expected) {
+        Optional<CreateTableOptionSegment> createTableOption = 
CreateTableStatementHandler.getCreateTableOption(actual);
+        if (null == expected.getCreateTableOption()) {
+            assertFalse(createTableOption.isPresent(), 
assertContext.getText("Actual create table option should not exist."));
+        } else {
+            assertTrue(createTableOption.isPresent(), 
assertContext.getText("Actual create table option should exist."));
+            CreateTableOptionDefinitionAssert.assertIs(assertContext, 
createTableOption.get(), expected.getCreateTableOption());
+        }
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
new file mode 100644
index 00000000000..11d4943ed6d
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition;
+
+import lombok.Getter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.comments.ExpectedComment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.engine.ExpectedEngineClause;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected create table option definition.
+ */
+@Getter
+public final class ExpectedCreateTableOptionDefinition {
+    
+    @XmlElement(name = "engine")
+    private ExpectedEngineClause engine;
+    
+    @XmlElement(name = "comment")
+    private ExpectedComment comment;
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/engine/ExpectedEngineClause.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/engine/ExpectedEngineClause.java
new file mode 100644
index 00000000000..429920081d3
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/engine/ExpectedEngineClause.java
@@ -0,0 +1,28 @@
+/*
+ * 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.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.engine;
+
+import lombok.Getter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+
+/**
+ * Expected engine clause.
+ */
+@Getter
+public final class ExpectedEngineClause extends 
AbstractExpectedIdentifierSQLSegment {
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
index 61ee3733503..36f14992763 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 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.definition.ExpectedColumnDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedCreateTableOptionDefinition;
 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.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.SelectStatementTestCase;
@@ -54,4 +55,7 @@ public final class CreateTableStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "like-table")
     private ExpectedSimpleTable likeTable;
+    
+    @XmlElement(name = "create-table-option")
+    private ExpectedCreateTableOptionDefinition createTableOption;
 }
diff --git a/test/it/parser/src/main/resources/case/ddl/create-table.xml 
b/test/it/parser/src/main/resources/case/ddl/create-table.xml
index e2f5fca87fd..1286e7109a4 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-table.xml
@@ -17,6 +17,33 @@
   -->
 
 <sql-parser-test-cases>
+    <create-table sql-case-id="create_table_with_backtick_engine_with_string">
+        <table name="t`1" start-delimiter="`" end-delimiter="`" 
start-index="13" stop-index="18" />
+        <column-definition type="int" start-index="20" stop-index="24">
+            <column name="a" />
+        </column-definition>
+        <create-table-option start-index="27" stop-index="41">
+            <engine name="Innodb" start-index="34" stop-index="41" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="create_table_with_backtick_engine_innodb">
+        <table name="t`1" start-delimiter="`" end-delimiter="`" 
start-index="13" stop-index="18" />
+        <column-definition type="int" start-index="20" stop-index="24">
+            <column name="a" />
+        </column-definition>
+        <create-table-option start-index="27" stop-index="39">
+            <engine name="INNODB" start-index="34" stop-index="39" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="create_table_with_backtick_engine_myisam">
+        <table name="t`1" start-delimiter="`" end-delimiter="`" 
start-index="13" stop-index="18" />
+        <column-definition type="int" start-index="20" stop-index="24">
+            <column name="a" />
+        </column-definition>
+        <create-table-option start-index="27" stop-index="39">
+            <engine name="myisam" start-index="34" stop-index="39" />
+        </create-table-option>
+    </create-table>
     <create-table sql-case-id="create_table_with_backtick">
         <table name="`t_order" start-delimiter="`" end-delimiter="`" 
start-index="13" stop-index="23" />
         <column-definition type="int" start-index="26" stop-index="30">
@@ -51,6 +78,9 @@
         <column-definition type="varchar" start-index="39" stop-index="56">
             <column name="status" />
         </column-definition>
+        <create-table-option start-index="59" stop-index="95">
+            <engine name="InnoDB" start-index="66" stop-index="71" />
+        </create-table-option>
     </create-table>
     
     <create-table sql-case-id="create_table_with_keyword">
@@ -282,6 +312,9 @@
         <column-definition type="VARCHAR" start-index="123" stop-index="143">
             <column name="column3" start-delimiter="`" end-delimiter="`" />
         </column-definition>
+        <create-table-option start-index="146" stop-index="158">
+            <engine name="INNODB" start-index="153" stop-index="158" />
+        </create-table-option>
     </create-table>
     
     <create-table sql-case-id="create_temporary_table">
@@ -824,6 +857,9 @@
         <column-definition type="VARCHAR" start-index="111" stop-index="129">
             <column name="column3" />
         </column-definition>
+        <create-table-option start-index="132" stop-index="148">
+            <comment text="'t_order'" start-index="140" stop-index="148" />
+        </create-table-option>
     </create-table>
     
     <create-table sql-case-id="create_table_with_partition">
@@ -1806,6 +1842,9 @@
         <column-definition type="VARCHAR" start-index="49" stop-index="74">
             <column name="status" />
         </column-definition>
+        <create-table-option start-index="77" stop-index="89">
+            <engine name="INNODB" start-index="84" stop-index="89" />
+        </create-table-option>
     </create-table>
 
     <create-table sql-case-id="create_table_with_invisible">
@@ -1819,6 +1858,9 @@
         <column-definition type="VARCHAR" start-index="49" stop-index="76">
             <column name="status" />
         </column-definition>
+        <create-table-option start-index="79" stop-index="91">
+            <engine name="INNODB" start-index="86" stop-index="91" />
+        </create-table-option>
     </create-table>
     
     <create-table sql-case-id="create_table_with_varchar2_char_and_byte_type">
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
index ca5eb9a787d..6336d1f70c4 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
@@ -17,6 +17,9 @@
   -->
 
 <sql-cases>
+    <sql-case id="create_table_with_backtick_engine_with_string" value="create 
table `t``1`(a int) engine='Innodb'" db-types="MySQL" />
+    <sql-case id="create_table_with_backtick_engine_innodb" value="create 
table `t``1`(a int) engine=INNODB" db-types="MySQL" />
+    <sql-case id="create_table_with_backtick_engine_myisam" value="create 
table `t``1`(a int) engine=myisam" db-types="MySQL" />
     <sql-case id="create_table_with_backtick" value="CREATE TABLE ```t_order` 
(i int)" db-types="MySQL" />
     <sql-case id="create_table_column_with_backtick" value="create table 
`````t_o``r``d``e``r``` (```i` int)" db-types="MySQL" />
     <sql-case id="create_table_with_like" value="CREATE TABLE t_log LIKE 
t_old_log" db-types="MySQL" />


Reply via email to