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

chengzhang 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 e42f4e52d44 Refactor ColumnSegmentBoundInfo and correct pass to 
SQLBindEngine databaseName (#34023)
e42f4e52d44 is described below

commit e42f4e52d4406be73a890d9c7fa56472c6d6a820
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Dec 12 16:05:41 2024 +0800

    Refactor ColumnSegmentBoundInfo and correct pass to SQLBindEngine 
databaseName (#34023)
    
    * Refactor ColumnSegmentBoundInfo and correct pass to SQLBindEngine 
databaseName
    
    * Refactor ColumnSegmentBoundInfo and correct pass to SQLBindEngine 
databaseName
    
    * fix unit test
    
    * fix unit test
    
    * fix unit test
    
    * fix unit test
---
 .../EncryptSelectProjectionSupportedChecker.java   |  2 +-
 ...EncryptPredicateColumnSupportedCheckerTest.java | 15 ++++++----
 ...ncryptSelectProjectionSupportedCheckerTest.java | 17 ++++++------
 .../encrypt/merge/dql/EncryptMergedResultTest.java | 11 +++++---
 ...InsertSelectColumnsEncryptorComparatorTest.java |  5 ++--
 .../fixture/EncryptGeneratorFixtureBuilder.java    |  7 +++--
 .../EncryptProjectionTokenGeneratorTest.java       |  5 ++--
 .../expression/type/ColumnSegmentBinder.java       |  2 +-
 .../from/type/SimpleTableSegmentBinder.java        |  3 +-
 .../binder/engine/util/SubqueryTableBindUtils.java |  7 +++--
 .../projection/impl/ColumnProjectionTest.java      |  3 +-
 .../assign/AssignmentSegmentBinderTest.java        |  3 +-
 .../expression/type/ColumnSegmentBinderTest.java   | 20 +++++++-------
 .../expression/type/SubquerySegmentBinderTest.java |  5 ++--
 .../core/connection/ShardingSphereConnection.java  |  1 -
 .../metadata/generator/PipelineDDLGenerator.java   |  4 +--
 .../context/SQLFederationExecutorContext.java      |  2 +-
 .../enumerable/EnumerableScanExecutor.java         |  4 +--
 .../enumerable/EnumerableScanExecutorTest.java     |  2 +-
 .../generic/bound/ColumnSegmentBoundInfo.java      | 32 ++++++++++++++++------
 .../generic/bound/TableSegmentBoundInfo.java       |  7 +++--
 .../handler/distsql/rul/PreviewExecutor.java       |  3 +-
 .../fieldlist/MySQLComFieldListPacketExecutor.java |  8 +++---
 .../text/query/MySQLMultiStatementsHandler.java    |  4 +--
 .../query/MySQLComQueryPacketExecutorTest.java     |  4 +--
 .../query/MySQLMultiStatementsHandlerTest.java     |  2 +-
 .../bind/OpenGaussComBatchBindExecutorTest.java    |  2 +-
 .../PostgreSQLBatchedStatementsExecutor.java       |  5 ++--
 ...egatedBatchedStatementsCommandExecutorTest.java |  2 +-
 .../PostgreSQLBatchedStatementsExecutorTest.java   |  2 +-
 30 files changed, 112 insertions(+), 77 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
index 5cb206098d8..a0bdeb2d5c7 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
@@ -94,7 +94,7 @@ public final class EncryptSelectProjectionSupportedChecker 
implements SupportedS
     
     private ColumnSegmentBoundInfo getColumnSegmentBoundInfo(final Projection 
projection) {
         return projection instanceof ColumnProjection
-                ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection) 
projection).getOriginalTable(), ((ColumnProjection) 
projection).getOriginalColumn())
+                ? new ColumnSegmentBoundInfo(null, ((ColumnProjection) 
projection).getOriginalTable(), ((ColumnProjection) 
projection).getOriginalColumn())
                 : new ColumnSegmentBoundInfo(new 
IdentifierValue(projection.getColumnLabel()));
     }
     
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
index e5387f75731..1c2ef0ba5af 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -66,9 +67,11 @@ class EncryptPredicateColumnSupportedCheckerTest {
     
     private SQLStatementContext 
mockSelectStatementContextWithDifferentEncryptorsInJoinCondition() {
         ColumnSegment leftColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_name"));
-        leftColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"), new 
IdentifierValue("t_user"), new IdentifierValue("user_name")));
+        leftColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")), new IdentifierValue("t_user"),
+                new IdentifierValue("user_name")));
         ColumnSegment rightColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_id"));
-        rightColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"), new 
IdentifierValue("t_user"), new IdentifierValue("user_id")));
+        rightColumn.setColumnBoundInfo(
+                new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), 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;
@@ -82,8 +85,8 @@ class EncryptPredicateColumnSupportedCheckerTest {
     
     private SQLStatementContext mockSelectStatementContextWithLike() {
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("user_name"));
-        columnSegment.setColumnBoundInfo(
-                new ColumnSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema"), new IdentifierValue("t_user"), new 
IdentifierValue("user_name")));
+        columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")), new IdentifierValue("t_user"),
+                new IdentifierValue("user_name")));
         SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getTablesContext().findTableNames(Collections.singleton(columnSegment),
 null)).thenReturn(Collections.singletonMap("user_name", "t_user"));
         
