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" />