Repository: apache/incubator-shardingsphere
Pull request #4630 (2020-03-06 08:07:33)

create table segment interface
Ref #4582

coveralls: ## Pull Request Test Coverage Report for [Build 2005](https://coveralls.io/builds/29172956)

* **9** of **249**   **(3.61%)**  changed or added relevant lines in **43** files are covered.
* **4** unchanged lines in **4** files lost coverage.
* Overall coverage increased (+**0.06%**) to **59.151%**

---

|  Changes Missing Coverage | Covered Lines | Changed/Added Lines | % |
| :-----|--------------|--------|---: |
| [sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/OrderByTokenGenerator.java](https://coveralls.io/builds/29172956/source?filename=sharding-core%2Fsharding-core-rewrite%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsharding%2Frewrite%2Ftoken%2Fgenerator%2Fimpl%2FOrderByTokenGenerator.java#L70) | 0 | 1 | 0.0%
| [sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java](https://coveralls.io/builds/29172956/source?filename=sharding-jdbc%2Fsharding-jdbc-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fshardingjdbc%2Fexecutor%2FAbstractStatementExecutor.java#L204) | 0 | 1 | 0.0%
| [sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/impl/ShardingSchema.java](https://coveralls.io/builds/29172956/source?filename=sharding-proxy%2Fsharding-proxy-backend%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fshardingproxy%2Fbackend%2Fschema%2Fimpl%2FShardingSchema.java#L152) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/column/ColumnDefinitionSegment.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fsegment%2Fddl%2Fcolumn%2FColumnDefinitionSegment.java#L46) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/GrantStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fdcl%2FGrantStatement.java#L32) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/RevokeStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fdcl%2FRevokeStatement.java#L32) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropTableStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fddl%2FDropTableStatement.java#L32) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/TruncateStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fddl%2FTruncateStatement.java#L32) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/DeleteStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fdml%2FDeleteStatement.java#L36) | 0 | 1 | 0.0%
| [shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/UpdateStatement.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-engine%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fsql%2Fstatement%2Fdml%2FUpdateStatement.java#L37) | 0 | 1 | 0.0%
<!-- | **Total:** | **9** | **249** | **3.61%** | -->

|  Files with Coverage Reduction | New Missed Lines | % |
| :-----|--------------|--: |
| [shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-mysql%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fvisitor%2Fimpl%2FMySQLDMLVisitor.java#L280) | 1 | 0% |
| [shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDMLVisitor.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-oracle%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fvisitor%2Fimpl%2FOracleDMLVisitor.java#L212) | 1 | 0% |
| [shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDMLVisitor.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-postgresql%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fvisitor%2Fimpl%2FPostgreSQLDMLVisitor.java#L218) | 1 | 0% |
| [shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDMLVisitor.java](https://coveralls.io/builds/29172956/source?filename=shardingsphere-sql-parser%2Fshardingsphere-sql-parser-sqlserver%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fshardingsphere%2Fsql%2Fparser%2Fvisitor%2Fimpl%2FSQLServerDMLVisitor.java#L207) | 1 | 0% |
<!-- | **Total:** | **4** |  | -->

|  Totals | [![Coverage Status](https://coveralls.io/builds/29172956/badge)](https://coveralls.io/builds/29172956) |
| :-- | --: |
| Change from base [Build 1003](https://coveralls.io/builds/29172032): |  0.06% |
| Covered Lines: | 12130 |
| Relevant Lines: | 20507 |

---
##### 💛  - [Coveralls](https://coveralls.io)


Patch:
diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/OrderByTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/OrderByTokenGenerator.java
index cc7162dea4f..a0bf5065f67 100644
--- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/OrderByTokenGenerator.java
+++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/OrderByTokenGenerator.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.core.constant.QuoteCharacter;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ExpressionOrderByItemSegment;
 import org.apache.shardingsphere.sharding.rewrite.token.generator.IgnoreForSingleRoute;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.underlying.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
 import org.apache.shardingsphere.sharding.rewrite.token.pojo.impl.OrderByToken;
@@ -67,7 +67,7 @@ public final class OrderByTokenGenerator implements OptionalSQLTokenGenerator<Se
         if (selectStatement.getWhere().isPresent()) {
             return selectStatement.getWhere().get().getStopIndex() + 1;
         } else {
-            return selectStatement.getTables().stream().mapToInt(TableSegment::getStopIndex).max().getAsInt() + 1;
+            return selectStatement.getTables().stream().mapToInt(SimpleTableSegment::getStopIndex).max().getAsInt() + 1;
         }
     }
 }
diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/TableTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/TableTokenGenerator.java
index dec4fe6a2c0..a794e527f7c 100644
--- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/TableTokenGenerator.java
+++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/TableTokenGenerator.java
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.core.rule.aware.ShardingRuleAware;
 import org.apache.shardingsphere.sharding.rewrite.token.pojo.impl.TableToken;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 import org.apache.shardingsphere.sql.parser.relation.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.underlying.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
 
 import java.util.Collection;
@@ -50,7 +50,7 @@ public final class TableTokenGenerator implements CollectionSQLTokenGenerator, S
     
     private Collection<TableToken> generateSQLTokens(final TableAvailable sqlStatementContext) {
         Collection<TableToken> result = new LinkedList<>();
-        for (TableSegment each : sqlStatementContext.getAllTables()) {
+        for (SimpleTableSegment each : sqlStatementContext.getAllTables()) {
             if (shardingRule.findTableRule(each.getTableName().getIdentifier().getValue()).isPresent()) {
                 result.add(new TableToken(each.getStartIndex(), each.getStopIndex(), each.getTableName().getIdentifier()));
             }
diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
index 0478f7d1582..47bdfb874b9 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
@@ -38,7 +38,7 @@ import org.apache.shardingsphere.sql.parser.relation.statement.ddl.CreateTableSt
 import org.apache.shardingsphere.sql.parser.relation.statement.ddl.DropIndexStatementContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.ddl.DropTableStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
@@ -201,7 +201,7 @@ public abstract class AbstractStatementExecutor {
     }
     
     private void refreshTableMetaData(final ShardingRuntimeContext runtimeContext, final DropTableStatement dropTableStatement) {
-        for (TableSegment each : dropTableStatement.getTables()) {
+        for (SimpleTableSegment each : dropTableStatement.getTables()) {
             runtimeContext.getMetaData().getTables().remove(each.getTableName().getIdentifier().getValue());
         }
     }
diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/impl/ShardingSchema.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/impl/ShardingSchema.java
index 2e487f2af88..2f18e181638 100644
--- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/impl/ShardingSchema.java
+++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/impl/ShardingSchema.java
@@ -43,7 +43,7 @@ import org.apache.shardingsphere.sql.parser.relation.statement.ddl.CreateTableSt
 import org.apache.shardingsphere.sql.parser.relation.statement.ddl.DropIndexStatementContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.ddl.DropTableStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
@@ -149,7 +149,7 @@ public final class ShardingSchema extends LogicSchema {
     }
     
     private void refreshTableMetaData(final DropTableStatement dropTableStatement) {
-        for (TableSegment each : dropTableStatement.getTables()) {
+        for (SimpleTableSegment each : dropTableStatement.getTables()) {
             getMetaData().getTables().remove(each.getTableName().getIdentifier().getValue());
         }
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/predicate/PredicateExtractor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/predicate/PredicateExtractor.java
index 70be11286e0..fd73559c057 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/predicate/PredicateExtractor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/predicate/PredicateExtractor.java
@@ -22,7 +22,7 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -33,7 +33,7 @@ import java.util.LinkedList;
 @RequiredArgsConstructor
 public final class PredicateExtractor {
     
-    private final Collection<TableSegment> tables;
+    private final Collection<SimpleTableSegment> tables;
     
     private final PredicateSegment predicate;
     
@@ -42,17 +42,17 @@ public final class PredicateExtractor {
      * 
      * @return table segments
      */
-    public Collection<TableSegment> extractTables() {
-        Collection<TableSegment> result = new LinkedList<>();
+    public Collection<SimpleTableSegment> extractTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         if (isToGenerateTableTokenLeftValue()) {
             Preconditions.checkState(predicate.getColumn().getOwner().isPresent());
             OwnerSegment segment = predicate.getColumn().getOwner().get();
-            result.add(new TableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
+            result.add(new SimpleTableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
         }
         if (isToGenerateTableTokenForRightValue()) {
             Preconditions.checkState(((ColumnSegment) predicate.getRightValue()).getOwner().isPresent());
             OwnerSegment segment = ((ColumnSegment) predicate.getRightValue()).getOwner().get();
-            result.add(new TableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
+            result.add(new SimpleTableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
         }
         return result;
     }
@@ -67,7 +67,7 @@ public final class PredicateExtractor {
     }
     
     private boolean isTable(final OwnerSegment owner) {
-        for (TableSegment each : tables) {
+        for (SimpleTableSegment each : tables) {
             if (owner.getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/column/ColumnDefinitionSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/column/ColumnDefinitionSegment.java
index c86f714243a..ad44b20277b 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/column/ColumnDefinitionSegment.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/column/ColumnDefinitionSegment.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.segment.ddl.column;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.util.SQLUtil;
 
 import java.util.Collection;
@@ -43,7 +43,7 @@ public final class ColumnDefinitionSegment implements CreateDefinitionSegment {
     
     private boolean primaryKey;
     
-    private final Collection<TableSegment> referencedTables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> referencedTables = new LinkedList<>();
     
     public ColumnDefinitionSegment(final int startIndex, final int stopIndex, final String columnName, final String dataType, final boolean primaryKey) {
         this.startIndex = startIndex;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/constraint/ConstraintDefinitionSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/constraint/ConstraintDefinitionSegment.java
index 85408e30bbb..a3f391ce6e7 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/constraint/ConstraintDefinitionSegment.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/ddl/constraint/ConstraintDefinitionSegment.java
@@ -23,7 +23,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.AlterDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -43,14 +43,14 @@ public final class ConstraintDefinitionSegment implements CreateDefinitionSegmen
     
     private final Collection<ColumnSegment> primaryKeyColumns = new LinkedList<>();
     
-    private TableSegment referencedTable;
+    private SimpleTableSegment referencedTable;
     
     /**
      * Get referenced table.
      * 
      * @return referenced table
      */
-    public Optional<TableSegment> getReferencedTable() {
+    public Optional<SimpleTableSegment> getReferencedTable() {
         return Optional.ofNullable(referencedTable);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SimpleTableSegment.java
similarity index 78%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegment.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SimpleTableSegment.java
index 735a2d1afe3..9c843a83903 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegment.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SimpleTableSegment.java
@@ -15,23 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.segment.generic.table;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.ToString;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasAvailable;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerAvailable;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
 /**
- * Table segment.
+ * Simple table segment.
  */
 @RequiredArgsConstructor
 @Getter
 @ToString
-public final class TableSegment implements OwnerAvailable, AliasAvailable {
+public final class SimpleTableSegment implements TableSegment, OwnerAvailable, AliasAvailable {
     
     private final TableNameSegment tableName;
     
@@ -41,7 +45,7 @@ public final class TableSegment implements OwnerAvailable, AliasAvailable {
     @Setter
     private AliasSegment alias;
     
-    public TableSegment(final int startIndex, final int stopIndex, final IdentifierValue identifierValue) {
+    public SimpleTableSegment(final int startIndex, final int stopIndex, final IdentifierValue identifierValue) {
         tableName = new TableNameSegment(startIndex, stopIndex, identifierValue);
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SubqueryTableSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SubqueryTableSegment.java
new file mode 100644
index 00000000000..67b30d86606
--- /dev/null
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/SubqueryTableSegment.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.segment.generic.table;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubquerySegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasAvailable;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
+
+import java.util.Optional;
+
+/**
+ * Subquery table segment.
+ */
+@RequiredArgsConstructor
+@Getter
+@ToString
+public final class SubqueryTableSegment implements TableSegment, AliasAvailable {
+    
+    private final SubquerySegment subquery;
+    
+    @Setter
+    private AliasSegment alias;
+    
+    @Override
+    public Optional<String> getAlias() {
+        return null == alias ? Optional.empty() : Optional.ofNullable(alias.getIdentifier().getValue());
+    }
+    
+    @Override
+    public int getStartIndex() {
+        return subquery.getStartIndex();
+    }
+    
+    @Override
+    public int getStopIndex() {
+        return subquery.getStopIndex();
+        // TODO
+        // return null == alias ? alias.getStopIndex() : column.getStopIndex();
+    }
+}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableNameSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableNameSegment.java
similarity index 99%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableNameSegment.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableNameSegment.java
index 7d56c793b7a..ce5043f1636 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableNameSegment.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableNameSegment.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.segment.generic.table;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableSegment.java
new file mode 100644
index 00000000000..8d85f39ef87
--- /dev/null
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/table/TableSegment.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.segment.generic.table;
+
+import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
+
+/**
+ * Table segment.
+ */
+public interface TableSegment extends SQLSegment {
+}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/DescribeStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/DescribeStatement.java
index d787469e79c..e7dc3124d5f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/DescribeStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/DescribeStatement.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 
 /**
@@ -29,5 +29,5 @@ import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 @Setter
 public final class DescribeStatement extends DALStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowColumnsStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowColumnsStatement.java
index ae10cd733d8..654af6224b0 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowColumnsStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowColumnsStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 
 import java.util.Optional;
@@ -32,7 +32,7 @@ import java.util.Optional;
 @Setter
 public final class ShowColumnsStatement extends DALStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
     
     private RemoveAvailable fromSchema;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowCreateTableStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowCreateTableStatement.java
index 3a14f59ae95..2d5f441e654 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowCreateTableStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowCreateTableStatement.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 
 /**
@@ -29,5 +29,5 @@ import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 @Setter
 public final class ShowCreateTableStatement extends DALStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowIndexStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowIndexStatement.java
index c87afdcabd3..6de38710a73 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowIndexStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dal/dialect/mysql/ShowIndexStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.SchemaSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 
 import java.util.Optional;
@@ -32,7 +32,7 @@ import java.util.Optional;
 @Setter
 public final class ShowIndexStatement extends DALStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
     
     private SchemaSegment schema;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/DenyUserStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/DenyUserStatement.java
index 604ff39ded5..107b9d6aa2f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/DenyUserStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/DenyUserStatement.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dcl;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 /**
  * Deny user statement.
@@ -28,5 +28,5 @@ import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
 @Setter
 public final class DenyUserStatement extends DCLStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/GrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/GrantStatement.java
index 96b10f274cb..2d14957468e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/GrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/GrantStatement.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.statement.dcl;
 
 import lombok.Getter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,5 +29,5 @@ import java.util.LinkedList;
 @Getter
 public final class GrantStatement extends DCLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/RevokeStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/RevokeStatement.java
index ba4927bbe42..5ade108dc8e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/RevokeStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dcl/RevokeStatement.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.statement.dcl;
 
 import lombok.Getter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,5 +29,5 @@ import java.util.LinkedList;
 @Getter
 public final class RevokeStatement extends DCLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterIndexStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterIndexStatement.java
index 68d0f653f80..f697d86bac6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterIndexStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterIndexStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 /**
  * Alter index statement.
@@ -31,5 +31,5 @@ public final class AlterIndexStatement extends DDLStatement {
     
     private IndexSegment index;
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterTableStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterTableStatement.java
index 48523cb75e7..afd1904fc70 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterTableStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/AlterTableStatement.java
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.AddColu
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -35,7 +35,7 @@ import java.util.LinkedList;
 @Getter
 public final class AlterTableStatement extends DDLStatement {
     
-    private final TableSegment table;
+    private final SimpleTableSegment table;
     
     private final Collection<AddColumnDefinitionSegment> addColumnDefinitions = new LinkedList<>();
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateIndexStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateIndexStatement.java
index 1e9c34ab749..dfa13390c1d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateIndexStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateIndexStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 /**
  * Create index statement.
@@ -31,5 +31,5 @@ public final class CreateIndexStatement extends DDLStatement {
     
     private IndexSegment index;
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateTableStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateTableStatement.java
index 2cfba729b37..2cb61278a70 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateTableStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/CreateTableStatement.java
@@ -22,7 +22,7 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -34,7 +34,7 @@ import java.util.LinkedList;
 @Getter
 public final class CreateTableStatement extends DDLStatement {
     
-    private final TableSegment table;
+    private final SimpleTableSegment table;
     
     private final Collection<ColumnDefinitionSegment> columnDefinitions = new LinkedList<>();
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropIndexStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropIndexStatement.java
index c6d159731cc..5943ee1595a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropIndexStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropIndexStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -34,5 +34,5 @@ public final class DropIndexStatement extends DDLStatement {
     
     private final Collection<IndexSegment> indexes = new LinkedList<>();
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropTableStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropTableStatement.java
index 61238b7aba7..f6096394709 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropTableStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/DropTableStatement.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
 
 import lombok.Getter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,5 +29,5 @@ import java.util.LinkedList;
 @Getter
 public final class DropTableStatement extends DDLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/InsertStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/InsertStatement.java
index e052293330e..6b8441b1439 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/InsertStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/InsertStatement.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumnsSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.OnDuplicateKeyColumnsSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -42,7 +42,7 @@ import java.util.Optional;
 @Setter
 public final class InsertStatement extends DMLStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
     
     private InsertColumnsSegment insertColumns;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/ReplaceStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/ReplaceStatement.java
index ef781993d1c..087de1a200d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/ReplaceStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/ReplaceStatement.java
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.assignment.SetAssign
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumnsSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -41,7 +41,7 @@ import java.util.Optional;
 @Setter
 public final class ReplaceStatement extends DMLStatement {
     
-    private TableSegment table;
+    private SimpleTableSegment table;
     
     private InsertColumnsSegment replaceColumns;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
index 9ae8370e414..c1501374097 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.OrderBySegment
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.LimitSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.LockSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -38,7 +38,7 @@ import java.util.Optional;
 @Setter
 public final class SelectStatement extends DMLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
     
     private ProjectionsSegment projections;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/dal/FromTableSegment.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/dal/FromTableSegment.java
index 2e3d89aa0ce..5e726145bd1 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/dal/FromTableSegment.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/sql/segment/dal/FromTableSegment.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.segment.dal;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 /**
  * From table segment.
@@ -33,5 +33,5 @@ public final class FromTableSegment implements SQLSegment {
     
     private int stopIndex;
     
-    private TableSegment table;
+    private SimpleTableSegment table;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/MySQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/MySQLVisitor.java
index 178d267f6fc..010b382d8c6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/MySQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/MySQLVisitor.java
@@ -93,8 +93,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
@@ -205,7 +205,7 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
     
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
-        TableSegment result = new TableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
             result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
@@ -230,9 +230,9 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
     
     @Override
     public final ASTNode visitTableNames(final TableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDALVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDALVisitor.java
index 617a490c6f6..baa6e17c393 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDALVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDALVisitor.java
@@ -59,7 +59,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dal.FromTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dal.ShowLikeSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dal.VariableSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.SchemaSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.SetStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.AnalyzeTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.CacheIndexStatement;
@@ -209,7 +209,7 @@ public final class MySQLDALVisitor extends MySQLVisitor implements DALVisitor {
     @Override
     public ASTNode visitDesc(final DescContext ctx) {
         DescribeStatement result = new DescribeStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
@@ -265,14 +265,14 @@ public final class MySQLDALVisitor extends MySQLVisitor implements DALVisitor {
     @Override
     public ASTNode visitShowCreateTable(final ShowCreateTableContext ctx) {
         ShowCreateTableStatement result = new ShowCreateTableStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
     @Override
     public ASTNode visitFromTable(final FromTableContext ctx) {
         FromTableSegment result = new FromTableSegment();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDCLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDCLVisitor.java
index 2a439bd895f..22a5042298a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDCLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDCLVisitor.java
@@ -32,7 +32,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetPass
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetRoleContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableNameContext;
 import org.apache.shardingsphere.sql.parser.sql.ASTNode;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterUserStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.CreateRoleStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.CreateUserStatement;
@@ -56,7 +56,7 @@ public final class MySQLDCLVisitor extends MySQLVisitor implements DCLVisitor {
     @Override
     public ASTNode visitGrant(final GrantContext ctx) {
         GrantStatement result = new GrantStatement();
-        Optional<TableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
+        Optional<SimpleTableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
         tableSegmentOptional.ifPresent(tableSegment -> result.getTables().add(tableSegment));
         return result;
     }
@@ -64,16 +64,16 @@ public final class MySQLDCLVisitor extends MySQLVisitor implements DCLVisitor {
     @Override
     public ASTNode visitRevoke(final RevokeContext ctx) {
         RevokeStatement result = new RevokeStatement();
-        Optional<TableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
+        Optional<SimpleTableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
         tableSegmentOptional.ifPresent(tableSegment -> result.getTables().add(tableSegment));
         return result;
     }
     
-    private Optional<TableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
+    private Optional<SimpleTableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
         if (null != ctx.onObjectClause()) {
             TableNameContext tableName = ctx.onObjectClause().privilegeLevel().tableName();
             if (null != tableName) {
-                return Optional.of((TableSegment) visitTableName(tableName));
+                return Optional.of((SimpleTableSegment) visitTableName(tableName));
             }
         }
         return Optional.empty();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDDLVisitor.java
index 06d117e3190..d9ef693b462 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDDLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDDLVisitor.java
@@ -64,7 +64,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.Colu
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.DropPrimaryKeySegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateDatabaseStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
@@ -117,7 +117,7 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new CreateTableStatement((TableSegment) visit(ctx.tableName()));
+        CreateTableStatement result = new CreateTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
@@ -156,7 +156,7 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitAlterTable(final AlterTableContext ctx) {
-        AlterTableStatement result = new AlterTableStatement((TableSegment) visit(ctx.tableName()));
+        AlterTableStatement result = new AlterTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.alterDefinitionClause()) {
             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
                 if (each instanceof AddColumnDefinitionSegment) {
@@ -233,16 +233,16 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
         return result;
     }
     
-    private Collection<TableSegment> getReferencedTables(final ColumnDefinitionContext ctx) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getReferencedTables(final ColumnDefinitionContext ctx) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (StorageOptionContext each : ctx.storageOption()) {
             if (null != each.dataTypeGenericOption() && null != each.dataTypeGenericOption().referenceDefinition()) {
-                result.add((TableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
+                result.add((SimpleTableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
             }
         }
         for (GeneratedOptionContext each : ctx.generatedOption()) {
             if (null != each.dataTypeGenericOption() && null != each.dataTypeGenericOption().referenceDefinition()) {
-                result.add((TableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
+                result.add((SimpleTableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
             }
         }
         return result;
@@ -270,7 +270,7 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
             result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.primaryKeyOption().columnNames())).getValue());
         }
         if (null != ctx.foreignKeyOption()) {
-            result.setReferencedTable((TableSegment) visit(ctx.foreignKeyOption().referenceDefinition()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.foreignKeyOption().referenceDefinition()));
         }
         return result;
     }
@@ -348,28 +348,28 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
     @Override
     public ASTNode visitDropTable(final DropTableContext ctx) {
         DropTableStatement result = new DropTableStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableNames())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
         return result;
     }
     
     @Override
     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
         TruncateStatement result = new TruncateStatement();
-        result.getTables().add((TableSegment) visit(ctx.tableName()));
+        result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
         CreateIndexStatement result = new CreateIndexStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
     @Override
     public ASTNode visitDropIndex(final DropIndexContext ctx) {
         DropIndexStatement result = new DropIndexStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java
index afbfa37587c..d151e05aa59 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java
@@ -92,7 +92,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.CallStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DoStatement;
@@ -141,7 +141,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
         if (null != ctx.onDuplicateKeyClause()) {
             result.setOnDuplicateKeyColumns((OnDuplicateKeyColumnsSegment) visit(ctx.onDuplicateKeyClause()));
         }
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
@@ -157,7 +157,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
             result = new ReplaceStatement();
             result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         }
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
@@ -198,7 +198,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableReferences())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences())).getValue());
         result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -251,9 +251,9 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     public ASTNode visitDelete(final DeleteContext ctx) {
         DeleteStatement result = new DeleteStatement();
         if (null != ctx.multipleTablesClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.multipleTablesClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTablesClause())).getValue());
         } else {
-            result.getTables().add((TableSegment) visit(ctx.singleTableClause()));
+            result.getTables().add((SimpleTableSegment) visit(ctx.singleTableClause()));
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -264,7 +264,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        TableSegment result = (TableSegment) visit(ctx.tableName());
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
         if (null != ctx.alias()) {
             result.setAlias((AliasSegment) visit(ctx.alias()));
         }
@@ -274,17 +274,17 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        result.combine((CollectionValue<TableSegment>) visit(ctx.multipleTableNames()));
-        result.combine((CollectionValue<TableSegment>) visit(ctx.tableReferences()));
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTableNames()));
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences()));
         return result;
     }
     
     @Override
     public ASTNode visitMultipleTableNames(final MultipleTableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
@@ -312,7 +312,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
             result.getProjections().setDistinctRow(isDistinct(ctx));
         }
         if (null != ctx.fromClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.fromClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.fromClause())).getValue());
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -333,9 +333,9 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableSegments(final Collection<TableSegment> tableSegments, final JoinedTableContext joinedTable) {
-        Collection<TableSegment> result = new LinkedList<>();
-        for (TableSegment tableSegment : ((CollectionValue<TableSegment>) visit(joinedTable)).getValue()) {
+    private Collection<SimpleTableSegment> getTableSegments(final Collection<SimpleTableSegment> tableSegments, final JoinedTableContext joinedTable) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
+        for (SimpleTableSegment tableSegment : ((CollectionValue<SimpleTableSegment>) visit(joinedTable)).getValue()) {
             if (isTable(tableSegment, tableSegments)) {
                 result.add(tableSegment);
             }
@@ -343,8 +343,8 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
         return result;
     }
     
-    private boolean isTable(final TableSegment owner, final Collection<TableSegment> tableSegments) {
-        for (TableSegment each : tableSegments) {
+    private boolean isTable(final SimpleTableSegment owner, final Collection<SimpleTableSegment> tableSegments) {
+        for (SimpleTableSegment each : tableSegments) {
             if (owner.getTableName().getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
@@ -464,9 +464,9 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitTableReferences(final TableReferencesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (EscapedTableReferenceContext each : ctx.escapedTableReference()) {
-            result.combine((CollectionValue<TableSegment>) visit(each));
+            result.combine((CollectionValue<SimpleTableSegment>) visit(each));
         }
         return result;
     }
@@ -478,11 +478,11 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null != ctx.tableFactor()) {
             ASTNode tableFactor = visit(ctx.tableFactor());
-            if (tableFactor instanceof TableSegment) {
-                result.getValue().add((TableSegment) tableFactor);
+            if (tableFactor instanceof SimpleTableSegment) {
+                result.getValue().add((SimpleTableSegment) tableFactor);
             }
         }
         if (null != ctx.joinedTable()) {
@@ -496,7 +496,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     @Override
     public ASTNode visitTableFactor(final TableFactorContext ctx) {
         if (null != ctx.tableName()) {
-            TableSegment result = (TableSegment) visit(ctx.tableName());
+            SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
@@ -511,12 +511,12 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitJoinedTable(final JoinedTableContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        TableSegment tableSegment = (TableSegment) visit(ctx.tableFactor());
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        SimpleTableSegment tableSegment = (SimpleTableSegment) visit(ctx.tableFactor());
         result.getValue().add(tableSegment);
         if (null != ctx.joinSpecification()) {
-            Collection<TableSegment> tableSegments = new LinkedList<>();
-            for (TableSegment each : ((CollectionValue<TableSegment>) visit(ctx.joinSpecification())).getValue()) {
+            Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
+            for (SimpleTableSegment each : ((CollectionValue<SimpleTableSegment>) visit(ctx.joinSpecification())).getValue()) {
                 if (isTable(each, Collections.singleton(tableSegment))) {
                     tableSegments.add(each);
                 }
@@ -528,7 +528,7 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
     
     @Override
     public ASTNode visitJoinSpecification(final JoinSpecificationContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null == ctx.expr()) {
             return result;
         }
@@ -545,8 +545,8 @@ public final class MySQLDMLVisitor extends MySQLVisitor implements DMLVisitor {
         return result;
     }
     
-    private TableSegment createTableSegment(final OwnerSegment ownerSegment) {
-        return new TableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
+    private SimpleTableSegment createTableSegment(final OwnerSegment ownerSegment) {
+        return new SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/OracleVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/OracleVisitor.java
index 671e5a555c5..593248f6f1a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/OracleVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/OracleVisitor.java
@@ -83,8 +83,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
@@ -186,7 +186,7 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
     
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
-        TableSegment result = new TableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
             result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
@@ -211,9 +211,9 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
     
     @Override
     public final ASTNode visitTableNames(final TableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDCLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDCLVisitor.java
index a1c0dfaa992..0c2157dc0c7 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDCLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDCLVisitor.java
@@ -28,7 +28,7 @@ import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.GrantC
 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ObjectPrivilegeClauseContext;
 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.RevokeContext;
 import org.apache.shardingsphere.sql.parser.sql.ASTNode;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterRoleStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterUserStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.CreateRoleStatement;
@@ -51,7 +51,7 @@ public final class OracleDCLVisitor extends OracleVisitor implements DCLVisitor
     public ASTNode visitGrant(final GrantContext ctx) {
         GrantStatement result = new GrantStatement();
         if (null != ctx.objectPrivilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.objectPrivilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.objectPrivilegeClause())) {
                 result.getTables().add(each);
             }
         }
@@ -62,7 +62,7 @@ public final class OracleDCLVisitor extends OracleVisitor implements DCLVisitor
     public ASTNode visitRevoke(final RevokeContext ctx) {
         RevokeStatement result = new RevokeStatement();
         if (null != ctx.objectPrivilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.objectPrivilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.objectPrivilegeClause())) {
                 result.getTables().add(each);
             }
         }
@@ -70,8 +70,8 @@ public final class OracleDCLVisitor extends OracleVisitor implements DCLVisitor
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableFromPrivilegeClause(final ObjectPrivilegeClauseContext ctx) {
-        return null == ctx.onObjectClause().tableName() ? Collections.<TableSegment>emptyList() : Collections.singletonList((TableSegment) visit(ctx.onObjectClause().tableName()));
+    private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final ObjectPrivilegeClauseContext ctx) {
+        return null == ctx.onObjectClause().tableName() ? Collections.<SimpleTableSegment>emptyList() : Collections.singletonList((SimpleTableSegment) visit(ctx.onObjectClause().tableName()));
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java
index 87d149d96bf..6c527152ea6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java
@@ -48,7 +48,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropCol
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
@@ -72,7 +72,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new CreateTableStatement((TableSegment) visit(ctx.tableName()));
+        CreateTableStatement result = new CreateTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
@@ -112,11 +112,11 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
                 ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getIdentifier().getValue(), dataType.getValue(), isPrimaryKey);
         for (InlineConstraintContext each : ctx.inlineConstraint()) {
             if (null != each.referencesClause()) {
-                result.getReferencedTables().add((TableSegment) visit(each.referencesClause().tableName()));
+                result.getReferencedTables().add((SimpleTableSegment) visit(each.referencesClause().tableName()));
             }
         }
         if (null != ctx.inlineRefConstraint()) {
-            result.getReferencedTables().add((TableSegment) visit(ctx.inlineRefConstraint().tableName()));
+            result.getReferencedTables().add((SimpleTableSegment) visit(ctx.inlineRefConstraint().tableName()));
         }
         return result;
     }
@@ -138,7 +138,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
             result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.columnNames())).getValue());
         }
         if (null != ctx.referencesClause()) {
-            result.setReferencedTable((TableSegment) visit(ctx.referencesClause().tableName()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.referencesClause().tableName()));
         }
         return result;
     }
@@ -147,7 +147,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     public ASTNode visitOutOfLineRefConstraint(final OutOfLineRefConstraintContext ctx) {
         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
         if (null != ctx.referencesClause()) {
-            result.setReferencedTable((TableSegment) visit(ctx.referencesClause().tableName()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.referencesClause().tableName()));
         }
         return result;
     }
@@ -155,7 +155,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitAlterTable(final AlterTableContext ctx) {
-        AlterTableStatement result = new AlterTableStatement((TableSegment) visit(ctx.tableName()));
+        AlterTableStatement result = new AlterTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.alterDefinitionClause()) {
             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
                 if (each instanceof AddColumnDefinitionSegment) {
@@ -237,7 +237,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     @Override
     public ASTNode visitDropTable(final DropTableContext ctx) {
         DropTableStatement result = new DropTableStatement();
-        result.getTables().add((TableSegment) visit(ctx.tableName()));
+        result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
@@ -245,7 +245,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     @Override
     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
         TruncateStatement result = new TruncateStatement();
-        result.getTables().add((TableSegment) visit(ctx.tableName()));
+        result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
@@ -253,7 +253,7 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
         CreateIndexStatement result = new CreateIndexStatement();
         if (null != ctx.createIndexDefinitionClause().tableIndexClause()) {
-            result.setTable((TableSegment) visit(ctx.createIndexDefinitionClause().tableIndexClause().tableName()));
+            result.setTable((SimpleTableSegment) visit(ctx.createIndexDefinitionClause().tableIndexClause().tableName()));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDMLVisitor.java
index 49cfca235ae..3931072074c 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDMLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDMLVisitor.java
@@ -75,7 +75,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -101,7 +101,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
         // TODO deal with insert select
         if (null != ctx.insertSingleTable()) {
             InsertStatement result = (InsertStatement) visit(ctx.insertSingleTable().insertValuesClause());
-            result.setTable((TableSegment) visit(ctx.insertSingleTable().insertIntoClause().tableName()));
+            result.setTable((SimpleTableSegment) visit(ctx.insertSingleTable().insertIntoClause().tableName()));
             result.setParameterCount(getCurrentParameterIndex());
             return result;
         }
@@ -135,7 +135,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableReferences())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences())).getValue());
         result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -183,9 +183,9 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     public ASTNode visitDelete(final DeleteContext ctx) {
         DeleteStatement result = new DeleteStatement();
         if (null != ctx.multipleTablesClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.multipleTablesClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTablesClause())).getValue());
         } else {
-            result.getTables().add((TableSegment) visit(ctx.singleTableClause()));
+            result.getTables().add((SimpleTableSegment) visit(ctx.singleTableClause()));
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -196,7 +196,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        TableSegment result = (TableSegment) visit(ctx.tableName());
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
         if (null != ctx.alias()) {
             result.setAlias((AliasSegment) visit(ctx.alias()));
         }
@@ -206,17 +206,17 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        result.combine((CollectionValue<TableSegment>) visit(ctx.multipleTableNames()));
-        result.combine((CollectionValue<TableSegment>) visit(ctx.tableReferences()));
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTableNames()));
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences()));
         return result;
     }
     
     @Override
     public ASTNode visitMultipleTableNames(final MultipleTableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
@@ -244,7 +244,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
             result.getProjections().setDistinctRow(isDistinct(ctx));
         }
         if (null != ctx.fromClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.fromClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.fromClause())).getValue());
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -259,9 +259,9 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableSegments(final Collection<TableSegment> tableSegments, final JoinedTableContext joinedTable) {
-        Collection<TableSegment> result = new LinkedList<>();
-        for (TableSegment tableSegment : ((CollectionValue<TableSegment>) visit(joinedTable)).getValue()) {
+    private Collection<SimpleTableSegment> getTableSegments(final Collection<SimpleTableSegment> tableSegments, final JoinedTableContext joinedTable) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
+        for (SimpleTableSegment tableSegment : ((CollectionValue<SimpleTableSegment>) visit(joinedTable)).getValue()) {
             if (isTable(tableSegment, tableSegments)) {
                 result.add(tableSegment);
             }
@@ -269,8 +269,8 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
         return result;
     }
     
-    private boolean isTable(final TableSegment owner, final Collection<TableSegment> tableSegments) {
-        for (TableSegment each : tableSegments) {
+    private boolean isTable(final SimpleTableSegment owner, final Collection<SimpleTableSegment> tableSegments) {
+        for (SimpleTableSegment each : tableSegments) {
             if (owner.getTableName().getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
@@ -373,20 +373,20 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitTableReferences(final TableReferencesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableReferenceContext each : ctx.tableReference()) {
-            result.combine((CollectionValue<TableSegment>) visit(each));
+            result.combine((CollectionValue<SimpleTableSegment>) visit(each));
         }
         return result;
     }
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null != ctx.tableFactor()) {
             ASTNode tableFactor = visit(ctx.tableFactor());
-            if (tableFactor instanceof TableSegment) {
-                result.getValue().add((TableSegment) tableFactor);
+            if (tableFactor instanceof SimpleTableSegment) {
+                result.getValue().add((SimpleTableSegment) tableFactor);
             }
         }
         if (null != ctx.joinedTable()) {
@@ -400,7 +400,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     @Override
     public ASTNode visitTableFactor(final TableFactorContext ctx) {
         if (null != ctx.tableName()) {
-            TableSegment result = (TableSegment) visit(ctx.tableName());
+            SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
@@ -415,12 +415,12 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitJoinedTable(final JoinedTableContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        TableSegment tableSegment = (TableSegment) visit(ctx.tableFactor());
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        SimpleTableSegment tableSegment = (SimpleTableSegment) visit(ctx.tableFactor());
         result.getValue().add(tableSegment);
         if (null != ctx.joinSpecification()) {
-            Collection<TableSegment> tableSegments = new LinkedList<>();
-            for (TableSegment each : ((CollectionValue<TableSegment>) visit(ctx.joinSpecification())).getValue()) {
+            Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
+            for (SimpleTableSegment each : ((CollectionValue<SimpleTableSegment>) visit(ctx.joinSpecification())).getValue()) {
                 if (isTable(each, Collections.singleton(tableSegment))) {
                     tableSegments.add(each);
                 }
@@ -432,7 +432,7 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
     
     @Override
     public ASTNode visitJoinSpecification(final JoinSpecificationContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null == ctx.expr()) {
             return result;
         }
@@ -449,8 +449,8 @@ public final class OracleDMLVisitor extends OracleVisitor implements DMLVisitor
         return result;
     }
     
-    private TableSegment createTableSegment(final OwnerSegment ownerSegment) {
-        return new TableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
+    private SimpleTableSegment createTableSegment(final OwnerSegment ownerSegment) {
+        return new SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/PostgreSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/PostgreSQLVisitor.java
index 3a910a6e97e..b1faadb304e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/PostgreSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/PostgreSQLVisitor.java
@@ -85,8 +85,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
@@ -188,7 +188,7 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
     
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
-        TableSegment result = new TableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
             result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
@@ -213,9 +213,9 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
     
     @Override
     public final ASTNode visitTableNames(final TableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDCLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDCLVisitor.java
index 6c26f0a71f3..1883652c590 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDCLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDCLVisitor.java
@@ -28,7 +28,7 @@ import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Gr
 import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.PrivilegeClauseContext;
 import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.RevokeContext;
 import org.apache.shardingsphere.sql.parser.sql.ASTNode;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterRoleStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterUserStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.CreateRoleStatement;
@@ -52,7 +52,7 @@ public final class PostgreSQLDCLVisitor extends PostgreSQLVisitor implements DCL
     public ASTNode visitGrant(final GrantContext ctx) {
         GrantStatement result = new GrantStatement();
         if (null != ctx.privilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
                 result.getTables().add(each);
             }
         }
@@ -63,7 +63,7 @@ public final class PostgreSQLDCLVisitor extends PostgreSQLVisitor implements DCL
     public ASTNode visitRevoke(final RevokeContext ctx) {
         RevokeStatement result = new RevokeStatement();
         if (null != ctx.privilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
                 result.getTables().add(each);
             }
         }
@@ -71,8 +71,8 @@ public final class PostgreSQLDCLVisitor extends PostgreSQLVisitor implements DCL
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
-        return null == ctx.onObjectClause().tableNames() ? Collections.<TableSegment>emptyList() : ((CollectionValue<TableSegment>) visit(ctx.onObjectClause().tableNames())).getValue();
+    private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
+        return null == ctx.onObjectClause().tableNames() ? Collections.<SimpleTableSegment>emptyList() : ((CollectionValue<SimpleTableSegment>) visit(ctx.onObjectClause().tableNames())).getValue();
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDDLVisitor.java
index bbb49737745..dc860a6eaa8 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDDLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDDLVisitor.java
@@ -51,7 +51,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.RenameC
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
@@ -74,7 +74,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new CreateTableStatement((TableSegment) visit(ctx.tableName()));
+        CreateTableStatement result = new CreateTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
@@ -105,7 +105,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitAlterTable(final AlterTableContext ctx) {
-        AlterTableStatement result = new AlterTableStatement((TableSegment) visit(ctx.tableNameClause().tableName()));
+        AlterTableStatement result = new AlterTableStatement((SimpleTableSegment) visit(ctx.tableNameClause().tableName()));
         if (null != ctx.alterDefinitionClause()) {
             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
                 if (each instanceof AddColumnDefinitionSegment) {
@@ -168,7 +168,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
                 ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getIdentifier().getValue(), dataType.getValue(), isPrimaryKey);
         for (ColumnConstraintContext each : ctx.columnConstraint()) {
             if (null != each.columnConstraintOption().tableName()) {
-                result.getReferencedTables().add((TableSegment) visit(each.columnConstraintOption().tableName()));
+                result.getReferencedTables().add((SimpleTableSegment) visit(each.columnConstraintOption().tableName()));
             }
         }
         return result;
@@ -191,7 +191,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
             result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.tableConstraintOption().columnNames(0))).getValue());
         }
         if (null != ctx.tableConstraintOption().FOREIGN()) {
-            result.setReferencedTable((TableSegment) visit(ctx.tableConstraintOption().tableName()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.tableConstraintOption().tableName()));
         }
         return result;
     }
@@ -221,7 +221,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
     @Override
     public ASTNode visitDropTable(final DropTableContext ctx) {
         DropTableStatement result = new DropTableStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableNames())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
         return result;
     }
     
@@ -229,14 +229,14 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
     @Override
     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
         TruncateStatement result = new TruncateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableNamesClause())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNamesClause())).getValue());
         return result;
     }
     
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
         CreateIndexStatement result = new CreateIndexStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.indexName()) {
             result.setIndex((IndexSegment) visit(ctx.indexName()));
         }
@@ -274,11 +274,11 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
     
     @Override
     public ASTNode visitTableNamesClause(final TableNamesClauseContext ctx) {
-        Collection<TableSegment> tableSegments = new LinkedList<>();
+        Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
         for (int i = 0; i < ctx.tableNameClause().size(); i++) {
-            tableSegments.add((TableSegment) visit(ctx.tableNameClause(i)));
+            tableSegments.add((SimpleTableSegment) visit(ctx.tableNameClause(i)));
         }
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         result.getValue().addAll(tableSegments);
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDMLVisitor.java
index 622eb3e1be3..8fd9f8acc6d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDMLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/PostgreSQLDMLVisitor.java
@@ -82,7 +82,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -109,7 +109,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
         // TODO :FIXME, since there is no segment for insertValuesClause, InsertStatement is created by sub rule.
         // TODO deal with insert select
         InsertStatement result = (InsertStatement) visit(ctx.insertValuesClause());
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
@@ -141,7 +141,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableReferences())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences())).getValue());
         result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -189,9 +189,9 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     public ASTNode visitDelete(final DeleteContext ctx) {
         DeleteStatement result = new DeleteStatement();
         if (null != ctx.multipleTablesClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.multipleTablesClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTablesClause())).getValue());
         } else {
-            result.getTables().add((TableSegment) visit(ctx.singleTableClause()));
+            result.getTables().add((SimpleTableSegment) visit(ctx.singleTableClause()));
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -202,7 +202,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        TableSegment result = (TableSegment) visit(ctx.tableName());
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
         if (null != ctx.alias()) {
             result.setAlias((AliasSegment) visit(ctx.alias()));
         }
@@ -212,17 +212,17 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        result.combine((CollectionValue<TableSegment>) visit(ctx.multipleTableNames()));
-        result.combine((CollectionValue<TableSegment>) visit(ctx.tableReferences()));
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTableNames()));
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences()));
         return result;
     }
     
     @Override
     public ASTNode visitMultipleTableNames(final MultipleTableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
@@ -250,7 +250,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
             result.getProjections().setDistinctRow(isDistinct(ctx));
         }
         if (null != ctx.fromClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.fromClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.fromClause())).getValue());
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -268,9 +268,9 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableSegments(final Collection<TableSegment> tableSegments, final JoinedTableContext joinedTable) {
-        Collection<TableSegment> result = new LinkedList<>();
-        for (TableSegment tableSegment : ((CollectionValue<TableSegment>) visit(joinedTable)).getValue()) {
+    private Collection<SimpleTableSegment> getTableSegments(final Collection<SimpleTableSegment> tableSegments, final JoinedTableContext joinedTable) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
+        for (SimpleTableSegment tableSegment : ((CollectionValue<SimpleTableSegment>) visit(joinedTable)).getValue()) {
             if (isTable(tableSegment, tableSegments)) {
                 result.add(tableSegment);
             }
@@ -278,8 +278,8 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
         return result;
     }
     
-    private boolean isTable(final TableSegment owner, final Collection<TableSegment> tableSegments) {
-        for (TableSegment each : tableSegments) {
+    private boolean isTable(final SimpleTableSegment owner, final Collection<SimpleTableSegment> tableSegments) {
+        for (SimpleTableSegment each : tableSegments) {
             if (owner.getTableName().getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
@@ -382,20 +382,20 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitTableReferences(final TableReferencesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableReferenceContext each : ctx.tableReference()) {
-            result.combine((CollectionValue<TableSegment>) visit(each));
+            result.combine((CollectionValue<SimpleTableSegment>) visit(each));
         }
         return result;
     }
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null != ctx.tableFactor()) {
             ASTNode tableFactor = visit(ctx.tableFactor());
-            if (tableFactor instanceof TableSegment) {
-                result.getValue().add((TableSegment) tableFactor);
+            if (tableFactor instanceof SimpleTableSegment) {
+                result.getValue().add((SimpleTableSegment) tableFactor);
             }
         }
         if (null != ctx.joinedTable()) {
@@ -409,7 +409,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     @Override
     public ASTNode visitTableFactor(final TableFactorContext ctx) {
         if (null != ctx.tableName()) {
-            TableSegment result = (TableSegment) visit(ctx.tableName());
+            SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
@@ -424,12 +424,12 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitJoinedTable(final JoinedTableContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        TableSegment tableSegment = (TableSegment) visit(ctx.tableFactor());
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        SimpleTableSegment tableSegment = (SimpleTableSegment) visit(ctx.tableFactor());
         result.getValue().add(tableSegment);
         if (null != ctx.joinSpecification()) {
-            Collection<TableSegment> tableSegments = new LinkedList<>();
-            for (TableSegment each : ((CollectionValue<TableSegment>) visit(ctx.joinSpecification())).getValue()) {
+            Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
+            for (SimpleTableSegment each : ((CollectionValue<SimpleTableSegment>) visit(ctx.joinSpecification())).getValue()) {
                 if (isTable(each, Collections.singleton(tableSegment))) {
                     tableSegments.add(each);
                 }
@@ -441,7 +441,7 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
     
     @Override
     public ASTNode visitJoinSpecification(final JoinSpecificationContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null == ctx.expr()) {
             return result;
         }
@@ -458,8 +458,8 @@ public final class PostgreSQLDMLVisitor extends PostgreSQLVisitor implements DML
         return result;
     }
     
-    private TableSegment createTableSegment(final OwnerSegment ownerSegment) {
-        return new TableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
+    private SimpleTableSegment createTableSegment(final OwnerSegment ownerSegment) {
+        return new SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngine.java
index 5a84ae2f9c9..528c9f67fa5 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngine.java
@@ -34,7 +34,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrd
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.OrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.TextOrderByItemSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 
 import java.util.ArrayList;
@@ -81,7 +81,7 @@ public final class ProjectionsContextEngine {
         return result;
     }
     
-    private List<String> getColumnLabels(final Collection<TableSegment> tables, final Collection<Projection> projections) {
+    private List<String> getColumnLabels(final Collection<SimpleTableSegment> tables, final Collection<Projection> projections) {
         List<String> result = new ArrayList<>(projections.size());
         for (Projection each : projections) {
             if (each instanceof ShorthandProjection) {
@@ -93,13 +93,13 @@ public final class ProjectionsContextEngine {
         return result;
     }
     
-    private Collection<String> getShorthandColumnLabels(final Collection<TableSegment> tables, final ShorthandProjection shorthandProjection) {
+    private Collection<String> getShorthandColumnLabels(final Collection<SimpleTableSegment> tables, final ShorthandProjection shorthandProjection) {
         return shorthandProjection.getOwner().isPresent()
                 ? getQualifiedShorthandColumnLabels(tables, shorthandProjection.getOwner().get()) : getUnqualifiedShorthandColumnLabels(tables);
     }
     
-    private Collection<String> getQualifiedShorthandColumnLabels(final Collection<TableSegment> tables, final String owner) {
-        for (TableSegment each : tables) {
+    private Collection<String> getQualifiedShorthandColumnLabels(final Collection<SimpleTableSegment> tables, final String owner) {
+        for (SimpleTableSegment each : tables) {
             if (owner.equalsIgnoreCase(each.getAlias().orElse(each.getTableName().getIdentifier().getValue()))) {
                 return relationMetas.getAllColumnNames(each.getTableName().getIdentifier().getValue());
             }
@@ -107,9 +107,9 @@ public final class ProjectionsContextEngine {
         return Collections.emptyList();
     }
     
-    private Collection<String> getUnqualifiedShorthandColumnLabels(final Collection<TableSegment> tables) {
+    private Collection<String> getUnqualifiedShorthandColumnLabels(final Collection<SimpleTableSegment> tables) {
         Collection<String> result = new LinkedList<>();
-        for (TableSegment each : tables) {
+        for (SimpleTableSegment each : tables) {
             result.addAll(relationMetas.getAllColumnNames(each.getTableName().getIdentifier().getValue()));
         }
         return result;
@@ -171,7 +171,7 @@ public final class ProjectionsContextEngine {
     }
     
     private Optional<ShorthandProjection> findShorthandProjection(final Collection<Projection> projections, final String tableNameOrAlias, final SelectStatement selectStatement) {
-        TableSegment tableSegment = find(tableNameOrAlias, selectStatement);
+        SimpleTableSegment tableSegment = find(tableNameOrAlias, selectStatement);
         for (Projection each : projections) {
             if (!(each instanceof ShorthandProjection)) {
                 continue;
@@ -211,7 +211,7 @@ public final class ProjectionsContextEngine {
     
     private boolean isSameProjection(final ShorthandProjection shorthandProjection, final ColumnOrderByItemSegment orderItem, final SelectStatement selectStatement) {
         Preconditions.checkState(shorthandProjection.getOwner().isPresent());
-        TableSegment tableSegment = find(shorthandProjection.getOwner().get(), selectStatement);
+        SimpleTableSegment tableSegment = find(shorthandProjection.getOwner().get(), selectStatement);
         return relationMetas.containsColumn(tableSegment.getTableName().getIdentifier().getValue(), orderItem.getColumn().getIdentifier().getValue());
     }
     
@@ -223,8 +223,8 @@ public final class ProjectionsContextEngine {
         return !projection.getAlias().isPresent() && projection.getExpression().equalsIgnoreCase(orderItem.getText());
     }
     
-    private TableSegment find(final String tableNameOrAlias, final SelectStatement selectStatement) {
-        for (TableSegment each : selectStatement.getTables()) {
+    private SimpleTableSegment find(final String tableNameOrAlias, final SelectStatement selectStatement) {
+        for (SimpleTableSegment each : selectStatement.getTables()) {
             if (tableNameOrAlias.equalsIgnoreCase(each.getTableName().getIdentifier().getValue()) || tableNameOrAlias.equals(each.getAlias().orElse(null))) {
                 return each;
             }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContext.java
index e7855961dc3..a03fb2c4068 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.segment.table;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.relation.metadata.RelationMetas;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -33,9 +33,9 @@ import java.util.Optional;
 @RequiredArgsConstructor
 public final class TablesContext {
     
-    private final Collection<TableSegment> tables;
+    private final Collection<SimpleTableSegment> tables;
     
-    public TablesContext(final TableSegment tableSegment) {
+    public TablesContext(final SimpleTableSegment tableSegment) {
         this(null == tableSegment ? Collections.emptyList() : Collections.singletonList(tableSegment));
     }
     
@@ -46,7 +46,7 @@ public final class TablesContext {
      */
     public Collection<String> getTableNames() {
         Collection<String> result = new LinkedHashSet<>(tables.size(), 1);
-        for (TableSegment each : tables) {
+        for (SimpleTableSegment each : tables) {
             result.add(each.getTableName().getIdentifier().getValue());
         }
         return result;
@@ -70,7 +70,7 @@ public final class TablesContext {
     }
     
     private String findTableNameFromSQL(final String tableNameOrAlias) {
-        for (TableSegment each : tables) {
+        for (SimpleTableSegment each : tables) {
             if (tableNameOrAlias.equalsIgnoreCase(each.getTableName().getIdentifier().getValue()) || tableNameOrAlias.equals(each.getAlias().orElse(null))) {
                 return each.getTableName().getIdentifier().getValue();
             }
@@ -79,7 +79,7 @@ public final class TablesContext {
     }
     
     private Optional<String> findTableNameFromMetaData(final String columnName, final RelationMetas relationMetas) {
-        for (TableSegment each : tables) {
+        for (SimpleTableSegment each : tables) {
             if (relationMetas.containsColumn(each.getTableName().getIdentifier().getValue(), columnName)) {
                 return Optional.of(each.getTableName().getIdentifier().getValue());
             }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/DescribeStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/DescribeStatementContext.java
index 7ae87179c60..0790d75f7e5 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/DescribeStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/DescribeStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dal;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.DescribeStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -41,7 +41,7 @@ public final class DescribeStatementContext extends CommonSQLStatementContext<De
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowColumnsStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowColumnsStatementContext.java
index 74da4b5bcb8..86f1bb56a29 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowColumnsStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowColumnsStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dal;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowColumnsStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -41,7 +41,7 @@ public final class ShowColumnsStatementContext extends CommonSQLStatementContext
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowCreateTableStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowCreateTableStatementContext.java
index cda21a8cfe2..455467aa096 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowCreateTableStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowCreateTableStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dal;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowCreateTableStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -41,7 +41,7 @@ public final class ShowCreateTableStatementContext extends CommonSQLStatementCon
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowIndexStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowIndexStatementContext.java
index aab25d8a6b5..618a40cd16b 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowIndexStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dal/ShowIndexStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dal;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowIndexStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -41,7 +41,7 @@ public final class ShowIndexStatementContext extends CommonSQLStatementContext<S
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/DenyUserStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/DenyUserStatementContext.java
index 454aeb03bce..6cb1e814e99 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/DenyUserStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/DenyUserStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dcl;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.DenyUserStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -41,7 +41,7 @@ public final class DenyUserStatementContext extends CommonSQLStatementContext<De
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/GrantStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/GrantStatementContext.java
index 0df3ff5b626..b94ca5c7548 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/GrantStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/GrantStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dcl;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.GrantStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -40,7 +40,7 @@ public final class GrantStatementContext extends CommonSQLStatementContext<Grant
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return getSqlStatement().getTables();
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/RevokeStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/RevokeStatementContext.java
index 29cbf2da682..91a7915ce97 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/RevokeStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dcl/RevokeStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.dcl;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.RevokeStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -40,7 +40,7 @@ public final class RevokeStatementContext extends CommonSQLStatementContext<Revo
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return getSqlStatement().getTables();
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterIndexStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterIndexStatementContext.java
index d61e114ae39..e33c5bff008 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterIndexStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterIndexStatementContext.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.IndexAvailable;
 
@@ -43,7 +43,7 @@ public final class AlterIndexStatementContext extends CommonSQLStatementContext<
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterTableStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterTableStatementContext.java
index 0de29692132..48f2122d54d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterTableStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/AlterTableStatementContext.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinit
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.AddColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -45,8 +45,8 @@ public final class AlterTableStatementContext extends CommonSQLStatementContext<
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
-        Collection<TableSegment> result = new LinkedList<>();
+    public Collection<SimpleTableSegment> getAllTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         result.add(getSqlStatement().getTable());
         for (AddColumnDefinitionSegment each : getSqlStatement().getAddColumnDefinitions()) {
             for (ColumnDefinitionSegment columnDefinition : each.getColumnDefinitions()) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateIndexStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateIndexStatementContext.java
index ec6f606490b..34e262d9c91 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateIndexStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateIndexStatementContext.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.IndexAvailable;
 
@@ -43,7 +43,7 @@ public final class CreateIndexStatementContext extends CommonSQLStatementContext
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateTableStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateTableStatementContext.java
index 4942f94b591..71e857680bc 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateTableStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/CreateTableStatementContext.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatemen
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.IndexAvailable;
 
@@ -45,8 +45,8 @@ public final class CreateTableStatementContext extends CommonSQLStatementContext
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
-        Collection<TableSegment> result = new LinkedList<>();
+    public Collection<SimpleTableSegment> getAllTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         result.add(getSqlStatement().getTable());
         for (ColumnDefinitionSegment each : getSqlStatement().getColumnDefinitions()) {
             result.addAll(each.getReferencedTables());
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropIndexStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropIndexStatementContext.java
index edc1561b7a2..7a081c1bad9 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropIndexStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropIndexStatementContext.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropIndexStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.IndexAvailable;
 
@@ -43,7 +43,7 @@ public final class DropIndexStatementContext extends CommonSQLStatementContext<D
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return null == getSqlStatement().getTable() ? Collections.emptyList() : Collections.singletonList(getSqlStatement().getTable());
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropTableStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropTableStatementContext.java
index 1e348034383..092ba093098 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropTableStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/DropTableStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.ddl;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropTableStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -40,7 +40,7 @@ public final class DropTableStatementContext extends CommonSQLStatementContext<D
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return getSqlStatement().getTables();
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/InsertStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/InsertStatementContext.java
index 3c58e375b45..887ffb61413 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/InsertStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/InsertStatementContext.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.relation.segment.insert.InsertValueC
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -88,7 +88,7 @@ public final class InsertStatementContext extends CommonSQLStatementContext<Inse
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return Collections.singletonList(getSqlStatement().getTable());
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/SelectStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/SelectStatementContext.java
index c025f728a9d..4bdde2c6c0f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/SelectStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/SelectStatementContext.java
@@ -49,7 +49,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerAvailable;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.WhereAvailable;
 import org.apache.shardingsphere.sql.parser.util.SQLUtil;
@@ -186,8 +186,8 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
-        Collection<TableSegment> result = new LinkedList<>(getSqlStatement().getTables());
+    public Collection<SimpleTableSegment> getAllTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>(getSqlStatement().getTables());
         if (getSqlStatement().getWhere().isPresent()) {
             result.addAll(getAllTablesFromWhere(getSqlStatement().getWhere().get()));
         }
@@ -201,8 +201,8 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
         return result;
     }
     
-    private Collection<TableSegment> getAllTablesFromWhere(final WhereSegment where) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getAllTablesFromWhere(final WhereSegment where) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (AndPredicate each : where.getAndPredicates()) {
             for (PredicateSegment predicate : each.getPredicates()) {
                 result.addAll(new PredicateExtractor(getSqlStatement().getTables(), predicate).extractTables());
@@ -211,19 +211,19 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
         return result;
     }
     
-    private Collection<TableSegment> getAllTablesFromProjections(final ProjectionsSegment projections) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getAllTablesFromProjections(final ProjectionsSegment projections) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (ProjectionSegment each : projections.getProjections()) {
-            Optional<TableSegment> table = getTableSegment(each);
+            Optional<SimpleTableSegment> table = getTableSegment(each);
             table.ifPresent(result::add);
         }
         return result;
     }
     
-    private Optional<TableSegment> getTableSegment(final ProjectionSegment each) {
+    private Optional<SimpleTableSegment> getTableSegment(final ProjectionSegment each) {
         Optional<OwnerSegment> owner = getTableOwner(each);
         if (owner.isPresent() && isTable(owner.get(), getSqlStatement().getTables())) {
-            return Optional .of(new TableSegment(owner.get().getStartIndex(), owner.get().getStopIndex(), owner.get().getIdentifier()));
+            return Optional .of(new SimpleTableSegment(owner.get().getStartIndex(), owner.get().getStopIndex(), owner.get().getIdentifier()));
         }
         return Optional.empty();
     }
@@ -238,23 +238,23 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
         return Optional.empty();
     }
     
-    private Collection<TableSegment> getAllTablesFromOrderByItems(final Collection<OrderByItemSegment> orderByItems) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getAllTablesFromOrderByItems(final Collection<OrderByItemSegment> orderByItems) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (OrderByItemSegment each : orderByItems) {
             if (each instanceof ColumnOrderByItemSegment) {
                 Optional<OwnerSegment> owner = ((ColumnOrderByItemSegment) each).getColumn().getOwner();
                 if (owner.isPresent() && isTable(owner.get(), getSqlStatement().getTables())) {
                     Preconditions.checkState(((ColumnOrderByItemSegment) each).getColumn().getOwner().isPresent());
                     OwnerSegment segment = ((ColumnOrderByItemSegment) each).getColumn().getOwner().get();
-                    result.add(new TableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
+                    result.add(new SimpleTableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getIdentifier()));
                 }
             }
         }
         return result;
     }
     
-    private boolean isTable(final OwnerSegment owner, final Collection<TableSegment> tables) {
-        for (TableSegment each : tables) {
+    private boolean isTable(final OwnerSegment owner, final Collection<SimpleTableSegment> tables) {
+        for (SimpleTableSegment each : tables) {
             if (owner.getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/type/TableAvailable.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/type/TableAvailable.java
index d3709023ea7..ef32fb5f483 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/type/TableAvailable.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/type/TableAvailable.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sql.parser.relation.type;
 
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 
@@ -32,7 +32,7 @@ public interface TableAvailable {
      * 
      * @return all table segments
      */
-    Collection<TableSegment> getAllTables();
+    Collection<SimpleTableSegment> getAllTables();
     
     /**
      * Get tables context.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQL92Visitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQL92Visitor.java
index cf21fdfc41c..f294ebde041 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQL92Visitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQL92Visitor.java
@@ -79,8 +79,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
@@ -182,7 +182,7 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
     
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
-        TableSegment result = new TableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
             result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
@@ -202,9 +202,9 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
     
     @Override
     public final ASTNode visitTableNames(final TableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DCLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DCLVisitor.java
index 8a3b18d709e..528fce1618a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DCLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DCLVisitor.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.GrantCo
 import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.PrivilegeClauseContext;
 import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.RevokeContext;
 import org.apache.shardingsphere.sql.parser.sql.ASTNode;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.GrantStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.RevokeStatement;
 import org.apache.shardingsphere.sql.parser.visitor.SQL92Visitor;
@@ -39,7 +39,7 @@ public final class SQL92DCLVisitor extends SQL92Visitor implements DCLVisitor {
     public ASTNode visitGrant(final GrantContext ctx) {
         GrantStatement result = new GrantStatement();
         if (null != ctx.privilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
                 result.getTables().add(each);
             }
         }
@@ -50,14 +50,14 @@ public final class SQL92DCLVisitor extends SQL92Visitor implements DCLVisitor {
     public ASTNode visitRevoke(final RevokeContext ctx) {
         RevokeStatement result = new RevokeStatement();
         if (null != ctx.privilegeClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.privilegeClause())) {
                 result.getTables().add(each);
             }
         }
         return result;
     }
     
-    private Collection<TableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
-        return Collections.singletonList((TableSegment) visit(ctx.onObjectClause().privilegeLevel().tableName()));
+    private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
+        return Collections.singletonList((SimpleTableSegment) visit(ctx.onObjectClause().privilegeLevel().tableName()));
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DDLVisitor.java
index d0ac8bbda0f..50a17cf7884 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DDLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DDLVisitor.java
@@ -39,7 +39,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropCol
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropTableStatement;
@@ -57,7 +57,7 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new CreateTableStatement((TableSegment) visit(ctx.tableName()));
+        CreateTableStatement result = new CreateTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
@@ -94,7 +94,7 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
                 ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getIdentifier().getValue(), dataType.getValue(), isPrimaryKey);
         for (DataTypeOptionContext each : ctx.dataTypeOption()) {
             if (null != each.referenceDefinition()) {
-                result.getReferencedTables().add((TableSegment) visit(each.referenceDefinition().tableName()));
+                result.getReferencedTables().add((SimpleTableSegment) visit(each.referenceDefinition().tableName()));
             }
         }
         return result;
@@ -117,7 +117,7 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
             result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.primaryKeyOption().columnNames())).getValue());
         }
         if (null != ctx.foreignKeyOption()) {
-            result.setReferencedTable((TableSegment) visit(ctx.foreignKeyOption().referenceDefinition().tableName()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.foreignKeyOption().referenceDefinition().tableName()));
         }
         return result;
     }
@@ -125,7 +125,7 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitAlterTable(final AlterTableContext ctx) {
-        AlterTableStatement result = new AlterTableStatement((TableSegment) visit(ctx.tableName()));
+        AlterTableStatement result = new AlterTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.alterDefinitionClause()) {
             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
                 if (each instanceof AddColumnDefinitionSegment) {
@@ -184,7 +184,7 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
     @Override
     public ASTNode visitDropTable(final DropTableContext ctx) {
         DropTableStatement result = new DropTableStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableNames())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
         return result;
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DMLVisitor.java
index 6e80cb0a638..5c68c2b5dfd 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DMLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQL92DMLVisitor.java
@@ -74,7 +74,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -97,7 +97,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @Override
     public ASTNode visitInsert(final InsertContext ctx) {
         InsertStatement result = (InsertStatement) visit(ctx.insertValuesClause());
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
@@ -129,7 +129,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableReferences())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences())).getValue());
         result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -176,7 +176,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @Override
     public ASTNode visitDelete(final DeleteContext ctx) {
         DeleteStatement result = new DeleteStatement();
-        result.getTables().add((TableSegment) visit(ctx.singleTableClause()));
+        result.getTables().add((SimpleTableSegment) visit(ctx.singleTableClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
         }
@@ -186,7 +186,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        TableSegment result = (TableSegment) visit(ctx.tableName());
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
         if (null != ctx.alias()) {
             result.setAlias((AliasSegment) visit(ctx.alias()));
         }
@@ -216,7 +216,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
             result.getProjections().setDistinctRow(isDistinct(ctx.selectSpecification().get(0)));
         }
         if (null != ctx.fromClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.fromClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.fromClause())).getValue());
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -231,9 +231,9 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableSegments(final Collection<TableSegment> tableSegments, final JoinedTableContext joinedTable) {
-        Collection<TableSegment> result = new LinkedList<>();
-        for (TableSegment tableSegment : ((CollectionValue<TableSegment>) visit(joinedTable)).getValue()) {
+    private Collection<SimpleTableSegment> getTableSegments(final Collection<SimpleTableSegment> tableSegments, final JoinedTableContext joinedTable) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
+        for (SimpleTableSegment tableSegment : ((CollectionValue<SimpleTableSegment>) visit(joinedTable)).getValue()) {
             if (isTable(tableSegment, tableSegments)) {
                 result.add(tableSegment);
             }
@@ -241,8 +241,8 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
         return result;
     }
     
-    private boolean isTable(final TableSegment owner, final Collection<TableSegment> tableSegments) {
-        for (TableSegment each : tableSegments) {
+    private boolean isTable(final SimpleTableSegment owner, final Collection<SimpleTableSegment> tableSegments) {
+        for (SimpleTableSegment each : tableSegments) {
             if (owner.getTableName().getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
@@ -345,20 +345,20 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitTableReferences(final TableReferencesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (EscapedTableReferenceContext each : ctx.escapedTableReference()) {
-            result.combine((CollectionValue<TableSegment>) visit(each.tableReference()));
+            result.combine((CollectionValue<SimpleTableSegment>) visit(each.tableReference()));
         }
         return result;
     }
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null != ctx.tableFactor()) {
             ASTNode tableFactor = visit(ctx.tableFactor());
-            if (tableFactor instanceof TableSegment) {
-                result.getValue().add((TableSegment) tableFactor);
+            if (tableFactor instanceof SimpleTableSegment) {
+                result.getValue().add((SimpleTableSegment) tableFactor);
             }
         }
         if (null != ctx.joinedTable()) {
@@ -372,7 +372,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @Override
     public ASTNode visitTableFactor(final TableFactorContext ctx) {
         if (null != ctx.tableName()) {
-            TableSegment result = (TableSegment) visit(ctx.tableName());
+            SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
@@ -387,12 +387,12 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitJoinedTable(final JoinedTableContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        TableSegment tableSegment = (TableSegment) visit(ctx.tableFactor());
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        SimpleTableSegment tableSegment = (SimpleTableSegment) visit(ctx.tableFactor());
         result.getValue().add(tableSegment);
         if (null != ctx.joinSpecification()) {
-            Collection<TableSegment> tableSegments = new LinkedList<>();
-            for (TableSegment each : ((CollectionValue<TableSegment>) visit(ctx.joinSpecification())).getValue()) {
+            Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
+            for (SimpleTableSegment each : ((CollectionValue<SimpleTableSegment>) visit(ctx.joinSpecification())).getValue()) {
                 if (isTable(each, Collections.singleton(tableSegment))) {
                     tableSegments.add(each);
                 }
@@ -404,7 +404,7 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
     
     @Override
     public ASTNode visitJoinSpecification(final JoinSpecificationContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null == ctx.expr()) {
             return result;
         }
@@ -421,8 +421,8 @@ public final class SQL92DMLVisitor extends SQL92Visitor implements DMLVisitor {
         return result;
     }
     
-    private TableSegment createTableSegment(final OwnerSegment ownerSegment) {
-        return new TableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
+    private SimpleTableSegment createTableSegment(final OwnerSegment ownerSegment) {
+        return new SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
     }
     
     @Override
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQLServerVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQLServerVisitor.java
index 88dd5efacda..3cb38476817 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQLServerVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/SQLServerVisitor.java
@@ -84,8 +84,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
@@ -187,7 +187,7 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
     
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
-        TableSegment result = new TableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
             result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
@@ -212,9 +212,9 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
     
     @Override
     public final ASTNode visitTableNames(final TableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDCLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDCLVisitor.java
index 3263354fd18..8241670c5e7 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDCLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDCLVisitor.java
@@ -33,7 +33,7 @@ import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Dro
 import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantContext;
 import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.RevokeContext;
 import org.apache.shardingsphere.sql.parser.sql.ASTNode;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterLoginStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterRoleStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dcl.AlterUserStatement;
@@ -60,12 +60,12 @@ public final class SQLServerDCLVisitor extends SQLServerVisitor implements DCLVi
     public ASTNode visitGrant(final GrantContext ctx) {
         GrantStatement result = new GrantStatement();
         if (null != ctx.classPrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
                 result.getTables().add(each);
             }
         }
         if (null != ctx.classTypePrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
                 result.getTables().add(each);
             }
         }
@@ -76,24 +76,24 @@ public final class SQLServerDCLVisitor extends SQLServerVisitor implements DCLVi
     public ASTNode visitRevoke(final RevokeContext ctx) {
         RevokeStatement result = new RevokeStatement();
         if (null != ctx.classPrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
                 result.getTables().add(each);
             }
         }
         if (null != ctx.classTypePrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
                 result.getTables().add(each);
             }
         }
         return result;
     }
     
-    private Collection<TableSegment> getTableFromPrivilegeClause(final ClassPrivilegesClauseContext ctx) {
-        return null == ctx.onClassClause().tableName() ? Collections.<TableSegment>emptyList() : Collections.singletonList((TableSegment) visit(ctx.onClassClause().tableName()));
+    private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final ClassPrivilegesClauseContext ctx) {
+        return null == ctx.onClassClause().tableName() ? Collections.<SimpleTableSegment>emptyList() : Collections.singletonList((SimpleTableSegment) visit(ctx.onClassClause().tableName()));
     }
     
-    private Collection<TableSegment> getTableFromPrivilegeClause(final ClassTypePrivilegesClauseContext ctx) {
-        return null == ctx.onClassTypeClause().tableName() ? Collections.<TableSegment>emptyList() : Collections.singletonList((TableSegment) visit(ctx.onClassTypeClause().tableName()));
+    private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final ClassTypePrivilegesClauseContext ctx) {
+        return null == ctx.onClassTypeClause().tableName() ? Collections.<SimpleTableSegment>emptyList() : Collections.singletonList((SimpleTableSegment) visit(ctx.onClassTypeClause().tableName()));
     }
     
     @Override
@@ -110,12 +110,12 @@ public final class SQLServerDCLVisitor extends SQLServerVisitor implements DCLVi
     public ASTNode visitDeny(final DenyContext ctx) {
         DenyUserStatement result = new DenyUserStatement();
         if (null != ctx.classPrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
                 result.setTable(each);
             }
         }
         if (null != ctx.classTypePrivilegesClause()) {
-            for (TableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
+            for (SimpleTableSegment each : getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
                 result.setTable(each);
             }
         }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDDLVisitor.java
index 1a68ced6ddb..e6ef2c1315f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDDLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDDLVisitor.java
@@ -47,7 +47,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyC
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
@@ -71,7 +71,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new CreateTableStatement((TableSegment) visit(ctx.tableName()));
+        CreateTableStatement result = new CreateTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
@@ -109,13 +109,13 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
         for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
             for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
                 if (null != columnConstraint.columnForeignKeyConstraint()) {
-                    result.getReferencedTables().add((TableSegment) visit(columnConstraint.columnForeignKeyConstraint().tableName()));
+                    result.getReferencedTables().add((SimpleTableSegment) visit(columnConstraint.columnForeignKeyConstraint().tableName()));
                 }
             }
         }
         for (ColumnConstraintContext each : ctx.columnConstraints().columnConstraint()) {
             if (null != each.columnForeignKeyConstraint()) {
-                result.getReferencedTables().add((TableSegment) visit(each.columnForeignKeyConstraint().tableName()));
+                result.getReferencedTables().add((SimpleTableSegment) visit(each.columnForeignKeyConstraint().tableName()));
             }
         }
         return result;
@@ -150,7 +150,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
             }
         }
         if (null != ctx.tableForeignKeyConstraint()) {
-            result.setReferencedTable((TableSegment) visit(ctx.tableForeignKeyConstraint().tableName()));
+            result.setReferencedTable((SimpleTableSegment) visit(ctx.tableForeignKeyConstraint().tableName()));
         }
         return result;
     }
@@ -158,7 +158,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitAlterTable(final AlterTableContext ctx) {
-        AlterTableStatement result = new AlterTableStatement((TableSegment) visit(ctx.tableName()));
+        AlterTableStatement result = new AlterTableStatement((SimpleTableSegment) visit(ctx.tableName()));
         for (AlterDefinitionClauseContext alterDefinitionClauseContext : ctx.alterDefinitionClause()) {
             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(alterDefinitionClauseContext)).getValue()) {
                 if (each instanceof AddColumnDefinitionSegment) {
@@ -229,7 +229,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
     @Override
     public ASTNode visitDropTable(final DropTableContext ctx) {
         DropTableStatement result = new DropTableStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableNames())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
         return result;
     }
     
@@ -237,14 +237,14 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
     @Override
     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
         TruncateStatement result = new TruncateStatement();
-        result.getTables().add((TableSegment) visit(ctx.tableName()));
+        result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
         CreateIndexStatement result = new CreateIndexStatement();
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setIndex((IndexSegment) visit(ctx.indexName()));
         return result;
     }
@@ -255,7 +255,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
         if (null != ctx.indexName()) {
             result.setIndex((IndexSegment) visit(ctx.indexName()));
         }
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
     
@@ -263,7 +263,7 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
     public ASTNode visitDropIndex(final DropIndexContext ctx) {
         DropIndexStatement result = new DropIndexStatement();
         result.getIndexes().add((IndexSegment) visit(ctx.indexName()));
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         return result;
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDMLVisitor.java
index 388ffe1d76a..031986889ad 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDMLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/SQLServerDMLVisitor.java
@@ -75,7 +75,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -98,7 +98,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @Override
     public ASTNode visitInsert(final InsertContext ctx) {
         InsertStatement result = (InsertStatement) visit(ctx.insertValuesClause());
-        result.setTable((TableSegment) visit(ctx.tableName()));
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
@@ -130,7 +130,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.tableReferences())).getValue());
+        result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences())).getValue());
         result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -178,9 +178,9 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     public ASTNode visitDelete(final DeleteContext ctx) {
         DeleteStatement result = new DeleteStatement();
         if (null != ctx.multipleTablesClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.multipleTablesClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTablesClause())).getValue());
         } else {
-            result.getTables().add((TableSegment) visit(ctx.singleTableClause()));
+            result.getTables().add((SimpleTableSegment) visit(ctx.singleTableClause()));
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -191,7 +191,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        TableSegment result = (TableSegment) visit(ctx.tableName());
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
         if (null != ctx.alias()) {
             result.setAlias((AliasSegment) visit(ctx.alias()));
         }
@@ -201,17 +201,17 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        result.combine((CollectionValue<TableSegment>) visit(ctx.multipleTableNames()));
-        result.combine((CollectionValue<TableSegment>) visit(ctx.tableReferences()));
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.multipleTableNames()));
+        result.combine((CollectionValue<SimpleTableSegment>) visit(ctx.tableReferences()));
         return result;
     }
     
     @Override
     public ASTNode visitMultipleTableNames(final MultipleTableNamesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableNameContext each : ctx.tableName()) {
-            result.getValue().add((TableSegment) visit(each));
+            result.getValue().add((SimpleTableSegment) visit(each));
         }
         return result;
     }
@@ -239,7 +239,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
             result.getProjections().setDistinctRow(isDistinct(ctx));
         }
         if (null != ctx.fromClause()) {
-            result.getTables().addAll(((CollectionValue<TableSegment>) visit(ctx.fromClause())).getValue());
+            result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.fromClause())).getValue());
         }
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
@@ -254,9 +254,9 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     }
     
     @SuppressWarnings("unchecked")
-    private Collection<TableSegment> getTableSegments(final Collection<TableSegment> tableSegments, final JoinedTableContext joinedTable) {
-        Collection<TableSegment> result = new LinkedList<>();
-        for (TableSegment tableSegment : ((CollectionValue<TableSegment>) visit(joinedTable)).getValue()) {
+    private Collection<SimpleTableSegment> getTableSegments(final Collection<SimpleTableSegment> tableSegments, final JoinedTableContext joinedTable) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
+        for (SimpleTableSegment tableSegment : ((CollectionValue<SimpleTableSegment>) visit(joinedTable)).getValue()) {
             if (isTable(tableSegment, tableSegments)) {
                 result.add(tableSegment);
             }
@@ -264,8 +264,8 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
         return result;
     }
     
-    private boolean isTable(final TableSegment owner, final Collection<TableSegment> tableSegments) {
-        for (TableSegment each : tableSegments) {
+    private boolean isTable(final SimpleTableSegment owner, final Collection<SimpleTableSegment> tableSegments) {
+        for (SimpleTableSegment each : tableSegments) {
             if (owner.getTableName().getIdentifier().getValue().equals(each.getAlias().orElse(null))) {
                 return false;
             }
@@ -368,20 +368,20 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitTableReferences(final TableReferencesContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         for (TableReferenceContext each : ctx.tableReference()) {
-            result.combine((CollectionValue<TableSegment>) visit(each));
+            result.combine((CollectionValue<SimpleTableSegment>) visit(each));
         }
         return result;
     }
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null != ctx.tableFactor()) {
             ASTNode tableFactor = visit(ctx.tableFactor());
-            if (tableFactor instanceof TableSegment) {
-                result.getValue().add((TableSegment) tableFactor);
+            if (tableFactor instanceof SimpleTableSegment) {
+                result.getValue().add((SimpleTableSegment) tableFactor);
             }
         }
         if (null != ctx.joinedTable()) {
@@ -395,7 +395,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @Override
     public ASTNode visitTableFactor(final TableFactorContext ctx) {
         if (null != ctx.tableName()) {
-            TableSegment result = (TableSegment) visit(ctx.tableName());
+            SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
             if (null != ctx.alias()) {
                 result.setAlias((AliasSegment) visit(ctx.alias()));
             }
@@ -410,12 +410,12 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitJoinedTable(final JoinedTableContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
-        TableSegment tableSegment = (TableSegment) visit(ctx.tableFactor());
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
+        SimpleTableSegment tableSegment = (SimpleTableSegment) visit(ctx.tableFactor());
         result.getValue().add(tableSegment);
         if (null != ctx.joinSpecification()) {
-            Collection<TableSegment> tableSegments = new LinkedList<>();
-            for (TableSegment each : ((CollectionValue<TableSegment>) visit(ctx.joinSpecification())).getValue()) {
+            Collection<SimpleTableSegment> tableSegments = new LinkedList<>();
+            for (SimpleTableSegment each : ((CollectionValue<SimpleTableSegment>) visit(ctx.joinSpecification())).getValue()) {
                 if (isTable(each, Collections.singleton(tableSegment))) {
                     tableSegments.add(each);
                 }
@@ -427,7 +427,7 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
     
     @Override
     public ASTNode visitJoinSpecification(final JoinSpecificationContext ctx) {
-        CollectionValue<TableSegment> result = new CollectionValue<>();
+        CollectionValue<SimpleTableSegment> result = new CollectionValue<>();
         if (null == ctx.expr()) {
             return result;
         }
@@ -444,8 +444,8 @@ public final class SQLServerDMLVisitor extends SQLServerVisitor implements DMLVi
         return result;
     }
     
-    private TableSegment createTableSegment(final OwnerSegment ownerSegment) {
-        return new TableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
+    private SimpleTableSegment createTableSegment(final OwnerSegment ownerSegment) {
+        return new SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), ownerSegment.getIdentifier());
     }
     
     @Override


Test patch:
diff --git a/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/PreparedJudgementEngineTest.java b/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/PreparedJudgementEngineTest.java
index 46d3be5fee5..2f9ef1253b6 100644
--- a/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/PreparedJudgementEngineTest.java
+++ b/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/PreparedJudgementEngineTest.java
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.sql.parser.relation.metadata.RelationMetas;
 import org.apache.shardingsphere.sql.parser.relation.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumnsSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.junit.Assert;
@@ -44,7 +44,7 @@ public final class PreparedJudgementEngineTest {
         shadowRuleConfiguration.setColumn("shadow");
         ShadowRule shadowRule = new ShadowRule(shadowRuleConfiguration);
         InsertStatement insertStatement = new InsertStatement();
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         InsertColumnsSegment insertColumnsSegment = new InsertColumnsSegment(0, 0, 
                 Arrays.asList(new ColumnSegment(0, 0, new IdentifierValue("id")), new ColumnSegment(0, 0, new IdentifierValue("name")), new ColumnSegment(0, 0, new IdentifierValue("shadow"))));
         insertStatement.setInsertColumns(insertColumnsSegment);
diff --git a/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/SimpleJudgementEngineTest.java b/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/SimpleJudgementEngineTest.java
index 2980bab5c36..a5d5e66cb05 100644
--- a/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/SimpleJudgementEngineTest.java
+++ b/shadow-core/shadow-core-rewrite/src/test/java/org/apache/shardingsphere/shadow/rewrite/judgement/impl/SimpleJudgementEngineTest.java
@@ -33,7 +33,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredica
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
@@ -66,7 +66,7 @@ public final class SimpleJudgementEngineTest {
     @Test
     public void judgeForInsert() {
         InsertStatement insertStatement = new InsertStatement();
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         InsertColumnsSegment insertColumnsSegment = new InsertColumnsSegment(0, 0, 
                 Arrays.asList(new ColumnSegment(0, 0, new IdentifierValue("id")), new ColumnSegment(0, 0, new IdentifierValue("name")), new ColumnSegment(0, 0, new IdentifierValue("shadow"))));
         insertStatement.setInsertColumns(insertColumnsSegment);
diff --git a/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java b/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
index 52cd6bbf8ca..c1b67a62868 100644
--- a/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
+++ b/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.sql.parser.relation.statement.dml.InsertStateme
 import org.apache.shardingsphere.sql.parser.relation.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumnsSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.postgresql.ShowStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -69,7 +69,7 @@ public final class ShardingResultMergerEngineTest {
     public void assertNewInstanceWithOtherStatement() {
         InsertStatement insertStatement = new InsertStatement();
         InsertColumnsSegment insertColumnsSegment = new InsertColumnsSegment(0, 0, Collections.singletonList(new ColumnSegment(0, 0, new IdentifierValue("col"))));
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         insertStatement.setInsertColumns(insertColumnsSegment);
         SQLStatementContext sqlStatementContext = new InsertStatementContext(null, Collections.emptyList(), insertStatement);
         ShardingSphereProperties properties = new ShardingSphereProperties(new Properties());
diff --git a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/keygen/GeneratedKeyTest.java b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/keygen/GeneratedKeyTest.java
index 342d4161962..bd201f38814 100644
--- a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/keygen/GeneratedKeyTest.java
+++ b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/keygen/GeneratedKeyTest.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumns
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.complex.CommonExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.LiteralExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.underlying.common.metadata.table.TableMetas;
@@ -56,7 +56,7 @@ public final class GeneratedKeyTest {
     
     @Before
     public void setUp() {
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         insertStatement.setInsertColumns(new InsertColumnsSegment(0, 0, Collections.singletonList(new ColumnSegment(0, 0, new IdentifierValue("id")))));
     }
     
diff --git a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
index 8508bf672bc..a3a7f3c1cc6 100644
--- a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
+++ b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
@@ -30,7 +30,7 @@ import org.apache.shardingsphere.sharding.route.engine.type.unicast.ShardingUnic
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.SQLStatementContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.dcl.GrantStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dal.SetStatement;
@@ -142,7 +142,7 @@ public final class ShardingRouteEngineFactoryTest {
     @Test
     public void assertNewInstanceForDCLForSingleTable() {
         GrantStatement grantStatement = new GrantStatement();
-        grantStatement.getTables().add(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        grantStatement.getTables().add(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         GrantStatementContext sqlStatementContext = new GrantStatementContext(grantStatement);
         ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, shardingSphereMetaData, sqlStatementContext, shardingConditions, properties);
         assertThat(actual, instanceOf(ShardingTableBroadcastRoutingEngine.class));
diff --git a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingInsertStatementValidatorTest.java b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingInsertStatementValidatorTest.java
index 4963854700d..419e9f7d9aa 100644
--- a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingInsertStatementValidatorTest.java
+++ b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingInsertStatementValidatorTest.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.assignment.Assignmen
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.OnDuplicateKeyColumnsSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.underlying.common.exception.ShardingSphereException;
@@ -55,7 +55,7 @@ public final class ShardingInsertStatementValidatorTest {
     
     private InsertStatement createInsertStatement() {
         InsertStatement result = new InsertStatement();
-        result.setTable(new TableSegment(0, 0, new IdentifierValue("user")));
+        result.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("user")));
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("id"));
         AssignmentSegment assignmentSegment = new AssignmentSegment(0, 0, columnSegment, new ParameterMarkerExpressionSegment(0, 0, 1));
         result.setOnDuplicateKeyColumns(new OnDuplicateKeyColumnsSegment(0, 0, Collections.singletonList(assignmentSegment)));
diff --git a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
index b9af0935e21..3e1a3614b5c 100644
--- a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
+++ b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
@@ -27,7 +27,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredica
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.UpdateStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.underlying.common.exception.ShardingSphereException;
@@ -84,7 +84,7 @@ public final class ShardingUpdateStatementValidatorTest {
     
     private UpdateStatement createUpdateStatement() {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().add(new TableSegment(0, 0, new IdentifierValue("user")));
+        result.getTables().add(new SimpleTableSegment(0, 0, new IdentifierValue("user")));
         result.setSetAssignment(
                 new SetAssignmentSegment(0, 0, Collections.singletonList(new AssignmentSegment(0, 0, new ColumnSegment(0, 0, new IdentifierValue("id")), new LiteralExpressionSegment(0, 0, "")))));
         return result;
@@ -92,7 +92,7 @@ public final class ShardingUpdateStatementValidatorTest {
     
     private UpdateStatement createUpdateStatementAndParameters(final Object shardingColumnParameter) {
         UpdateStatement result = new UpdateStatement();
-        result.getTables().add(new TableSegment(0, 0, new IdentifierValue("user")));
+        result.getTables().add(new SimpleTableSegment(0, 0, new IdentifierValue("user")));
         Collection<AssignmentSegment> assignments = Collections.singletonList(
                 new AssignmentSegment(0, 0, new ColumnSegment(0, 0, new IdentifierValue("id")), new LiteralExpressionSegment(0, 0, shardingColumnParameter)));
         SetAssignmentSegment setAssignmentSegment = new SetAssignmentSegment(0, 0, assignments);
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/TruncateStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/TruncateStatement.java
index a77ff3bcafd..4474f278546 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/TruncateStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/ddl/TruncateStatement.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
 
 import lombok.Getter;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,5 +29,5 @@ import java.util.LinkedList;
 @Getter
 public final class TruncateStatement extends DDLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/DeleteStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/DeleteStatement.java
index 3c05a6cc5a1..c3baa48cfc6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/DeleteStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/DeleteStatement.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.statement.dml;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -33,7 +33,7 @@ import java.util.Optional;
 @Setter
 public final class DeleteStatement extends DMLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
     
     private WhereSegment where;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/UpdateStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/UpdateStatement.java
index 5608832ada8..eea26a650e6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/UpdateStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/UpdateStatement.java
@@ -21,7 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.assignment.SetAssignmentSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -34,7 +34,7 @@ import java.util.Optional;
 @Setter
 public final class UpdateStatement extends DMLStatement {
     
-    private final Collection<TableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
     
     private SetAssignmentSegment setAssignment;
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegmentTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/SimpleTableSegmentTest.java
similarity index 80%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegmentTest.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/SimpleTableSegmentTest.java
index 25a3a033a04..fd7c76dd8eb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/TableSegmentTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/sql/segment/generic/SimpleTableSegmentTest.java
@@ -17,23 +17,24 @@
 
 package org.apache.shardingsphere.sql.parser.sql.segment.generic;
 
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-public final class TableSegmentTest {
+public final class SimpleTableSegmentTest {
     
     @Test
     public void getStartIndexWithoutOwner() {
-        TableSegment tableSegment = new TableSegment(10, 13, new IdentifierValue("tbl"));
+        SimpleTableSegment tableSegment = new SimpleTableSegment(10, 13, new IdentifierValue("tbl"));
         assertThat(tableSegment.getStartIndex(), is(10));
     }
     
     @Test
     public void getStartIndexWithOwner() {
-        TableSegment tableSegment = new TableSegment(10, 13, new IdentifierValue("tbl"));
+        SimpleTableSegment tableSegment = new SimpleTableSegment(10, 13, new IdentifierValue("tbl"));
         tableSegment.setOwner(new OwnerSegment(7, 8, new IdentifierValue("o")));
         assertThat(tableSegment.getStartIndex(), is(7));
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/TruncateStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/TruncateStatementContext.java
index bdea907c4ef..72b51282d4b 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/TruncateStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/ddl/TruncateStatementContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.sql.parser.relation.statement.ddl;
 import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.relation.segment.table.TablesContext;
 import org.apache.shardingsphere.sql.parser.relation.statement.CommonSQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.ddl.TruncateStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.TableAvailable;
 
@@ -40,7 +40,7 @@ public final class TruncateStatementContext extends CommonSQLStatementContext<Tr
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
+    public Collection<SimpleTableSegment> getAllTables() {
         return getSqlStatement().getTables();
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/DeleteStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/DeleteStatementContext.java
index d36c208c1a9..4edad2f5917 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/DeleteStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/DeleteStatementContext.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.sql.parser.sql.predicate.PredicateExtractor;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.WhereAvailable;
 
@@ -49,16 +49,16 @@ public final class DeleteStatementContext extends CommonSQLStatementContext<Dele
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
-        Collection<TableSegment> result = new LinkedList<>(getSqlStatement().getTables());
+    public Collection<SimpleTableSegment> getAllTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>(getSqlStatement().getTables());
         if (getSqlStatement().getWhere().isPresent()) {
             result.addAll(getAllTablesFromWhere(getSqlStatement().getWhere().get()));
         }
         return result;
     }
     
-    private Collection<TableSegment> getAllTablesFromWhere(final WhereSegment where) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getAllTablesFromWhere(final WhereSegment where) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (AndPredicate each : where.getAndPredicates()) {
             for (PredicateSegment predicate : each.getPredicates()) {
                 result.addAll(new PredicateExtractor(getSqlStatement().getTables(), predicate).extractTables());
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/UpdateStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/UpdateStatementContext.java
index 5dab68e49a7..cf783d14a2c 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/UpdateStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/main/java/org/apache/shardingsphere/sql/parser/relation/statement/dml/UpdateStatementContext.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.sql.parser.sql.predicate.PredicateExtractor;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.UpdateStatement;
 import org.apache.shardingsphere.sql.parser.relation.type.WhereAvailable;
 
@@ -49,16 +49,16 @@ public final class UpdateStatementContext extends CommonSQLStatementContext<Upda
     }
     
     @Override
-    public Collection<TableSegment> getAllTables() {
-        Collection<TableSegment> result = new LinkedList<>(getSqlStatement().getTables());
+    public Collection<SimpleTableSegment> getAllTables() {
+        Collection<SimpleTableSegment> result = new LinkedList<>(getSqlStatement().getTables());
         if (getSqlStatement().getWhere().isPresent()) {
             result.addAll(getAllTablesFromWhere(getSqlStatement().getWhere().get()));
         }
         return result;
     }
     
-    private Collection<TableSegment> getAllTablesFromWhere(final WhereSegment where) {
-        Collection<TableSegment> result = new LinkedList<>();
+    private Collection<SimpleTableSegment> getAllTablesFromWhere(final WhereSegment where) {
+        Collection<SimpleTableSegment> result = new LinkedList<>();
         for (AndPredicate each : where.getAndPredicates()) {
             for (PredicateSegment predicate : each.getPredicates()) {
                 result.addAll(new PredicateExtractor(getSqlStatement().getTables(), predicate).extractTables());
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngineTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngineTest.java
index 445cb90ab47..cba5858ff04 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngineTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/select/projection/engine/ProjectionsContextEngineTest.java
@@ -32,7 +32,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrd
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ExpressionOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.junit.Before;
@@ -111,7 +111,7 @@ public final class ProjectionsContextEngineTest {
     public void assertCreateProjectionsContextWhenColumnOrderByItemSegmentOwnerAbsent() {
         ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
         SelectStatement selectStatement = new SelectStatement();
-        selectStatement.getTables().addAll(Collections.singletonList(new TableSegment(0, 0, new IdentifierValue("name"))));
+        selectStatement.getTables().addAll(Collections.singletonList(new SimpleTableSegment(0, 0, new IdentifierValue("name"))));
         selectStatement.setProjections(projectionsSegment);
         ShorthandProjectionSegment shorthandProjectionSegment = new ShorthandProjectionSegment(0, 10, "text");
         OwnerSegment owner = new OwnerSegment(0, 10, new IdentifierValue("name"));
@@ -128,7 +128,7 @@ public final class ProjectionsContextEngineTest {
     public void assertCreateProjectionsContextWhenColumnOrderByItemSegmentOwnerPresent() {
         ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
         SelectStatement selectStatement = new SelectStatement();
-        selectStatement.getTables().addAll(Collections.singletonList(new TableSegment(0, 0, new IdentifierValue("name"))));
+        selectStatement.getTables().addAll(Collections.singletonList(new SimpleTableSegment(0, 0, new IdentifierValue("name"))));
         selectStatement.setProjections(projectionsSegment);
         ShorthandProjectionSegment shorthandProjectionSegment = new ShorthandProjectionSegment(0, 10, "text");
         OwnerSegment owner = new OwnerSegment(0, 10, new IdentifierValue("name"));
@@ -144,13 +144,13 @@ public final class ProjectionsContextEngineTest {
     @Test
     public void assertCreateProjectionsContextWhenColumnOrderByItemSegmentOwnerPresentAndTablePresent() {
         SelectStatement selectStatement = new SelectStatement();
-        TableSegment tableSegment = new TableSegment(0, 10, new IdentifierValue("name"));
+        SimpleTableSegment tableSegment = new SimpleTableSegment(0, 10, new IdentifierValue("name"));
         tableSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("schema")));
         selectStatement.getTables().addAll(Collections.singletonList(tableSegment));
         ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
         selectStatement.setProjections(projectionsSegment);
         ShorthandProjectionSegment shorthandProjectionSegment = new ShorthandProjectionSegment(0, 10, "text");
-        TableSegment table = new TableSegment(0, 10, new IdentifierValue("name"));
+        SimpleTableSegment table = new SimpleTableSegment(0, 10, new IdentifierValue("name"));
         OwnerSegment owner = new OwnerSegment(0, 10, new IdentifierValue("name"));
         table.setOwner(new OwnerSegment(0, 10, new IdentifierValue("name")));
         shorthandProjectionSegment.setOwner(owner);
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContextTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContextTest.java
index 6d7db8e1a59..0d1ffb9d8eb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContextTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/segment/table/TablesContextTest.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateS
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.junit.Test;
 
@@ -50,14 +50,14 @@ public final class TablesContextTest {
     
     @Test
     public void assertInstanceCreatedWhenNoExceptionThrown() {
-        TableSegment tableSegment = new TableSegment(0, 10, new IdentifierValue("tbl"));
+        SimpleTableSegment tableSegment = new SimpleTableSegment(0, 10, new IdentifierValue("tbl"));
         tableSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("schema")));
         new TablesContext(Collections.singletonList(tableSegment));
     }
     
     @Test
     public void assertFindTableNameWhenSingleTable() {
-        TableSegment tableSegment = createTableSegment("table_1", "tbl_1");
+        SimpleTableSegment tableSegment = createTableSegment("table_1", "tbl_1");
         PredicateSegment predicateSegment = createPredicateSegment(createColumnSegment());
         Optional<String> actual = new TablesContext(Collections.singletonList(tableSegment)).findTableName(predicateSegment, mock(RelationMetas.class));
         assertTrue(actual.isPresent());
@@ -66,8 +66,8 @@ public final class TablesContextTest {
     
     @Test
     public void assertFindTableNameWhenColumnSegmentOwnerPresent() {
-        TableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
-        TableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
+        SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
+        SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
         ColumnSegment columnSegment = createColumnSegment();
         columnSegment.setOwner(new OwnerSegment(0, 10, new IdentifierValue("table_1")));
         PredicateSegment predicateSegment = createPredicateSegment(columnSegment);
@@ -78,8 +78,8 @@ public final class TablesContextTest {
     
     @Test
     public void assertFindTableNameWhenColumnSegmentOwnerAbsent() {
-        TableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
-        TableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
+        SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
+        SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
         PredicateSegment predicateSegment = createPredicateSegment(createColumnSegment());
         Optional<String> actual = new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).findTableName(predicateSegment, mock(RelationMetas.class));
         assertFalse(actual.isPresent());
@@ -87,8 +87,8 @@ public final class TablesContextTest {
     
     @Test
     public void assertFindTableNameWhenColumnSegmentOwnerAbsentAndRelationMetasContainsColumn() {
-        TableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
-        TableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
+        SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1");
+        SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2");
         PredicateSegment predicateSegment = createPredicateSegment(createColumnSegment());
         RelationMetas relationMetas = mock(RelationMetas.class);
         when(relationMetas.containsColumn(anyString(), anyString())).thenReturn(true);
@@ -97,8 +97,8 @@ public final class TablesContextTest {
         assertThat(actual.get(), is("table_1"));
     }
     
-    private TableSegment createTableSegment(final String tableName, final String alias) {
-        TableSegment result = new TableSegment(0, 0, new IdentifierValue(tableName));
+    private SimpleTableSegment createTableSegment(final String tableName, final String alias) {
+        SimpleTableSegment result = new SimpleTableSegment(0, 0, new IdentifierValue(tableName));
         AliasSegment aliasSegment = new AliasSegment(0, 0, new IdentifierValue(alias));
         result.setAlias(aliasSegment);
         return result;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/SQLStatementContextFactoryTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/SQLStatementContextFactoryTest.java
index e4683a5c551..8e70fb92099 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/SQLStatementContextFactoryTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/SQLStatementContextFactoryTest.java
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.assignment.SetAssign
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionsSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.LimitSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
@@ -56,7 +56,7 @@ public final class SQLStatementContextFactoryTest {
         InsertStatement insertStatement = new InsertStatement();
         insertStatement.setSetAssignment(new SetAssignmentSegment(0, 0,
                 Collections.singleton(new AssignmentSegment(0, 0, new ColumnSegment(0, 0, new IdentifierValue("IdentifierValue")), null))));
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         SQLStatementContext sqlStatementContext = SQLStatementContextFactory.newInstance(null, null, null, insertStatement);
         assertNotNull(sqlStatementContext);
         assertTrue(sqlStatementContext instanceof InsertStatementContext);
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/impl/InsertStatementContextTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/impl/InsertStatementContextTest.java
index f902634e304..c4218ebc5eb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/impl/InsertStatementContextTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-relation/src/test/java/org/apache/shardingsphere/sql/parser/relation/statement/impl/InsertStatementContextTest.java
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumns
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.LiteralExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement;
 import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue;
 import org.junit.Test;
@@ -42,7 +42,7 @@ public final class InsertStatementContextTest {
     @Test
     public void assertInsertStatementContextWithColumnNames() {
         InsertStatement insertStatement = new InsertStatement();
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         InsertColumnsSegment insertColumnsSegment = new InsertColumnsSegment(0, 0, Arrays.asList(
                 new ColumnSegment(0, 0, new IdentifierValue("id")), new ColumnSegment(0, 0, new IdentifierValue("name")), new ColumnSegment(0, 0, new IdentifierValue("status"))));
         insertStatement.setInsertColumns(insertColumnsSegment);
@@ -56,7 +56,7 @@ public final class InsertStatementContextTest {
         RelationMetas relationMetas = mock(RelationMetas.class);
         when(relationMetas.getAllColumnNames("tbl")).thenReturn(Arrays.asList("id", "name", "status"));
         InsertStatement insertStatement = new InsertStatement();
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         setUpInsertValues(insertStatement);
         InsertStatementContext actual = new InsertStatementContext(relationMetas, Arrays.<Object>asList(1, "Tom", 2, "Jerry"), insertStatement);
         assertInsertStatementContext(actual);
@@ -67,7 +67,7 @@ public final class InsertStatementContextTest {
         RelationMetas relationMetas = mock(RelationMetas.class);
         when(relationMetas.getAllColumnNames("tbl")).thenReturn(Arrays.asList("id", "name", "status"));
         InsertStatement insertStatement = new InsertStatement();
-        insertStatement.setTable(new TableSegment(0, 0, new IdentifierValue("tbl")));
+        insertStatement.setTable(new SimpleTableSegment(0, 0, new IdentifierValue("tbl")));
         setUpInsertValues(insertStatement);
         InsertStatementContext actual = new InsertStatementContext(relationMetas, Arrays.<Object>asList(1, "Tom", 2, "Jerry"), insertStatement);
         assertThat(actual.getGroupedParameters().size(), is(2));
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/column/ColumnAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/column/ColumnAssert.java
index f1574dd7a3c..4b035540df3 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/column/ColumnAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/column/ColumnAssert.java
@@ -25,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.table.Tabl
 import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.column.ExpectedColumn;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
@@ -51,7 +51,7 @@ public final class ColumnAssert {
             assertTrue(assertContext.getText("Actual owner should exist."), actual.getOwner().isPresent());
             // TODO OwnerAssert is needed.
             OwnerSegment owner = actual.getOwner().get();
-            TableAssert.assertOwner(assertContext, new TableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
+            TableAssert.assertOwner(assertContext, new SimpleTableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
         } else {
             assertFalse(assertContext.getText("Actual owner should not exist."), actual.getOwner().isPresent());
         }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/orderby/OrderByItemAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/orderby/OrderByItemAssert.java
index 9bc6efb0ae6..45a2c8ca09a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/orderby/OrderByItemAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/orderby/OrderByItemAssert.java
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.Expressio
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.OrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 
@@ -96,7 +96,7 @@ public final class OrderByItemAssert {
             assertTrue(assertContext.getText("Actual owner should exist."), actual.getColumn().getOwner().isPresent());
             // TODO OwnerAssert is needed.
             OwnerSegment owner = actual.getColumn().getOwner().get();
-            TableAssert.assertOwner(assertContext, new TableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
+            TableAssert.assertOwner(assertContext, new SimpleTableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
         } else {
             assertFalse(assertContext.getText("Actual owner should not exist."), actual.getColumn().getOwner().isPresent());
         }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/projection/ProjectionAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/projection/ProjectionAssert.java
index 292c17f09d1..c8ed502c675 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/projection/ProjectionAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/projection/ProjectionAssert.java
@@ -41,7 +41,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.rownum.Nu
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.top.TopProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.List;
 
@@ -104,7 +104,7 @@ public final class ProjectionAssert {
         if (null != expected.getOwner()) {
             assertTrue(assertContext.getText("Actual owner should exist."), actual.getOwner().isPresent());
             OwnerSegment owner = actual.getOwner().get();
-            TableAssert.assertOwner(assertContext, new TableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
+            TableAssert.assertOwner(assertContext, new SimpleTableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
         } else {
             assertFalse(assertContext.getText("Actual owner should not exist."), actual.getOwner().isPresent());
         }
@@ -121,7 +121,7 @@ public final class ProjectionAssert {
             assertTrue(assertContext.getText("Actual owner should exist."), actual.getColumn().getOwner().isPresent());
             // TODO OwnerAssert is needed.
             OwnerSegment owner = actual.getColumn().getOwner().get();
-            TableAssert.assertOwner(assertContext, new TableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
+            TableAssert.assertOwner(assertContext, new SimpleTableSegment(owner.getStartIndex(), owner.getStopIndex(), owner.getIdentifier()), expected.getOwner());
         } else {
             assertFalse(assertContext.getText("Actual owner should not exist."), actual.getColumn().getOwner().isPresent());
         }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/table/TableAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/table/TableAssert.java
index 92be6fc4051..22aefc68659 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/table/TableAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/asserts/segment/table/TableAssert.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.t
 import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedTableOwner;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.SchemaSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
 import java.util.List;
@@ -49,10 +49,10 @@ public final class TableAssert {
      * @param actual actual tables
      * @param expected expected tables
      */
-    public static void assertIs(final SQLCaseAssertContext assertContext, final Collection<TableSegment> actual, final List<ExpectedTable> expected) {
+    public static void assertIs(final SQLCaseAssertContext assertContext, final Collection<SimpleTableSegment> actual, final List<ExpectedTable> expected) {
         assertThat(assertContext.getText("Tables size assertion error: "), actual.size(), is(expected.size()));
         int count = 0;
-        for (TableSegment each : actual) {
+        for (SimpleTableSegment each : actual) {
             assertIs(assertContext, each, expected.get(count));
             count++;
         }
@@ -65,7 +65,7 @@ public final class TableAssert {
      * @param actual actual table
      * @param expected expected table
      */
-    public static void assertIs(final SQLCaseAssertContext assertContext, final TableSegment actual, final ExpectedTable expected) {
+    public static void assertIs(final SQLCaseAssertContext assertContext, final SimpleTableSegment actual, final ExpectedTable expected) {
         assertThat(assertContext.getText("Table name assertion error: "), actual.getTableName().getIdentifier().getValue(), is(expected.getName()));
         assertThat(assertContext.getText("Table alias assertion error: "), actual.getAlias().orElse(null), is(expected.getAlias()));
         if (null != expected.getOwner()) {
@@ -88,7 +88,7 @@ public final class TableAssert {
      * @param actual actual table segment
      * @param expected expected table owner
      */
-    public static void assertOwner(final SQLCaseAssertContext assertContext, final TableSegment actual, final ExpectedTableOwner expected) {
+    public static void assertOwner(final SQLCaseAssertContext assertContext, final SimpleTableSegment actual, final ExpectedTableOwner expected) {
         assertThat(assertContext.getText("Owner name assertion error: "), actual.getTableName().getIdentifier().getValue(), is(expected.getName()));
         assertThat(assertContext.getText("Owner name start delimiter assertion error: "), 
                 actual.getTableName().getIdentifier().getQuoteCharacter().getStartDelimiter(), is(expected.getStartDelimiter()));