when(result.getColumnSegments()).thenReturn(Collections.singleton(columnSegment));
@@ -100,8 +103,8 @@ class EncryptPredicateColumnSupportedCheckerTest {
     
     private SQLStatementContext mockSelectStatementContextWithEqual() {
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("user_name"));
-        columnSegment.setColumnBoundInfo(
-                new ColumnSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema"), new IdentifierValue("t_user"), new 
IdentifierValue("user_name")));
+        columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")), new IdentifierValue("t_user"),
+                new IdentifierValue("user_name")));
         SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getTablesContext().findTableNames(Collections.singleton(columnSegment),
 null)).thenReturn(Collections.singletonMap("user_name", "t_user"));
         
when(result.getColumnSegments()).thenReturn(Collections.singleton(columnSegment));
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
index 023781df499..6bdb6214a91 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -91,16 +92,16 @@ class EncryptSelectProjectionSupportedCheckerTest {
         when(combineSegment.getLeft().getStartIndex()).thenReturn(0);
         when(combineSegment.getRight().getStartIndex()).thenReturn(1);
         
when(result.getSqlStatement().getCombine()).thenReturn(Optional.of(combineSegment));
-        ColumnProjection leftColumn1 = new ColumnProjection(new 
IdentifierValue("f"), new IdentifierValue("foo_col_1"), null, databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("foo_tbl"), 
new IdentifierValue("foo_col_1")));
-        ColumnProjection leftColumn2 = new ColumnProjection(new 
IdentifierValue("f"), new IdentifierValue("foo_col_2"), null, databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("foo_tbl"), 
new IdentifierValue("foo_col_2")));
+        ColumnProjection leftColumn1 = new ColumnProjection(new 
IdentifierValue("f"), new IdentifierValue("foo_col_1"), null, databaseType, 
null, null,
+                new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue("")), new IdentifierValue("foo_tbl"), 
new IdentifierValue("foo_col_1")));
+        ColumnProjection leftColumn2 = new ColumnProjection(new 
IdentifierValue("f"), new IdentifierValue("foo_col_2"), null, databaseType, 
null, null,
+                new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue("")), new IdentifierValue("foo_tbl"), 
new IdentifierValue("foo_col_2")));
         SelectStatementContext leftSelectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(leftSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(leftColumn1,
 leftColumn2));
-        ColumnProjection rightColumn1 = new ColumnProjection(new 
IdentifierValue("b"), new IdentifierValue("bar_col_1"), null, databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("bar_tbl"), 
new IdentifierValue("bar_col_1")));
-        ColumnProjection rightColumn2 = new ColumnProjection(new 
IdentifierValue("b"), new IdentifierValue("bar_col_2"), null, databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("bar_tbl"), 
new IdentifierValue("bar_col_2")));
+        ColumnProjection rightColumn1 = new ColumnProjection(new 
IdentifierValue("b"), new IdentifierValue("bar_col_1"), null, databaseType, 
null, null,
+                new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue("")), new IdentifierValue("bar_tbl"), 
new IdentifierValue("bar_col_1")));
+        ColumnProjection rightColumn2 = new ColumnProjection(new 
IdentifierValue("b"), new IdentifierValue("bar_col_2"), null, databaseType, 
null, null,
+                new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue("")), new IdentifierValue("bar_tbl"), 
new IdentifierValue("bar_col_2")));
         SelectStatementContext rightSelectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(rightSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(rightColumn1,
 rightColumn2));
         Map<Integer, SelectStatementContext> subqueryContexts = new 
