This is an automated email from the ASF dual-hosted git repository.

tuichenchuxin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new ea1a48b9a50 Refactor bounded column and bounded table info in 
ColumnSegment and TableNameSegment (#28205)
ea1a48b9a50 is described below

commit ea1a48b9a507d807134bf5d8bec79e13672dd6de
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Aug 21 18:07:30 2023 +0800

    Refactor bounded column and bounded table info in ColumnSegment and 
TableNameSegment (#28205)
---
 .../EncryptPredicateColumnTokenGenerator.java      |   4 +-
 .../generator/EncryptProjectionTokenGenerator.java |   4 +-
 .../EncryptProjectionTokenGeneratorTest.java       |  10 +-
 .../fixture/EncryptGeneratorFixtureBuilder.java    |   9 +-
 .../select/projection/engine/ProjectionEngine.java |   4 +-
 .../expression/impl/ColumnSegmentBinder.java       |  14 ++-
 .../from/impl/SimpleTableSegmentBinder.java        |  11 +--
 .../from/impl/SubqueryTableSegmentBinder.java      |   8 +-
 .../from/impl/JoinTableSegmentBinderTest.java      | 108 ++++++++++-----------
 .../from/impl/SimpleTableSegmentBinderTest.java    |  42 ++++----
 .../common/segment/dml/column/ColumnSegment.java   |  16 +--
 .../ColumnSegmentBoundedInfo.java}                 |  24 ++---
 .../TableSegmentBoundedInfo.java}                  |  19 +---
 .../segment/generic/table/TableNameSegment.java    |   5 +-
 14 files changed, 142 insertions(+), 136 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
index db91e18f35e..eda1c1cc2a0 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
@@ -127,8 +127,8 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
     }
     
     private EncryptAlgorithm<?, ?> getColumnEncryptor(final ColumnSegment 
columnSegment) {
-        String tableName = columnSegment.getOriginalTable().getValue();
-        String columnName = columnSegment.getOriginalColumn().getValue();
+        String tableName = 
columnSegment.getColumnBoundedInfo().getOriginalTable().getValue();
+        String columnName = 
columnSegment.getColumnBoundedInfo().getOriginalColumn().getValue();
         if (!encryptRule.findEncryptTable(tableName).isPresent() || 
!encryptRule.getEncryptTable(tableName).isEncryptColumn(columnName)) {
             return null;
         }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index a9498f4c1fe..e4130989c71 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -111,8 +111,8 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
     private ColumnProjection buildColumnProjection(final 
ColumnProjectionSegment segment) {
         IdentifierValue owner = 
segment.getColumn().getOwner().map(OwnerSegment::getIdentifier).orElse(null);
         ColumnProjection result = new ColumnProjection(owner, 
segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ? 
segment.getAlias().orElse(null) : null, databaseType);
-        result.setOriginalColumn(segment.getColumn().getOriginalColumn());
-        result.setOriginalTable(segment.getColumn().getOriginalTable());
+        
result.setOriginalColumn(segment.getColumn().getColumnBoundedInfo().getOriginalColumn());
+        
result.setOriginalTable(segment.getColumn().getColumnBoundedInfo().getOriginalTable());
         return result;
     }
     
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
index b1f0893683e..712e5fffcee 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
 import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.generic.UnsupportedSQLOperationException;
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
@@ -33,6 +34,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -82,8 +84,8 @@ class EncryptProjectionTokenGeneratorTest {
         SimpleTableSegment doctorTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("doctor")));
         doctorTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
         ColumnSegment column = new ColumnSegment(0, 0, new 
IdentifierValue("mobile"));
-        column.setOriginalColumn(new IdentifierValue("mobile"));
-        column.setOriginalTable(new IdentifierValue("doctor"));
+        column.setColumnBoundedInfo(new ColumnSegmentBoundedInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new IdentifierValue("doctor"),
+                new IdentifierValue("mobile")));
         column.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a")));
         ProjectionsSegment projections = mock(ProjectionsSegment.class);
         
