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 9637f57af83 Optimize CTE in parser. (#31440)
9637f57af83 is described below

commit 9637f57af8323b4d7f96bc87feb4de691c3a4b5a
Author: Cong Hu <[email protected]>
AuthorDate: Thu May 30 07:48:45 2024 +0800

    Optimize CTE in parser. (#31440)
---
 .../statement/dml/SelectStatementContext.java      |  8 +++----
 .../from/impl/SimpleTableSegmentBinder.java        |  4 ++--
 .../with/CommonTableExpressionSegmentBinder.java   |  2 +-
 .../binder/segment/with/WithSegmentBinder.java     |  4 ++--
 .../expression/impl/SubquerySegmentBinderTest.java |  7 +++---
 .../converter/segment/with/WithConverter.java      |  2 +-
 .../src/main/antlr4/imports/doris/DMLStatement.g4  |  2 +-
 .../visitor/statement/DorisStatementVisitor.java   |  2 +-
 .../src/main/antlr4/imports/mysql/DMLStatement.g4  |  2 +-
 .../mysql/visitor/format/MySQLFormatVisitor.java   |  2 +-
 .../visitor/statement/MySQLStatementVisitor.java   |  4 ++--
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  2 +-
 .../statement/type/OracleDMLStatementVisitor.java  |  4 ++--
 .../main/antlr4/imports/sqlserver/DMLStatement.g4  |  2 +-
 .../statement/SQLServerStatementVisitor.java       |  7 +++---
 .../sql/common/extractor/TableExtractor.java       | 14 ++++++++++--
 .../expr/complex/CommonTableExpressionSegment.java | 26 ++++++++++++++++------
 .../sql/common/statement/dml/SelectStatement.java  | 12 ++++++++++
 .../parser/sql/common/util/ColumnExtractor.java    |  4 ++++
 .../sql/common/util/ExpressionExtractUtils.java    | 10 +++------
 .../sql/common/util/SubqueryExtractUtils.java      | 11 +++++++++
 .../statement/doris/dml/DorisSelectStatement.java  | 12 ----------
 .../statement/mysql/dml/MySQLSelectStatement.java  | 11 ---------
 .../oracle/dml/OracleSelectStatement.java          | 12 ----------
 .../sqlserver/dml/SQLServerSelectStatement.java    | 12 ----------
 .../asserts/segment/with/WithClauseAssert.java     |  2 +-
 26 files changed, 89 insertions(+), 91 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
index 45009ec946c..b8749baea25 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
@@ -197,7 +197,7 @@ public final class SelectStatementContext extends 
CommonSQLStatementContext impl
     
     /**
      * Judge whether contains dollar parameter marker or not.
-     * 
+     *
      * @return whether contains dollar parameter marker or not
      */
     public boolean isContainsDollarParameterMarker() {
@@ -224,7 +224,7 @@ public final class SelectStatementContext extends 
CommonSQLStatementContext impl
     
     /**
      * Judge whether contains partial distinct aggregation.
-     * 
+     *
      * @return whether contains partial distinct aggregation
      */
     public boolean isContainsPartialDistinctAggregation() {
@@ -320,7 +320,7 @@ public final class SelectStatementContext extends 
CommonSQLStatementContext impl
     
     /**
      * Find column projection.
-     * 
+     *
      * @param columnIndex column index
      * @return find column projection
      */
@@ -388,7 +388,7 @@ public final class SelectStatementContext extends 
CommonSQLStatementContext impl
      * @return whether sql statement contains table subquery segment or not
      */
     public boolean containsTableSubquery() {
-        return getSqlStatement().getFrom().isPresent() && 
getSqlStatement().getFrom().get() instanceof SubqueryTableSegment;
+        return getSqlStatement().getFrom().isPresent() && 
getSqlStatement().getFrom().get() instanceof SubqueryTableSegment || 
getSqlStatement().getWithSegment().isPresent();
     }
     
     @Override
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
index 874bd29b83c..b18bfff7794 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
@@ -28,9 +28,9 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
 import 
org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType;
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -83,7 +83,7 @@ public final class SimpleTableSegmentBinder {
         ShardingSpherePreconditions.checkNotNull(originalDatabase.getValue(), 
NoDatabaseSelectedException::new);
         checkTableExists(segment.getTableName().getIdentifier().getValue(), 
statementBinderContext, originalDatabase.getValue(), originalSchema.getValue());
         ShardingSphereSchema schema = 
statementBinderContext.getMetaData().getDatabase(originalDatabase.getValue()).getSchema(originalSchema.getValue());
-        tableBinderContexts.put((segment.getAliasName().orElseGet(() -> 
segment.getTableName().getIdentifier().getValue())).toLowerCase(),
+        tableBinderContexts.putIfAbsent((segment.getAliasName().orElseGet(() 
-> segment.getTableName().getIdentifier().getValue())).toLowerCase(),
                 createSimpleTableBinderContext(segment, schema, 
originalDatabase, originalSchema, statementBinderContext));
         TableNameSegment tableNameSegment = new 
TableNameSegment(segment.getTableName().getStartIndex(), 
segment.getTableName().getStopIndex(), segment.getTableName().getIdentifier());
         tableNameSegment.setTableBoundedInfo(new 
TableSegmentBoundedInfo(originalDatabase, originalSchema));
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/CommonTableExpressionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/CommonTableExpressionSegmentBinder.java
index 080818f21e0..e82f6aedbd2 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/CommonTableExpressionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/CommonTableExpressionSegmentBinder.java
@@ -44,7 +44,7 @@ public final class CommonTableExpressionSegmentBinder {
     public static CommonTableExpressionSegment bind(final 
CommonTableExpressionSegment segment, final SQLStatementBinderContext 
statementBinderContext,
                                                     final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         SubquerySegment boundedSubquerySegment = 
SubquerySegmentBinder.bind(segment.getSubquery(), statementBinderContext, 
tableBinderContexts);
-        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(segment.getStartIndex(), segment.getStopIndex(), 
segment.getIdentifier(), boundedSubquerySegment);
+        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(segment.getStartIndex(), segment.getStopIndex(), 
segment.getAliasSegment(), boundedSubquerySegment);
         // TODO bind with columns
         result.getColumns().addAll(segment.getColumns());
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/WithSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/WithSegmentBinder.java
index d15dbda4312..c2bd9a5c1d2 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/WithSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/with/WithSegmentBinder.java
@@ -50,8 +50,8 @@ public final class WithSegmentBinder {
         for (CommonTableExpressionSegment each : 
segment.getCommonTableExpressions()) {
             CommonTableExpressionSegment boundedCommonTableExpression = 
CommonTableExpressionSegmentBinder.bind(each, statementBinderContext, 
tableBinderContexts);
             boundedCommonTableExpressions.add(boundedCommonTableExpression);
-            externalTableBinderContexts.put(each.getIdentifier().getValue(),
-                    new 
SimpleTableSegmentBinderContext(boundedCommonTableExpression.getSubquery().getSelect().getProjections().getProjections()));
+            each.getAliasName().ifPresent(aliasName -> 
externalTableBinderContexts.put(aliasName,
+                    new 
SimpleTableSegmentBinderContext(boundedCommonTableExpression.getSubquery().getSelect().getProjections().getProjections())));
         }
         return new WithSegment(segment.getStartIndex(), 
segment.getStopIndex(), boundedCommonTableExpressions);
     }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinderTest.java
index e2347e83e59..1bd83aa091a 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinderTest.java
@@ -34,6 +34,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnPr
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -51,12 +52,12 @@ import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 
 class SubquerySegmentBinderTest {
     
@@ -116,7 +117,7 @@ class SubquerySegmentBinderTest {
         oracleSubquerySelectStatement.setFrom(new SimpleTableSegment(new 
TableNameSegment(43, 49, new IdentifierValue("t_order"))));
         ExpressionSegment whereExpressionSegment = new ColumnSegment(57, 62, 
new IdentifierValue("status"));
         oracleSubquerySelectStatement.setWhere(new WhereSegment(51, 73, 
whereExpressionSegment));
-        CommonTableExpressionSegment commonTableExpressionSegment = new 
CommonTableExpressionSegment(0, 1, new IdentifierValue("submit_order"),
+        CommonTableExpressionSegment commonTableExpressionSegment = new 
CommonTableExpressionSegment(0, 1, new AliasSegment(0, 1, new 
IdentifierValue("submit_order")),
                 new SubquerySegment(22, 73, oracleSubquerySelectStatement, 
"SELECT order_id FROM t_order WHERE status = 'SUBMIT'"));
         WithSegment withSegment = new WithSegment(0, 74, 
Collections.singleton(commonTableExpressionSegment));
         OracleSelectStatement oracleSelectStatement = new 
OracleSelectStatement();
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/with/WithConverter.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/with/WithConverter.java
index 138a5a80ce5..f386ab1f613 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/with/WithConverter.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/with/WithConverter.java
@@ -55,7 +55,7 @@ public final class WithConverter {
     private static SqlNodeList convertWithItem(final 
Collection<CommonTableExpressionSegment> commonTableExpressionSegments) {
         SqlNodeList result = new SqlNodeList(SqlParserPos.ZERO);
         for (CommonTableExpressionSegment each : 
commonTableExpressionSegments) {
-            SqlIdentifier name = new 
SqlIdentifier(each.getIdentifier().getValue(), SqlParserPos.ZERO);
+            SqlIdentifier name = new 
SqlIdentifier(each.getAliasName().orElse(""), SqlParserPos.ZERO);
             SqlNodeList columns = each.getColumns().isEmpty() ? null : 
convertColumns(each.getColumns());
             result.add(new SqlWithItem(SqlParserPos.ZERO, name, columns, new 
SelectStatementConverter().convert(each.getSubquery().getSelect())));
         }
diff --git 
a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4 
b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
index 9b577cb1c38..50508d1615f 100644
--- a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
+++ b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
@@ -244,7 +244,7 @@ withClause
     ;
 
 cteClause
-    : identifier (LP_ columnNames RP_)? AS subquery
+    : alias (LP_ columnNames RP_)? AS subquery
     ;
 
 selectSpecification
diff --git 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java
 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java
index faece8c1038..8fb1c8beb2c 100644
--- 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java
+++ 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java
@@ -751,7 +751,7 @@ public abstract class DorisStatementVisitor extends 
DorisStatementBaseVisitor<AS
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCteClause(final CteClauseContext ctx) {
-        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier()),
+        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (AliasSegment) visit(ctx.alias()),
                 new SubquerySegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (DorisSelectStatement) visit(ctx.subquery()), 
getOriginalText(ctx.subquery())));
         if (null != ctx.columnNames()) {
             CollectionValue<ColumnSegment> columns = 
(CollectionValue<ColumnSegment>) visit(ctx.columnNames());
diff --git 
a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 
b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
index fa784500ddd..3eb5388f6ca 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
@@ -244,7 +244,7 @@ withClause
     ;
 
 cteClause
-    : identifier (LP_ columnNames RP_)? AS subquery
+    : alias (LP_ columnNames RP_)? AS subquery
     ;
 
 selectSpecification
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java
index ebdab7c1e3d..152ca860c43 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java
@@ -777,7 +777,7 @@ public final class MySQLFormatVisitor extends 
MySQLStatementBaseVisitor<String>
     
     @Override
     public String visitCteClause(final CteClauseContext ctx) {
-        visit(ctx.identifier());
+        visit(ctx.alias());
         formattedSQL.append(' ');
         if (null != ctx.columnNames()) {
             visit(ctx.columnNames());
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 b582a108149..606e739b61f 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
@@ -215,6 +215,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.Parameter
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParenthesesSegment;
 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.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.FunctionTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.IndexHintSegment;
@@ -232,7 +233,6 @@ 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.common.segment.generic.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;
@@ -751,7 +751,7 @@ public abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCteClause(final CteClauseContext ctx) {
-        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier()),
+        CommonTableExpressionSegment result = new 
CommonTableExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (AliasSegment) visit(ctx.alias()),
                 new SubquerySegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (MySQLSelectStatement) visit(ctx.subquery()), 
getOriginalText(ctx.subquery())));
         if (null != ctx.columnNames()) {
             CollectionValue<ColumnSegment> columns = 
(CollectionValue<ColumnSegment>) visit(ctx.columnNames());
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index e7350108a0e..020502377b9 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -1274,7 +1274,7 @@ rollbackSegment
     ;
 
 queryName
-    : (owner DOT_)? name
+    : alias
     ;
 
 cycleValue
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index 39e6921f305..e07117d1635 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -738,8 +738,8 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
             for (SubqueryFactoringClauseContext each : 
ctx.subqueryFactoringClause()) {
                 SubquerySegment subquery = new 
SubquerySegment(each.selectSubquery().start.getStartIndex(), 
each.selectSubquery().stop.getStopIndex(), (OracleSelectStatement) visit(each),
                         getOriginalText(each));
-                IdentifierValue identifier = (IdentifierValue) 
visit(each.queryName().name().identifier());
-                CommonTableExpressionSegment commonTableExpression = new 
CommonTableExpressionSegment(each.start.getStartIndex(), 
each.stop.getStopIndex(), identifier, subquery);
+                CommonTableExpressionSegment commonTableExpression = new 
CommonTableExpressionSegment(each.start.getStartIndex(), 
each.stop.getStopIndex(),
+                        (AliasSegment) visit(each.queryName().alias()), 
subquery);
                 if (null != each.searchClause()) {
                     ColumnNameContext columnName = 
each.searchClause().orderingColumn().columnName();
                     commonTableExpression.getColumns().add((ColumnSegment) 
visit(columnName));
diff --git 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
index f851f965de8..bde4311f89d 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
+++ 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
@@ -223,7 +223,7 @@ cteClauseSet
     ;
 
 cteClause
-    : identifier columnNames? AS subquery
+    : alias columnNames? AS subquery
     ;
 
 outputClause
diff --git 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index d4c0de15619..475f5ec317d 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++ 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -60,6 +60,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Exe
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.FromClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.FunctionCallContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GraphAggFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GraphFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GroupByClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.HavingClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.HexadecimalLiteralsContext;
@@ -137,8 +139,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Whe
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WindowFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithTableHintContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GraphFunctionContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GraphAggFunctionContext;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
@@ -1009,8 +1009,7 @@ public abstract class SQLServerStatementVisitor extends 
SQLServerStatementBaseVi
         for (CteClauseContext each : ctx.cteClause()) {
             SubquerySegment subquery = new 
SubquerySegment(each.subquery().aggregationClause().start.getStartIndex(),
                     each.subquery().aggregationClause().stop.getStopIndex(), 
(SQLServerSelectStatement) visit(each.subquery()), 
getOriginalText(each.subquery()));
-            IdentifierValue identifier = (IdentifierValue) 
visit(each.identifier());
-            CommonTableExpressionSegment commonTableExpression = new 
CommonTableExpressionSegment(each.start.getStartIndex(), 
each.stop.getStopIndex(), identifier, subquery);
+            CommonTableExpressionSegment commonTableExpression = new 
CommonTableExpressionSegment(each.start.getStartIndex(), 
each.stop.getStopIndex(), (AliasSegment) visit(each.alias()), subquery);
             if (null != each.columnNames()) {
                 ColumnNamesContext columnNames = each.columnNames();
                 CollectionValue<ColumnSegment> columns = 
(CollectionValue<ColumnSegment>) visit(columnNames);
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
index 86b185da4c5..8c081fa1efe 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
@@ -30,6 +30,7 @@ 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.common.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
@@ -42,6 +43,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.Or
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -58,7 +60,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateState
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateTableStatementHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.match.MatchAgainstExpression;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -99,10 +100,19 @@ public final class TableExtractor {
         if (selectStatement.getOrderBy().isPresent()) {
             
extractTablesFromOrderByItems(selectStatement.getOrderBy().get().getOrderByItems());
         }
+        if (selectStatement.getWithSegment().isPresent()) {
+            
extractTablesFromCTEs(selectStatement.getWithSegment().get().getCommonTableExpressions());
+        }
         Optional<LockSegment> lockSegment = 
SelectStatementHandler.getLockSegment(selectStatement);
         lockSegment.ifPresent(this::extractTablesFromLock);
     }
     
+    private void extractTablesFromCTEs(final 
Collection<CommonTableExpressionSegment> commonTableExpressionSegments) {
+        for (CommonTableExpressionSegment each : 
commonTableExpressionSegments) {
+            extractTablesFromSelect(each.getSubquery().getSelect());
+        }
+    }
+    
     private void extractTablesFromTableSegment(final TableSegment 
tableSegment) {
         if (tableSegment instanceof SimpleTableSegment) {
             tableContext.add(tableSegment);
@@ -363,7 +373,7 @@ public final class TableExtractor {
     
     /**
      * Extract table that should be rewritten from create view statement.
-     * 
+     *
      * @param createViewStatement create view statement
      */
     public void extractTablesFromCreateViewStatement(final CreateViewStatement 
createViewStatement) {
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/complex/CommonTableExpressionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/complex/CommonTableExpressionSegment.java
index 2a567152c94..4abff481154 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/complex/CommonTableExpressionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/complex/CommonTableExpressionSegment.java
@@ -17,35 +17,47 @@
 
 package 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Optional;
 
 /**
  * Common table expression segment.
  */
-@RequiredArgsConstructor
+@AllArgsConstructor
 @Getter
-public final class CommonTableExpressionSegment implements ExpressionSegment {
+public final class CommonTableExpressionSegment implements TableSegment {
     
     private final int startIndex;
     
     private final int stopIndex;
     
-    private final IdentifierValue identifier;
+    private AliasSegment aliasSegment;
     
     private final SubquerySegment subquery;
     
     private final Collection<ColumnSegment> columns = new LinkedList<>();
     
     @Override
-    public String getText() {
-        return identifier.getValue();
+    public Optional<String> getAliasName() {
+        return getAlias().map(IdentifierValue::getValue);
+    }
+    
+    @Override
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.of(aliasSegment).map(AliasSegment::getIdentifier);
+    }
+    
+    @Override
+    public void setAlias(final AliasSegment alias) {
+        this.aliasSegment = alias;
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/SelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/SelectStatement.java
index 0e6aba5607a..83632882e85 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/SelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/SelectStatement.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.GroupBy
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.HavingSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
 
@@ -51,6 +52,8 @@ public abstract class SelectStatement extends 
AbstractSQLStatement implements DM
     
     private CombineSegment combine;
     
+    private WithSegment withSegment;
+    
     /**
      * Get from.
      *
@@ -104,4 +107,13 @@ public abstract class SelectStatement extends 
AbstractSQLStatement implements DM
     public Optional<CombineSegment> getCombine() {
         return Optional.ofNullable(combine);
     }
+    
+    /**
+     * Get with segment.
+     *
+     * @return with segment.
+     */
+    public Optional<WithSegment> getWithSegment() {
+        return Optional.ofNullable(withSegment);
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ColumnExtractor.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ColumnExtractor.java
index 95acdbc2504..abb85d7aeb2 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ColumnExtractor.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ColumnExtractor.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenE
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.DatetimeProjectionSegment;
@@ -183,6 +184,9 @@ public final class ColumnExtractor {
         if (tableSegment instanceof SubqueryTableSegment && containsSubQuery) {
             extractFromSelectStatement(columnSegments, ((SubqueryTableSegment) 
tableSegment).getSubquery().getSelect(), true);
         }
+        if (tableSegment instanceof CommonTableExpressionSegment && 
containsSubQuery) {
+            extractFromSelectStatement(columnSegments, 
((CommonTableExpressionSegment) tableSegment).getSubquery().getSelect(), true);
+        }
     }
     
     /**
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
index 151f307438c..99f9ec382cc 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
@@ -32,7 +32,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpr
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.TypeCastExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ValuesExpression;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
@@ -61,7 +60,7 @@ public final class ExpressionExtractUtils {
     
     /**
      * Get and predicate collection.
-     * 
+     *
      * @param expression expression segment
      * @return and predicate collection
      */
@@ -108,7 +107,7 @@ public final class ExpressionExtractUtils {
     
     /**
      * Get parameter marker expression collection.
-     * 
+     *
      * @param expressions expression collection
      * @return parameter marker expression collection
      */
@@ -142,7 +141,7 @@ public final class ExpressionExtractUtils {
     
     /**
      * Extract join conditions.
-     * 
+     *
      * @param joinConditions join conditions
      * @param whereSegments where segments
      */
@@ -190,9 +189,6 @@ public final class ExpressionExtractUtils {
         if (expression instanceof OuterJoinExpression) {
             result.add(((OuterJoinExpression) expression).getColumnName());
         }
-        if (expression instanceof CommonTableExpressionSegment) {
-            result.addAll(((CommonTableExpressionSegment) 
expression).getColumns());
-        }
         if (expression instanceof DatetimeExpression) {
             result.addAll(extractColumns(((DatetimeExpression) 
expression).getLeft(), containsSubQuery));
             result.addAll(extractColumns(((DatetimeExpression) 
expression).getRight(), containsSubQuery));
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/SubqueryExtractUtils.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/SubqueryExtractUtils.java
index aae36cf8a17..aff4f2b40e8 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/SubqueryExtractUtils.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/SubqueryExtractUtils.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Function
 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.common.segment.dml.expr.NotExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
@@ -71,6 +72,16 @@ public final class SubqueryExtractUtils {
         if (selectStatement.getCombine().isPresent()) {
             extractSubquerySegmentsFromCombine(result, 
selectStatement.getCombine().get());
         }
+        if (selectStatement.getWithSegment().isPresent()) {
+            extractSubquerySegmentsFromCTEs(result, 
selectStatement.getWithSegment().get().getCommonTableExpressions());
+        }
+    }
+    
+    private static void extractSubquerySegmentsFromCTEs(final 
List<SubquerySegment> result, final Collection<CommonTableExpressionSegment> 
withSegment) {
+        for (CommonTableExpressionSegment each : withSegment) {
+            result.add(each.getSubquery());
+            extractSubquerySegments(result, each.getSubquery().getSelect());
+        }
     }
     
     private static void extractSubquerySegmentsFromProjections(final 
List<SubquerySegment> result, final ProjectionsSegment projections) {
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/doris/dml/DorisSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/doris/dml/DorisSelectStatement.java
index e70ff93fd07..ed773fb9eb4 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/doris/dml/DorisSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/doris/dml/DorisSelectStatement.java
@@ -21,7 +21,6 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 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.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.doris.DorisStatement;
@@ -42,8 +41,6 @@ public final class DorisSelectStatement extends 
SelectStatement implements Doris
     
     private WindowSegment window;
     
-    private WithSegment withSegment;
-    
     /**
      * Get order by segment.
      *
@@ -79,13 +76,4 @@ public final class DorisSelectStatement extends 
SelectStatement implements Doris
     public Optional<SimpleTableSegment> getTable() {
         return Optional.ofNullable(table);
     }
-    
-    /**
-     * Get with segment.
-     *
-     * @return with segment.
-     */
-    public Optional<WithSegment> getWithSegment() {
-        return Optional.ofNullable(withSegment);
-    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dml/MySQLSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dml/MySQLSelectStatement.java
index f6d35886c5b..9ea85a5b978 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dml/MySQLSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dml/MySQLSelectStatement.java
@@ -21,7 +21,6 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 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.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
@@ -42,8 +41,6 @@ public final class MySQLSelectStatement extends 
SelectStatement implements MySQL
     
     private WindowSegment window;
     
-    private WithSegment withSegment;
-    
     /**
      * Get order by segment.
      *
@@ -80,12 +77,4 @@ public final class MySQLSelectStatement extends 
SelectStatement implements MySQL
         return Optional.ofNullable(table);
     }
     
-    /**
-     * Get with segment.
-     *
-     * @return with segment.
-     */
-    public Optional<WithSegment> getWithSegment() {
-        return Optional.ofNullable(withSegment);
-    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleSelectStatement.java
index bc38c2e4ae9..43956a3e87e 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleSelectStatement.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ModelSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
 
@@ -36,8 +35,6 @@ public final class OracleSelectStatement extends 
SelectStatement implements Orac
     
     private ModelSegment modelSegment;
     
-    private WithSegment withSegment;
-    
     /**
      * Get lock segment.
      *
@@ -55,13 +52,4 @@ public final class OracleSelectStatement extends 
SelectStatement implements Orac
     public Optional<ModelSegment> getModelSegment() {
         return Optional.ofNullable(modelSegment);
     }
-    
-    /**
-     * Get with segment.
-     *
-     * @return with segment.
-     */
-    public Optional<WithSegment> getWithSegment() {
-        return Optional.ofNullable(withSegment);
-    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerSelectStatement.java
index 5e7f16e441d..18f18b96a9e 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerSelectStatement.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.sqlserver.hint.WithTableHintSegment;
@@ -35,8 +34,6 @@ public final class SQLServerSelectStatement extends 
SelectStatement implements S
     
     private LimitSegment limit;
     
-    private WithSegment withSegment;
-    
     private TableSegment intoSegment;
     
     private WithTableHintSegment withTableHintSegment;
@@ -50,15 +47,6 @@ public final class SQLServerSelectStatement extends 
SelectStatement implements S
         return Optional.ofNullable(limit);
     }
     
-    /**
-     * Get with segment.
-     *
-     * @return with segment.
-     */
-    public Optional<WithSegment> getWithSegment() {
-        return Optional.ofNullable(withSegment);
-    }
-    
     /**
      * Get into segment.
      *
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/with/WithClauseAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/with/WithClauseAssert.java
index ae9e26067ce..f6d87fa2d35 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/with/WithClauseAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/with/WithClauseAssert.java
@@ -62,7 +62,7 @@ public final class WithClauseAssert {
         if (!expected.getColumns().isEmpty()) {
             assertThat(assertContext.getText("Common table expression column 
size assertion error: "), actual.getColumns().size(), 
is(expected.getColumns().size()));
         }
-        assertThat(assertContext.getText("Common table expression name 
assertion error: "), actual.getIdentifier().getValue(), is(expected.getName()));
+        assertThat(assertContext.getText("Common table expression name 
assertion error: "), actual.getAliasName().orElse(null), 
is(expected.getName()));
         int count = 0;
         for (ColumnSegment each : actual.getColumns()) {
             ColumnAssert.assertIs(assertContext, each, 
expected.getColumns().get(count));

Reply via email to