LinkedHashMap<>(2, 1F);
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
index 755a38a13e7..eb827dd98de 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -107,8 +108,9 @@ class EncryptMergedResultTest {
     
     @Test
     void assertGetValueWithEncryptColumn() throws SQLException {
-        ColumnProjection columnProjection = new ColumnProjection(new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col"), new 
IdentifierValue("foo_alias"), databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"), new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col")));
+        ColumnProjection columnProjection =
+                new ColumnProjection(new IdentifierValue("foo_tbl"), new 
IdentifierValue("foo_col"), new IdentifierValue("foo_alias"), databaseType, 
null, null, new ColumnSegmentBoundInfo(
+                        new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col")));
         
when(selectStatementContext.findColumnProjection(1)).thenReturn(Optional.of(columnProjection));
         
when(selectStatementContext.getTablesContext().getSchemaName()).thenReturn(Optional.of("foo_schema"));
         EncryptAlgorithm encryptAlgorithm = mock(EncryptAlgorithm.class);
@@ -122,8 +124,9 @@ class EncryptMergedResultTest {
     
     @Test
     void assertGetValueFailed() throws SQLException {
-        ColumnProjection columnProjection = new ColumnProjection(new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col"), new 
IdentifierValue("foo_alias"), databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"), new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col")));
+        ColumnProjection columnProjection =
+                new ColumnProjection(new IdentifierValue("foo_tbl"), new 
IdentifierValue("foo_col"), new IdentifierValue("foo_alias"), databaseType, 
null, null, new ColumnSegmentBoundInfo(
+                        new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new 
IdentifierValue("foo_tbl"), new IdentifierValue("foo_col")));
         
when(selectStatementContext.findColumnProjection(1)).thenReturn(Optional.of(columnProjection));
         
when(selectStatementContext.getTablesContext().getSchemaName()).thenReturn(Optional.of("foo_schema"));
         EncryptAlgorithm encryptAlgorithm = mock(EncryptAlgorithm.class);
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparatorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparatorTest.java
index 76be5b0c8dc..9a73d2b1103 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparatorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparatorTest.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfigurat
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -59,13 +60,13 @@ class InsertSelectColumnsEncryptorComparatorTest {
     
     private ColumnProjection getSelectProjection(final String pwd, final 
IdentifierValue databaseValue, final IdentifierValue schemaValue) {
         return new ColumnProjection(new IdentifierValue("table2"), new 
IdentifierValue(pwd), null, null, null, null,
-                new ColumnSegmentBoundInfo(databaseValue, schemaValue, new 
IdentifierValue("table2"), new IdentifierValue(pwd)));
+                new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(databaseValue, schemaValue), new 
IdentifierValue("table2"), new IdentifierValue(pwd)));
     }
     
     private ColumnSegment getInsertColumnSegment(final IdentifierValue 
databaseValue, final IdentifierValue schemaValue, final String tableName, final 
String columnName) {
         ColumnSegment result = mock(ColumnSegment.class);
         when(result.getColumnBoundInfo())
-                .thenReturn(new ColumnSegmentBoundInfo(databaseValue, 
schemaValue, new IdentifierValue(tableName), new IdentifierValue(columnName)));
+                .thenReturn(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(databaseValue, schemaValue), new 
IdentifierValue(tableName), new IdentifierValue(columnName)));
         return result;
     }
     
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 72a37c30d60..80287886d79 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
@@ -50,6 +50,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Colu
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
@@ -128,10 +129,10 @@ public final class EncryptGeneratorFixtureBuilder {
         InsertStatement result = new MySQLInsertStatement();
         result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_user"))));
         ColumnSegment userIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_id"));
-        userIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"), new 
IdentifierValue("t_user"),
+        userIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")), new IdentifierValue("t_user"),
                 new IdentifierValue("user_id")));
         ColumnSegment userNameColumn = new ColumnSegment(0, 0, new 
IdentifierValue("user_name"));
-        userNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"),
+        userNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")),
                 new IdentifierValue("t_user"), new 
IdentifierValue("user_name")));
         List<ColumnSegment> insertColumns = Arrays.asList(userIdColumn, 
userNameColumn);
         if (containsInsertColumns) {
@@ -145,7 +146,7 @@ public final class EncryptGeneratorFixtureBuilder {
         ProjectionsSegment projections = new ProjectionsSegment(0, 0);
         projections.getProjections().add(new 
ColumnProjectionSegment(userIdColumn));
         ColumnSegment statusColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        statusColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"), new 
IdentifierValue("t_user"),
+        statusColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")), new IdentifierValue("t_user"),
                 new IdentifierValue("status")));
         projections.getProjections().add(new 
ColumnProjectionSegment(statusColumn));
         selectStatement.setProjections(projections);
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGeneratorTest.java
index 18b3e0c84ff..627e0b4b171 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGeneratorTest.java
@@ -32,6 +32,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Proj
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -80,7 +81,7 @@ 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.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"), new 
IdentifierValue("doctor"),
+        column.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")), new IdentifierValue("doctor"),
                 new IdentifierValue("mobile")));
         column.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a")));
         ProjectionsSegment projections = mock(ProjectionsSegment.class);
@@ -102,7 +103,7 @@ 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.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"), new 
IdentifierValue("doctor"),
+        column.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")), new IdentifierValue("doctor"),
                 new IdentifierValue("mobile")));
         column.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a")));
         ProjectionsSegment projections = mock(ProjectionsSegment.class);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