when(projections.getProjections()).thenReturn(Collections.singletonList(new 
ColumnProjectionSegment(column)));
@@ -104,8 +106,8 @@ class EncryptProjectionTokenGeneratorTest {
         SimpleTableSegment doctorTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("doctor")));
         doctorTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
         ColumnSegment column = new ColumnSegment(0, 0, new 
IdentifierValue("mobile"));
-        column.setOriginalColumn(new IdentifierValue("mobile"));
-        column.setOriginalTable(new IdentifierValue("doctor"));
+        column.setColumnBoundedInfo(new ColumnSegmentBoundedInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new IdentifierValue("doctor"),
+                new IdentifierValue("mobile")));
         column.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a")));
         ProjectionsSegment projections = mock(ProjectionsSegment.class);
         
when(projections.getProjections()).thenReturn(Collections.singletonList(new 
ColumnProjectionSegment(column)));
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
index feadcd3acfe..22339c8b13b 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
@@ -49,6 +49,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
@@ -177,11 +178,11 @@ public final class EncryptGeneratorFixtureBuilder {
      */
     public static SQLStatementContext createSelectStatementContext() {
         ColumnSegment leftColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_name"));
-        leftColumn.setOriginalColumn(new IdentifierValue("user_name"));
-        leftColumn.setOriginalTable(new IdentifierValue("t_user"));
+        leftColumn.setColumnBoundedInfo(new ColumnSegmentBoundedInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new IdentifierValue("t_user"),
+                new IdentifierValue("user_name")));
         ColumnSegment rightColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_id"));
-        rightColumn.setOriginalColumn(new IdentifierValue("user_id"));
-        rightColumn.setOriginalTable(new IdentifierValue("t_user"));
+        rightColumn.setColumnBoundedInfo(new ColumnSegmentBoundedInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new IdentifierValue("t_user"),
+                new IdentifierValue("user_id")));
         SelectStatementContext result = mock(SelectStatementContext.class);
         when(result.getJoinConditions()).thenReturn(Collections.singleton(new 
BinaryOperationExpression(0, 0, leftColumn, rightColumn, "=", "")));
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
index 472f7f60ba4..20460a05229 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
@@ -111,8 +111,8 @@ public final class ProjectionEngine {
         IdentifierValue owner = 
projectionSegment.getColumn().getOwner().isPresent() ? 
projectionSegment.getColumn().getOwner().get().getIdentifier() : null;
         IdentifierValue alias = projectionSegment.getAliasName().isPresent() ? 
projectionSegment.getAlias().orElse(null) : null;
         ColumnProjection result = new ColumnProjection(owner, 
projectionSegment.getColumn().getIdentifier(), alias, databaseType);
-        
result.setOriginalColumn(projectionSegment.getColumn().getOriginalColumn());
-        
result.setOriginalTable(projectionSegment.getColumn().getOriginalTable());
+        
result.setOriginalColumn(projectionSegment.getColumn().getColumnBoundedInfo().getOriginalColumn());
+        
result.setOriginalTable(projectionSegment.getColumn().getColumnBoundedInfo().getOriginalTable());
         return result;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
index c5231edac8d..bac14132113 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
@@ -27,6 +27,8 @@ import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePrecondition
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -61,10 +63,14 @@ public final class ColumnSegmentBinder {
         segment.getOwner().ifPresent(result::setOwner);
         Collection<TableSegmentBinderContext> tableBinderContextValues = 
getTableSegmentBinderContexts(segment, statementBinderContext, 
tableBinderContexts, outerTableBinderContexts);
         Optional<ColumnSegment> inputColumnSegment = 
findInputColumnSegment(segment.getIdentifier().getValue(), 
tableBinderContextValues);
-        inputColumnSegment.ifPresent(optional -> 
result.setOriginalDatabase(optional.getOriginalDatabase()));
-        inputColumnSegment.ifPresent(optional -> 
result.setOriginalSchema(optional.getOriginalSchema()));
-        result.setOriginalTable(null == segment.getOriginalTable() ? 
inputColumnSegment.map(ColumnSegment::getOriginalTable).orElse(null) : 
segment.getOriginalTable());
-        result.setOriginalColumn(null == segment.getOriginalColumn() ? 
segment.getIdentifier() : segment.getOriginalColumn());
+        IdentifierValue originalDatabase = inputColumnSegment.map(optional -> 
optional.getColumnBoundedInfo().getOriginalDatabase()).orElse(null);
+        IdentifierValue originalSchema = inputColumnSegment.map(optional -> 
optional.getColumnBoundedInfo().getOriginalSchema()).orElse(null);
+        IdentifierValue originalTable = null == 
segment.getColumnBoundedInfo().getOriginalTable() ? 
inputColumnSegment.map(optional -> 
optional.getColumnBoundedInfo().getOriginalTable()).orElse(null)
+                : segment.getColumnBoundedInfo().getOriginalTable();
+        IdentifierValue originalColumn =
+                null == segment.getColumnBoundedInfo().getOriginalColumn() ? 
inputColumnSegment.map(optional -> 
optional.getColumnBoundedInfo().getOriginalColumn()).orElse(null)
+                        : segment.getColumnBoundedInfo().getOriginalColumn();
+        result.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(originalDatabase, originalSchema, originalTable, 
originalColumn));
         return result;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
index dc82e714093..2216a39d1d2 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
@@ -33,6 +33,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.TableSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -77,8 +79,7 @@ public final class SimpleTableSegmentBinder {
         tableBinderContexts.put(segment.getAliasName().orElseGet(() -> 
segment.getTableName().getIdentifier().getValue()),
                 createSimpleTableBinderContext(segment, schema, 
originalDatabase, originalSchema, statementBinderContext.getDatabaseType()));
         TableNameSegment tableNameSegment = new 
TableNameSegment(segment.getTableName().getStartIndex(), 
segment.getTableName().getStopIndex(), segment.getTableName().getIdentifier());
-        tableNameSegment.setOriginalDatabase(originalDatabase);
-        tableNameSegment.setOriginalSchema(originalSchema);
+        tableNameSegment.setTableBoundedInfo(new 
TableSegmentBoundedInfo(originalDatabase, originalSchema));
         SimpleTableSegment result = new SimpleTableSegment(tableNameSegment);
         segment.getOwner().ifPresent(result::setOwner);
         segment.getAliasSegment().ifPresent(result::setAlias);
@@ -113,10 +114,8 @@ public final class SimpleTableSegmentBinder {
         for (ShardingSphereColumn each : columnNames) {
             ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue(each.getName(), dialectDatabaseMetaData.getQuoteCharacter()));
             columnSegment.setOwner(new OwnerSegment(0, 0, 
segment.getAlias().orElse(segment.getTableName().getIdentifier())));
-            columnSegment.setOriginalDatabase(originalDatabase);
-            columnSegment.setOriginalSchema(originalSchema);
-            
columnSegment.setOriginalTable(segment.getTableName().getIdentifier());
-            columnSegment.setOriginalColumn(new 
IdentifierValue(each.getName(), dialectDatabaseMetaData.getQuoteCharacter()));
+            columnSegment.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(originalDatabase, originalSchema, 
segment.getTableName().getIdentifier(),
+                    new IdentifierValue(each.getName(), 
dialectDatabaseMetaData.getQuoteCharacter())));
             ColumnProjectionSegment columnProjectionSegment = new 
ColumnProjectionSegment(columnSegment);
             columnProjectionSegment.setVisible(each.isVisible());
             projectionSegments.add(columnProjectionSegment);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
index 96486d7ae9a..d1ecb081295 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -83,10 +84,9 @@ public final class SubqueryTableSegmentBinder {
         if (!Strings.isNullOrEmpty(subqueryTableName.getValue())) {
             newColumnSegment.setOwner(new OwnerSegment(0, 0, 
subqueryTableName));
         }
-        
newColumnSegment.setOriginalColumn(originalColumn.getColumn().getOriginalColumn());
-        
newColumnSegment.setOriginalTable(originalColumn.getColumn().getOriginalTable());
-        
newColumnSegment.setOriginalSchema(originalColumn.getColumn().getOriginalSchema());
-        
newColumnSegment.setOriginalDatabase(originalColumn.getColumn().getOriginalDatabase());
+        newColumnSegment.setColumnBoundedInfo(
+                new 
ColumnSegmentBoundedInfo(originalColumn.getColumn().getColumnBoundedInfo().getOriginalDatabase(),
 originalColumn.getColumn().getColumnBoundedInfo().getOriginalSchema(),
+                        
originalColumn.getColumn().getColumnBoundedInfo().getOriginalTable(), 
originalColumn.getColumn().getColumnBoundedInfo().getOriginalColumn()));
         ColumnProjectionSegment result = new 
ColumnProjectionSegment(newColumnSegment);
         result.setVisible(originalColumn.isVisible());
         return result;
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinderTest.java
index cdd65583524..15b4b59478a 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinderTest.java
@@ -68,11 +68,11 @@ class JoinTableSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getLeft() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(actual.getRight() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         
assertJoinTableProjectionSegments(actual.getJoinTableProjectionSegments());
         assertTrue(tableBinderContexts.containsKey("o"));
         assertTrue(tableBinderContexts.containsKey("i"));
@@ -82,20 +82,20 @@ class JoinTableSegmentBinderTest {
         List<ProjectionSegment> actual = new 
ArrayList<>(joinTableProjectionSegments);
         assertThat(actual.size(), is(7));
         assertTrue(actual.get(0) instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalColumn().getValue(), is("order_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalColumn().getValue(), is("user_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalColumn().getValue(), is("status"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalColumn().getValue(), is("item_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getOriginalColumn().getValue(), is("order_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(5)).getColumn().getOriginalColumn().getValue(), is("user_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(5)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(6)).getColumn().getOriginalColumn().getValue(), is("status"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(6)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("order_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("status"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("item_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("order_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(5)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(5)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(6)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("status"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(6)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
     }
     
     @Test
@@ -109,11 +109,11 @@ class JoinTableSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getLeft() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(actual.getRight() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         
assertJoinTableProjectionSegments(actual.getJoinTableProjectionSegments());
         assertTrue(tableBinderContexts.containsKey("t_order"));
         assertTrue(tableBinderContexts.containsKey("t_order_item"));
@@ -134,11 +134,11 @@ class JoinTableSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getLeft() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(actual.getRight() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         
assertJoinTableProjectionSegmentsWithNaturalJoin(actual.getJoinTableProjectionSegments());
         assertTrue(tableBinderContexts.containsKey("o"));
         assertTrue(tableBinderContexts.containsKey("i"));
@@ -148,14 +148,14 @@ class JoinTableSegmentBinderTest {
         List<ProjectionSegment> actual = new 
ArrayList<>(joinTableProjectionSegments);
         assertThat(actual.size(), is(4));
         assertTrue(actual.get(0) instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalColumn().getValue(), is("order_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalColumn().getValue(), is("user_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalColumn().getValue(), is("status"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalColumn().getValue(), is("item_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("order_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("status"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("item_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
     }
     
     @Test
@@ -173,11 +173,11 @@ class JoinTableSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getLeft() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(actual.getRight() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         
assertJoinTableProjectionSegmentsWithUsing(actual.getJoinTableProjectionSegments());
         assertTrue(tableBinderContexts.containsKey("o"));
         assertTrue(tableBinderContexts.containsKey("i"));
@@ -187,16 +187,16 @@ class JoinTableSegmentBinderTest {
         List<ProjectionSegment> actual = new 
ArrayList<>(joinTableProjectionSegments);
         assertThat(actual.size(), is(5));
         assertTrue(actual.get(0) instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalColumn().getValue(), is("status"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalColumn().getValue(), is("order_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalColumn().getValue(), is("user_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getOriginalTable().getValue(), is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalColumn().getValue(), is("item_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getOriginalColumn().getValue(), is("user_id"));
-        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getOriginalTable().getValue(), is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("status"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(0)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("order_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(1)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(2)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("item_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(3)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
actual.get(4)).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order_item"));
     }
     
     @Test
@@ -212,14 +212,14 @@ class JoinTableSegmentBinderTest {
         JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getLeft() instanceof JoinTableSegment);
         assertTrue(((JoinTableSegment) actual.getLeft()).getLeft() instanceof 
SimpleTableSegment);
-        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getLeft()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getLeft()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(((JoinTableSegment) actual.getLeft()).getRight() instanceof 
SimpleTableSegment);
-        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) ((JoinTableSegment) 
actual.getLeft()).getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(actual.getRight() instanceof SimpleTableSegment);
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SimpleTableSegment) 
actual.getRight()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertThat(actual.getJoinTableProjectionSegments().size(), is(10));
         assertTrue(tableBinderContexts.containsKey("o"));
         assertTrue(tableBinderContexts.containsKey("o2"));
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
index 64d8d823e51..b9a9f767a65 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
@@ -54,31 +54,37 @@ class SimpleTableSegmentBinderTest {
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
-        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(tableBinderContexts.containsKey("t_order"));
         
assertThat(tableBinderContexts.get("t_order").getProjectionSegments().size(), 
is(3));
         
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalDatabase().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalSchema().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalColumn().getValue(),
 is("user_id"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+                is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+                is("user_id"));
         
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalDatabase().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalSchema().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalColumn().getValue(),
 is("order_id"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+                is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+                is("order_id"));
         
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalDatabase().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalSchema().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalColumn().getValue(),
 is("status"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+                is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+                is("status"));
     }
     
     @Test
@@ -88,8 +94,8 @@ class SimpleTableSegmentBinderTest {
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
-        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is("sharding_db"));
-        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is("sharding_db"));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is("sharding_db"));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is("sharding_db"));
     }
     
     @Test
@@ -98,8 +104,8 @@ class SimpleTableSegmentBinderTest {
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
         SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
-        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
-        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
+        
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
     }
     
     private ShardingSphereMetaData createMetaData() {
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
index 478f1f4d6ca..3ef6404d02d 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
@@ -18,11 +18,11 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.ColumnSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.List;
@@ -32,7 +32,6 @@ import java.util.stream.Collectors;
 /**
  * Column segment.
  */
-@RequiredArgsConstructor
 @Getter
 @Setter
 public final class ColumnSegment implements ExpressionSegment, OwnerAvailable {
@@ -47,13 +46,14 @@ public final class ColumnSegment implements 
ExpressionSegment, OwnerAvailable {
     
     private OwnerSegment owner;
     
-    private IdentifierValue originalDatabase;
+    private ColumnSegmentBoundedInfo columnBoundedInfo;
     
-    private IdentifierValue originalSchema;
-    
-    private IdentifierValue originalTable;
-    
-    private IdentifierValue originalColumn;
+    public ColumnSegment(final int startIndex, final int stopIndex, final 
IdentifierValue identifier) {
+        this.startIndex = startIndex;
+        this.stopIndex = stopIndex;
+        this.identifier = identifier;
+        columnBoundedInfo = new ColumnSegmentBoundedInfo(identifier);
+    }
     
     /**
      * Get qualified name with quote characters.
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/ColumnSegmentBoundedInfo.java
similarity index 67%
copy from 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/ColumnSegmentBoundedInfo.java
index f0bf6db777f..da5433edb52 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/ColumnSegmentBoundedInfo.java
@@ -15,29 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
+package 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 /**
- * Table name segment.
+ * Column segment bounded info.
  */
 @RequiredArgsConstructor
 @Getter
-@Setter
-public final class TableNameSegment implements SQLSegment {
+public final class ColumnSegmentBoundedInfo {
     
-    private final int startIndex;
+    private final IdentifierValue originalDatabase;
     
-    private final int stopIndex;
+    private final IdentifierValue originalSchema;
     
-    private final IdentifierValue identifier;
+    private final IdentifierValue originalTable;
     
-    private IdentifierValue originalDatabase;
+    private final IdentifierValue originalColumn;
     
-    private IdentifierValue originalSchema;
+    public ColumnSegmentBoundedInfo(final IdentifierValue originalColumn) {
+        this.originalDatabase = null;
+        this.originalSchema = null;
+        this.originalTable = null;
+        this.originalColumn = originalColumn;
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/TableSegmentBoundedInfo.java
similarity index 71%
copy from 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/TableSegmentBoundedInfo.java
index f0bf6db777f..0523a0c8e69 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/bounded/TableSegmentBoundedInfo.java
@@ -15,29 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
+package 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 /**
- * Table name segment.
+ * Table name bounded info.
  */
 @RequiredArgsConstructor
 @Getter
-@Setter
-public final class TableNameSegment implements SQLSegment {
+public final class TableSegmentBoundedInfo {
     
-    private final int startIndex;
+    private final IdentifierValue originalDatabase;
     
-    private final int stopIndex;
-    
-    private final IdentifierValue identifier;
-    
-    private IdentifierValue originalDatabase;
-    
-    private IdentifierValue originalSchema;
+    private final IdentifierValue originalSchema;
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
index f0bf6db777f..4f73e26de67 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/TableNameSegment.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.bounded.TableSegmentBoundedInfo;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 /**
@@ -37,7 +38,5 @@ public final class TableNameSegment implements SQLSegment {
     
     private final IdentifierValue identifier;
     
-    private IdentifierValue originalDatabase;
-    
-    private IdentifierValue originalSchema;
+    private TableSegmentBoundedInfo tableBoundedInfo;
 }

Reply via email to