index e1d828befe8..3e3a894764c 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
@@ -260,7 +260,7 @@ public final class ColumnSegmentBinder {
                 : segmentOriginalTable;
         IdentifierValue segmentOriginalColumn = 
segment.getColumnBoundInfo().getOriginalColumn();
         IdentifierValue originalColumn = 
Optional.ofNullable(inputColumnSegment).map(optional -> 
optional.getColumnBoundInfo().getOriginalColumn()).orElse(segmentOriginalColumn);
-        return new ColumnSegmentBoundInfo(originalDatabase, originalSchema, 
originalTable, originalColumn);
+        return new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(originalDatabase, originalSchema), originalTable, 
originalColumn);
     }
     
     /**
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java
index 8c74c0dd5b4..e77dc4f7f4e 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java
@@ -42,6 +42,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Colu
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -158,7 +159,7 @@ public final class SimpleTableSegmentBinder {
                                                      final 
ShardingSphereColumn column, final QuoteCharacter quoteCharacter, final 
IdentifierValue tableName) {
         ColumnSegment result = new ColumnSegment(0, 0, new 
IdentifierValue(column.getName(), quoteCharacter));
         result.setOwner(new OwnerSegment(0, 0, 
segment.getAlias().orElse(tableName)));
-        result.setColumnBoundInfo(new ColumnSegmentBoundInfo(databaseName, 
schemaName, tableName, new IdentifierValue(column.getName(), quoteCharacter)));
+        result.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(databaseName, schemaName), tableName, new 
IdentifierValue(column.getName(), quoteCharacter)));
         return result;
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
index 74026fc4299..40d640b910b 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Shor
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.Collection;
@@ -75,9 +76,9 @@ public final class SubqueryTableBindUtils {
         if (!Strings.isNullOrEmpty(subqueryTableName.getValue())) {
             newColumnSegment.setOwner(new OwnerSegment(0, 0, 
subqueryTableName));
         }
-        newColumnSegment.setColumnBoundInfo(
-                new 
ColumnSegmentBoundInfo(originalColumn.getColumn().getColumnBoundInfo().getOriginalDatabase(),
 originalColumn.getColumn().getColumnBoundInfo().getOriginalSchema(),
-                        
originalColumn.getColumn().getColumnBoundInfo().getOriginalTable(), 
originalColumn.getColumn().getColumnBoundInfo().getOriginalColumn()));
+        ColumnSegmentBoundInfo columnBoundInfo = 
originalColumn.getColumn().getColumnBoundInfo();
+        newColumnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(columnBoundInfo.getOriginalDatabase(), 
columnBoundInfo.getOriginalSchema()),
+                columnBoundInfo.getOriginalTable(), 
columnBoundInfo.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/context/segment/select/projection/impl/ColumnProjectionTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
index 0b84d3971e6..81d57894a32 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.infra.binder.context.segment.select.projection
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -53,7 +54,7 @@ class ColumnProjectionTest {
     @Test
     void assertGetOriginalTable() {
         ColumnProjection projection = new ColumnProjection(new 
IdentifierValue("owner"), new IdentifierValue("name"), new 
IdentifierValue("alias"), databaseType,
-                null, null, new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("tbl"), new 
IdentifierValue("")));
+                null, null, new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(null, null), new IdentifierValue("tbl"), new 
IdentifierValue("")));
         assertThat(projection.getOriginalTable(), is(new 
IdentifierValue("tbl")));
     }
     
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java
index 1e7797b0df1..fa7e5f76aac 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -47,7 +48,7 @@ class AssignmentSegmentBinderTest {
     void assertBindAssignmentSegment() {
         Collection<ColumnAssignmentSegment> assignments = new LinkedList<>();
         ColumnSegment boundOrderIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
-        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_db"),
+        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_db")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
         assignments.add(new ColumnAssignmentSegment(0, 0, 
Collections.singletonList(columnSegment), new LiteralExpressionSegment(0, 0, 
1)));
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
index 86127e9d1fa..9952c36f686 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
@@ -54,11 +54,11 @@ class ColumnSegmentBinderTest {
     void assertBindWithMultiTablesJoinAndNoOwner() {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
         ColumnSegment boundOrderIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
-        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
         tableBinderContexts.put(new CaseInsensitiveString("t_order"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderIdColumn))));
         ColumnSegment boundItemIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("item_id"));
-        boundItemIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundItemIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("item_id")));
         tableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundItemIdColumn))));
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
@@ -77,11 +77,11 @@ class ColumnSegmentBinderTest {
     void assertBindFromOuterTable() {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
outerTableBinderContexts = LinkedHashMultimap.create();
         ColumnSegment boundOrderStatusColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        boundOrderStatusColumn.setColumnBoundInfo(new 
ColumnSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema"),
+        boundOrderStatusColumn.setColumnBoundInfo(new 
ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), 
new IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("status")));
         outerTableBinderContexts.put(new CaseInsensitiveString("t_order"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderStatusColumn))));
         ColumnSegment boundOrderItemStatusColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        boundOrderItemStatusColumn.setColumnBoundInfo(new 
ColumnSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema"),
+        boundOrderItemStatusColumn.setColumnBoundInfo(new 
ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), 
new IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("status")));
         outerTableBinderContexts.put(new 
CaseInsensitiveString("t_order_item"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderItemStatusColumn))));
         SQLStatementBinderContext binderContext =
@@ -100,11 +100,11 @@ class ColumnSegmentBinderTest {
     void assertBindWithSameTableAliasAndSameProjection() {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
         ColumnSegment boundOrderColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        boundOrderColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("status")));
         tableBinderContexts.put(new CaseInsensitiveString("temp"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderColumn))));
         ColumnSegment boundOrderItemColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("status")));
         tableBinderContexts.put(new CaseInsensitiveString("temp"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderItemColumn))));
         SQLStatementBinderContext binderContext =
@@ -118,11 +118,11 @@ class ColumnSegmentBinderTest {
     void assertBindWithSameTableAliasAndDifferentProjection() {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
         ColumnSegment boundOrderColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
-        boundOrderColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
         tableBinderContexts.put(new CaseInsensitiveString("temp"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderColumn))));
         ColumnSegment boundOrderItemColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
-        boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("status")));
         tableBinderContexts.put(new CaseInsensitiveString("temp"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderItemColumn))));
         SQLStatementBinderContext binderContext =
@@ -142,11 +142,11 @@ class ColumnSegmentBinderTest {
     void assertBindOwner() {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
         ColumnSegment boundOrderIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
-        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
         tableBinderContexts.put(new CaseInsensitiveString("t_order"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderIdColumn))));
         ColumnSegment boundItemIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("item_id"));
-        boundItemIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema"),
+        boundItemIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue("foo_db"), new 
IdentifierValue("foo_schema")),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("item_id")));
         tableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundItemIdColumn))));
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
index d6fe501b167..96fa3d20055 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
@@ -36,6 +36,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Proj
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -71,8 +72,8 @@ class SubquerySegmentBinderTest {
         SQLStatementBinderContext sqlStatementBinderContext = new 
SQLStatementBinderContext(
                 createMetaData(), "foo_db", 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), 
Collections.emptySet());
         ColumnSegment boundNameColumn = new ColumnSegment(7, 13, new 
IdentifierValue("user_id"));
-        boundNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(
-                new IdentifierValue("foo_db"), new IdentifierValue("foo_db"), 
new IdentifierValue("t_order_item"), new IdentifierValue("user_id")));
+        boundNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(
+                new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), 
new IdentifierValue("t_order_item"), new IdentifierValue("user_id")));
         sqlStatementBinderContext.getExternalTableBinderContexts().put(new 
CaseInsensitiveString("t_order_item"),
                 new SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundNameColumn))));
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
outerTableBinderContexts = LinkedHashMultimap.create();
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
index eff5feae349..7da8af0ac35 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
@@ -288,7 +288,6 @@ public final class ShardingSphereConnection extends 
AbstractConnectionAdapter {
     
     @Override
     public String getSchema() {
-        // TODO return databaseName for now in getSchema(), the same as before
         return currentDatabaseName;
     }
     
diff --git 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
 
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
index 16b27e2929e..d56e58ebc63 100644
--- 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
+++ 
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
@@ -128,8 +128,8 @@ public final class PipelineDDLGenerator {
         return doDecorateActualTable(replaceMap, sql);
     }
     
-    private SQLStatementContext parseSQL(final String databaseName, final 
SQLParserEngine parserEngine, final String sql) {
-        return new SQLBindEngine(null, databaseName, new 
HintValueContext()).bind(parserEngine.parse(sql, true), 
Collections.emptyList());
+    private SQLStatementContext parseSQL(final String currentDatabaseName, 
final SQLParserEngine parserEngine, final String sql) {
+        return new SQLBindEngine(null, currentDatabaseName, new 
HintValueContext()).bind(parserEngine.parse(sql, true), 
Collections.emptyList());
     }
     
     private void appendFromIndexAndConstraint(final Map<SQLSegment, String> 
replaceMap, final String targetTableName, final SQLStatementContext 
sqlStatementContext) {
diff --git 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/context/SQLFederationExecutorContext.java
 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/context/SQLFederationExecutorContext.java
index 8b24e5e4016..f1db1c77706 100644
--- 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/context/SQLFederationExecutorContext.java
+++ 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/context/SQLFederationExecutorContext.java
@@ -31,7 +31,7 @@ import java.util.Map;
 @Getter
 public final class SQLFederationExecutorContext {
     
-    private final String databaseName;
+    private final String currentDatabaseName;
     
     private final String schemaName;
     
diff --git 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
index 1aa6915c356..3a21637fc6b 100644
--- 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
+++ 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
@@ -104,7 +104,7 @@ public final class EnumerableScanExecutor implements 
ScanExecutor {
     
     @Override
     public Enumerable<Object> execute(final ShardingSphereTable table, final 
ScanExecutorContext scanContext) {
-        String databaseName = executorContext.getDatabaseName();
+        String databaseName = executorContext.getCurrentDatabaseName();
         String schemaName = executorContext.getSchemaName();
         DatabaseType databaseType = 
optimizerContext.getParserContext(databaseName).getDatabaseType();
         if (new 
SystemDatabase(databaseType).getSystemSchemas().contains(schemaName)) {
@@ -206,7 +206,7 @@ public final class EnumerableScanExecutor implements 
ScanExecutor {
                 optimizerContext.getSqlParserRule().getSqlStatementCache(), 
optimizerContext.getSqlParserRule().getParseTreeCache()).parse(sql, useCache);
         List<Object> params = getParameters(sqlString.getParamIndexes());
         HintValueContext hintValueContext = new HintValueContext();
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, 
executorContext.getDatabaseName(), hintValueContext).bind(sqlStatement, params);
+        SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, 
executorContext.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, 
params);
         return new QueryContext(sqlStatementContext, sql, params, 
hintValueContext, federationContext.getQueryContext().getConnectionContext(), 
metaData, useCache);
     }
     
diff --git 
a/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutorTest.java
 
b/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutorTest.java
index 47c57ef397f..46de51b8781 100644
--- 
a/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutorTest.java
+++ 
b/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutorTest.java
@@ -51,7 +51,7 @@ class EnumerableScanExecutorTest {
         OptimizerContext optimizerContext = mock(OptimizerContext.class, 
RETURNS_DEEP_STUBS);
         
when(optimizerContext.getParserContext(any()).getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "PostgreSQL"));
         SQLFederationExecutorContext executorContext = 
mock(SQLFederationExecutorContext.class);
-        when(executorContext.getDatabaseName()).thenReturn("db");
+        when(executorContext.getCurrentDatabaseName()).thenReturn("db");
         when(executorContext.getSchemaName()).thenReturn("pg_catalog");
         ShardingSphereStatistics statistics = 
mock(ShardingSphereStatistics.class, RETURNS_DEEP_STUBS);
         ShardingSphereDatabaseData databaseData = 
mock(ShardingSphereDatabaseData.class, RETURNS_DEEP_STUBS);
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java
index a4b8a674379..e3a6f8175ba 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java
@@ -23,25 +23,41 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.Iden
 /**
  * Column segment bound info.
  */
-@Getter
 public final class ColumnSegmentBoundInfo {
     
-    private final IdentifierValue originalDatabase;
-    
-    private final IdentifierValue originalSchema;
+    private final TableSegmentBoundInfo tableBoundInfo;
     
+    @Getter
     private final IdentifierValue originalTable;
     
+    @Getter
     private final IdentifierValue originalColumn;
     
     public ColumnSegmentBoundInfo(final IdentifierValue originalColumn) {
-        this(null, null, null, originalColumn);
+        this(null, null, originalColumn);
     }
     
-    public ColumnSegmentBoundInfo(final IdentifierValue originalDatabase, 
final IdentifierValue originalSchema, final IdentifierValue originalTable, 
final IdentifierValue originalColumn) {
-        this.originalDatabase = null == originalDatabase ? new 
IdentifierValue("") : originalDatabase;
-        this.originalSchema = null == originalSchema ? new IdentifierValue("") 
: originalSchema;
+    public ColumnSegmentBoundInfo(final TableSegmentBoundInfo tableBoundInfo, 
final IdentifierValue originalTable, final IdentifierValue originalColumn) {
+        this.tableBoundInfo = null == tableBoundInfo ? new 
TableSegmentBoundInfo(null, null) : tableBoundInfo;
         this.originalTable = null == originalTable ? new IdentifierValue("") : 
originalTable;
         this.originalColumn = null == originalColumn ? new IdentifierValue("") 
: originalColumn;
     }
+    
+    /**
+     * Get original database.
+     *
+     * @return original database
+     */
+    public IdentifierValue getOriginalDatabase() {
+        return tableBoundInfo.getOriginalDatabase();
+    }
+    
+    /**
+     * Get original schema.
+     *
+     * @return original schema
+     */
+    public IdentifierValue getOriginalSchema() {
+        return tableBoundInfo.getOriginalSchema();
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
index 97ec0c7f8aa..e996a70993b 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
@@ -18,17 +18,20 @@
 package 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
  * Table name bound info.
  */
-@RequiredArgsConstructor
 @Getter
 public final class TableSegmentBoundInfo {
     
     private final IdentifierValue originalDatabase;
     
     private final IdentifierValue originalSchema;
+    
+    public TableSegmentBoundInfo(final IdentifierValue originalDatabase, final 
IdentifierValue originalSchema) {
+        this.originalDatabase = null == originalDatabase ? new 
IdentifierValue("") : originalDatabase;
+        this.originalSchema = null == originalSchema ? new IdentifierValue("") 
: originalSchema;
+    }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
index 5b83098164c..ae9a7909c67 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
@@ -91,7 +91,8 @@ public final class PreviewExecutor implements 
DistSQLQueryExecutor<PreviewStatem
         SQLStatement toBePreviewedStatement = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(database.getProtocolType()).parse(toBePreviewedSQL,
 false);
         HintValueContext hintValueContext = 
connectionContext.getQueryContext().getHintValueContext();
         hintValueContext.setSkipMetadataValidate(true);
-        SQLStatementContext toBePreviewedStatementContext = new 
SQLBindEngine(metaData, database.getName(), 
hintValueContext).bind(toBePreviewedStatement, Collections.emptyList());
+        String currentDatabaseName = 
connectionContext.getQueryContext().getConnectionContext().getCurrentDatabaseName().orElse(null);
+        SQLStatementContext toBePreviewedStatementContext = new 
SQLBindEngine(metaData, currentDatabaseName, 
hintValueContext).bind(toBePreviewedStatement, Collections.emptyList());
         QueryContext queryContext =
                 new QueryContext(toBePreviewedStatementContext, 
toBePreviewedSQL, Collections.emptyList(), hintValueContext, 
connectionContext.getQueryContext().getConnectionContext(), metaData);
         if (toBePreviewedStatementContext instanceof CursorAvailable && 
toBePreviewedStatementContext instanceof CursorAware) {
diff --git 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
index e7ffdbf1a34..344a5ef30d4 100644
--- 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
+++ 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
@@ -63,18 +63,18 @@ public final class MySQLComFieldListPacketExecutor 
implements CommandExecutor {
     
     @Override
     public Collection<DatabasePacket> execute() throws SQLException {
-        String databaseName = connectionSession.getCurrentDatabaseName();
-        String sql = String.format(SQL, packet.getTable(), databaseName);
+        String currentDatabaseName = 
connectionSession.getCurrentDatabaseName();
+        String sql = String.format(SQL, packet.getTable(), 
currentDatabaseName);
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         SQLParserRule sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
         SQLStatement sqlStatement = 
sqlParserRule.getSQLParserEngine(TypedSPILoader.getService(DatabaseType.class, 
"MySQL")).parse(sql, false);
         HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
-        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(metaDataContexts.getMetaData(), databaseName, 
hintValueContext).bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(metaDataContexts.getMetaData(), currentDatabaseName, 
hintValueContext).bind(sqlStatement, Collections.emptyList());
         ProxyDatabaseConnectionManager databaseConnectionManager = 
connectionSession.getDatabaseConnectionManager();
         QueryContext queryContext = new QueryContext(sqlStatementContext, sql, 
Collections.emptyList(), hintValueContext, 
connectionSession.getConnectionContext(), metaDataContexts.getMetaData());
         databaseConnector = 
DatabaseConnectorFactory.getInstance().newInstance(queryContext, 
databaseConnectionManager, false);
         databaseConnector.execute();
-        return createColumnDefinition41Packets(databaseName);
+        return createColumnDefinition41Packets(currentDatabaseName);
     }
     
     private Collection<DatabasePacket> createColumnDefinition41Packets(final 
String databaseName) throws SQLException {
diff --git 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index a4d76ebb4bd..8341bcd1ea1 100644
--- 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -124,7 +124,7 @@ public final class MySQLMultiStatementsHandler implements 
ProxyBackendHandler {
     private QueryContext createQueryContext(final String sql, final 
SQLStatement sqlStatement) {
         HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
         SQLStatementContext sqlStatementContext =
-                new SQLBindEngine(metaDataContexts.getMetaData(), 
connectionSession.getUsedDatabaseName(), hintValueContext).bind(sqlStatement, 
Collections.emptyList());
+                new SQLBindEngine(metaDataContexts.getMetaData(), 
connectionSession.getCurrentDatabaseName(), 
hintValueContext).bind(sqlStatement, Collections.emptyList());
         return new QueryContext(sqlStatementContext, sql, 
Collections.emptyList(), hintValueContext, 
connectionSession.getConnectionContext(), metaDataContexts.getMetaData());
     }
     
@@ -170,7 +170,7 @@ public final class MySQLMultiStatementsHandler implements 
ProxyBackendHandler {
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
         RuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
-        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getUsedDatabaseName());
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
         SQLAuditEngine.audit(queryContext, globalRuleMetaData, 
currentDatabase);
         return new KernelProcessor().generateExecutionContext(queryContext, 
globalRuleMetaData, metaDataContexts.getMetaData().getProps());
     }
diff --git 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
index 37cb1228c41..4f5e961bd07 100644
--- 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
+++ 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
@@ -124,7 +124,7 @@ class MySQLComQueryPacketExecutorTest {
     void assertExecuteMultiUpdateStatements() throws SQLException, 
NoSuchFieldException, IllegalAccessException {
         
when(connectionSession.getAttributeMap().hasAttr(MySQLConstants.OPTION_MULTI_STATEMENTS_ATTRIBUTE_KEY)).thenReturn(true);
         
when(connectionSession.getAttributeMap().attr(MySQLConstants.OPTION_MULTI_STATEMENTS_ATTRIBUTE_KEY).get()).thenReturn(0);
-        when(connectionSession.getUsedDatabaseName()).thenReturn("foo_db");
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
         when(packet.getSQL()).thenReturn("update t set v=v+1 where id=1;update 
t set v=v+1 where id=2;update t set v=v+1 where id=3");
         ContextManager contextManager = mock(ContextManager.class);
         MetaDataContexts metaDataContexts = mockMetaDataContexts();
@@ -142,7 +142,7 @@ class MySQLComQueryPacketExecutorTest {
     void assertExecuteMultiInsertOnDuplicateKeyStatements() throws 
SQLException, NoSuchFieldException, IllegalAccessException {
         
when(connectionSession.getAttributeMap().hasAttr(MySQLConstants.OPTION_MULTI_STATEMENTS_ATTRIBUTE_KEY)).thenReturn(true);
         
when(connectionSession.getAttributeMap().attr(MySQLConstants.OPTION_MULTI_STATEMENTS_ATTRIBUTE_KEY).get()).thenReturn(0);
-        when(connectionSession.getUsedDatabaseName()).thenReturn("foo_db");
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
         when(packet.getSQL()).thenReturn("insert into t (id, v) values(1,1) on 
duplicate key update v=2;insert into t (id, v) values(2,1) on duplicate key 
update v=3");
         ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
         MetaDataContexts metaDataContexts = mockMetaDataContexts();
diff --git 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
index ef34bdf065b..7d3e282e079 100644
--- 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
+++ 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
@@ -154,7 +154,7 @@ class MySQLMultiStatementsHandlerTest {
     
     private ConnectionSession mockConnectionSession() throws SQLException {
         ConnectionSession result = mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS);
-        when(result.getUsedDatabaseName()).thenReturn("foo_db");
+        when(result.getCurrentDatabaseName()).thenReturn("foo_db");
         Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
         
when(connection.getMetaData().getURL()).thenReturn("jdbc:mysql://127.0.0.1/db");
         Statement statement = mock(Statement.class);
diff --git 
a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
 
b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
index 9fb696ed647..bfe13d152b8 100644
--- 
a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
+++ 
b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
@@ -105,7 +105,7 @@ class OpenGaussComBatchBindExecutorTest {
     private ConnectionSession mockConnectionSession() throws SQLException {
         ConnectionSession result = mock(ConnectionSession.class);
         when(result.getConnectionContext()).thenReturn(new 
ConnectionContext(Collections::emptySet));
-        when(result.getUsedDatabaseName()).thenReturn("foo_db");
+        when(result.getCurrentDatabaseName()).thenReturn("foo_db");
         ConnectionContext connectionContext = mockConnectionContext();
         when(result.getConnectionContext()).thenReturn(connectionContext);
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class);
diff --git 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index 8fa4ff66c72..09453c5df02 100644
--- 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -107,7 +107,8 @@ public final class PostgreSQLBatchedStatementsExecutor {
     }
     
     private SQLStatementContext createSQLStatementContext(final List<Object> 
params, final HintValueContext hintValueContext) {
-        return new SQLBindEngine(metaDataContexts.getMetaData(), 
connectionSession.getUsedDatabaseName(), 
hintValueContext).bind(preparedStatement.getSqlStatementContext().getSqlStatement(),
 params);
+        return new SQLBindEngine(metaDataContexts.getMetaData(), 
connectionSession.getCurrentDatabaseName(), 
hintValueContext).bind(preparedStatement.getSqlStatementContext().getSqlStatement(),
+                params);
     }
     
     private void prepareForRestOfParametersSet(final Iterator<List<Object>> 
paramSetsIterator, final SQLStatementContext sqlStatementContext, final 
HintValueContext hintValueContext) {
@@ -129,7 +130,7 @@ public final class PostgreSQLBatchedStatementsExecutor {
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
         RuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
-        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getUsedDatabaseName());
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
         SQLAuditEngine.audit(queryContext, globalRuleMetaData, 
currentDatabase);
         return kernelProcessor.generateExecutionContext(queryContext, 
globalRuleMetaData, metaDataContexts.getMetaData().getProps());
     }
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
index 2bc45f28365..cb813d381c6 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
@@ -113,7 +113,7 @@ class 
PostgreSQLAggregatedBatchedStatementsCommandExecutorTest {
         ConnectionSession result = mock(ConnectionSession.class);
         SQLStatementContext sqlStatementContext = 
mock(InsertStatementContext.class);
         
when(sqlStatementContext.getSqlStatement()).thenReturn(parserEngine.parse(SQL, 
false));
-        when(result.getUsedDatabaseName()).thenReturn("foo_db");
+        when(result.getCurrentDatabaseName()).thenReturn("foo_db");
         ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);
         connectionContext.setCurrentDatabaseName("foo_db");
         when(result.getConnectionContext()).thenReturn(connectionContext);
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
index 41c0b317820..81943995dae 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
@@ -153,7 +153,7 @@ class PostgreSQLBatchedStatementsExecutorTest {
     
     private ConnectionSession mockConnectionSession() {
         ConnectionSession result = mock(ConnectionSession.class);
-        when(result.getUsedDatabaseName()).thenReturn("db");
+        when(result.getCurrentDatabaseName()).thenReturn("db");
         
when(result.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager);
         when(result.getStatementManager()).thenReturn(backendStatement);
         ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);

Reply via email to