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 7794ce69860 Enhance join statement column and correlation subquery 
binder logic (#28156)
7794ce69860 is described below

commit 7794ce69860fb25ed057df8cb0b56893e50e1388
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Aug 18 16:01:09 2023 +0800

    Enhance join statement column and correlation subquery binder logic (#28156)
---
 .../segment/combine/CombineSegmentBinder.java      |  8 ++--
 .../expression/ExpressionSegmentBinder.java        | 19 +++++-----
 .../impl/BinaryOperationExpressionBinder.java      | 11 +++---
 .../expression/impl/ColumnSegmentBinder.java       | 40 +++++++++++++-------
 .../impl/ExistsSubqueryExpressionBinder.java       |  9 ++---
 .../expression/impl/InExpressionBinder.java        | 12 +++---
 .../expression/impl/NotExpressionBinder.java       |  9 ++---
 .../impl/SubqueryExpressionSegmentBinder.java      | 14 ++++---
 .../expression/impl/SubquerySegmentBinder.java     | 11 +++---
 .../binder/segment/from/TableSegmentBinder.java    | 16 +++-----
 .../segment/from/TableSegmentBinderContext.java    |  2 +
 .../segment/from/impl/JoinTableSegmentBinder.java  | 18 ++++-----
 .../from/impl/SimpleTableSegmentBinder.java        | 28 +++++++-------
 .../from/impl/SubqueryTableSegmentBinder.java      |  9 ++---
 .../projection/ProjectionsSegmentBinder.java       | 17 ++++-----
 .../impl/ColumnProjectionSegmentBinder.java        |  7 +++-
 .../impl/SubqueryProjectionSegmentBinder.java      | 13 +++----
 .../binder/segment/where/WhereSegmentBinder.java   |  9 ++---
 .../statement/SQLStatementBinderContext.java       | 43 ++++++++++++++++++++++
 .../statement/dml/InsertStatementBinder.java       |  4 +-
 .../statement/dml/SelectStatementBinder.java       | 10 +++--
 .../from/impl/JoinTableSegmentBinderTest.java      | 11 +++---
 .../from/impl/SimpleTableSegmentBinderTest.java    |  7 ++--
 .../from/impl/SubqueryTableSegmentBinderTest.java  |  7 ++--
 24 files changed, 194 insertions(+), 140 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/combine/CombineSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/combine/CombineSegmentBinder.java
index 89eb00a14af..3b4a84e54f3 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/combine/CombineSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/combine/CombineSegmentBinder.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.combine;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.combine.CombineSegment;
@@ -34,11 +35,12 @@ public final class CombineSegmentBinder {
      * Bind combine segment with metadata.
      *
      * @param segment table segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @return bounded combine segment
      */
-    public static CombineSegment bind(final CombineSegment segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+    public static CombineSegment bind(final CombineSegment segment, final 
SQLStatementBinderContext statementBinderContext) {
+        ShardingSphereMetaData metaData = statementBinderContext.getMetaData();
+        String defaultDatabaseName = 
statementBinderContext.getDefaultDatabaseName();
         SelectStatement boundedLeftSelect = new 
SelectStatementBinder().bind(segment.getLeft(), metaData, defaultDatabaseName);
         SelectStatement boundedRightSelect = new 
SelectStatementBinder().bind(segment.getRight(), metaData, defaultDatabaseName);
         return new CombineSegment(segment.getStartIndex(), 
segment.getStopIndex(), boundedLeftSelect, segment.getCombineType(), 
boundedRightSelect);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ExpressionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ExpressionSegmentBinder.java
index 922297d1990..6d262c4026f 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ExpressionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ExpressionSegmentBinder.java
@@ -26,7 +26,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.InExpressi
 import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.NotExpressionBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.SubqueryExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
@@ -47,31 +47,30 @@ public final class ExpressionSegmentBinder {
      * Bind expression segment with metadata.
      *
      * @param segment expression segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @param outerTableBinderContexts outer table binder contexts
      * @return bounded expression segment
      */
-    public static ExpressionSegment bind(final ExpressionSegment segment, 
final ShardingSphereMetaData metaData, final String defaultDatabaseName,
+    public static ExpressionSegment bind(final ExpressionSegment segment, 
final SQLStatementBinderContext statementBinderContext,
                                          final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         if (segment instanceof BinaryOperationExpression) {
-            return 
BinaryOperationExpressionBinder.bind((BinaryOperationExpression) segment, 
metaData, defaultDatabaseName, tableBinderContexts, outerTableBinderContexts);
+            return 
BinaryOperationExpressionBinder.bind((BinaryOperationExpression) segment, 
statementBinderContext, tableBinderContexts, outerTableBinderContexts);
         }
         if (segment instanceof ExistsSubqueryExpression) {
-            return 
ExistsSubqueryExpressionBinder.bind((ExistsSubqueryExpression) segment, 
metaData, defaultDatabaseName, tableBinderContexts);
+            return 
ExistsSubqueryExpressionBinder.bind((ExistsSubqueryExpression) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof SubqueryExpressionSegment) {
-            return 
SubqueryExpressionSegmentBinder.bind((SubqueryExpressionSegment) segment, 
metaData, defaultDatabaseName);
+            return 
SubqueryExpressionSegmentBinder.bind((SubqueryExpressionSegment) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof InExpression) {
-            return InExpressionBinder.bind((InExpression) segment, metaData, 
defaultDatabaseName, tableBinderContexts);
+            return InExpressionBinder.bind((InExpression) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof NotExpression) {
-            return NotExpressionBinder.bind((NotExpression) segment, metaData, 
defaultDatabaseName, tableBinderContexts);
+            return NotExpressionBinder.bind((NotExpression) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof ColumnSegment) {
-            return ColumnSegmentBinder.bind((ColumnSegment) segment, 
tableBinderContexts, outerTableBinderContexts);
+            return ColumnSegmentBinder.bind((ColumnSegment) segment, 
statementBinderContext, tableBinderContexts, outerTableBinderContexts);
         }
         // TODO support more ExpressionSegment bind
         return segment;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/BinaryOperationExpressionBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/BinaryOperationExpressionBinder.java
index 4352874c655..ef0a6256b95 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/BinaryOperationExpressionBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/BinaryOperationExpressionBinder.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 
@@ -37,16 +37,15 @@ public final class BinaryOperationExpressionBinder {
      * Bind binary operation expression with metadata.
      *
      * @param segment binary operation expression segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @param outerTableBinderContexts outer table binder contexts
      * @return bounded binary operation expression segment
      */
-    public static BinaryOperationExpression bind(final 
BinaryOperationExpression segment, final ShardingSphereMetaData metaData, final 
String defaultDatabaseName,
+    public static BinaryOperationExpression bind(final 
BinaryOperationExpression segment, final SQLStatementBinderContext 
statementBinderContext,
                                                  final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
-        ExpressionSegment boundedLeft = 
ExpressionSegmentBinder.bind(segment.getLeft(), metaData, defaultDatabaseName, 
tableBinderContexts, outerTableBinderContexts);
-        ExpressionSegment boundedRight = 
ExpressionSegmentBinder.bind(segment.getRight(), metaData, defaultDatabaseName, 
tableBinderContexts, outerTableBinderContexts);
+        ExpressionSegment boundedLeft = 
ExpressionSegmentBinder.bind(segment.getLeft(), statementBinderContext, 
tableBinderContexts, outerTableBinderContexts);
+        ExpressionSegment boundedRight = 
ExpressionSegmentBinder.bind(segment.getRight(), statementBinderContext, 
tableBinderContexts, outerTableBinderContexts);
         return new BinaryOperationExpression(segment.getStartIndex(), 
segment.getStopIndex(), boundedLeft, boundedRight, segment.getOperator(), 
segment.getText());
     }
 }
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 09d41cf9e18..e5143f6b668 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
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.expression.impl;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.exception.AmbiguousColumnException;
 import org.apache.shardingsphere.infra.exception.UnknownColumnException;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
@@ -32,6 +33,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Column segment binder.
@@ -45,28 +47,39 @@ public final class ColumnSegmentBinder {
      * Bind column segment with metadata.
      *
      * @param segment table segment
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @param outerTableBinderContexts outer table binder contexts
      * @return bounded column segment
      */
-    public static ColumnSegment bind(final ColumnSegment segment, final 
Map<String, TableSegmentBinderContext> tableBinderContexts,
-                                     final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
+    public static ColumnSegment bind(final ColumnSegment segment, final 
SQLStatementBinderContext statementBinderContext,
+                                     final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         if 
(EXCLUDE_BIND_COLUMNS.contains(segment.getIdentifier().getValue().toUpperCase()))
 {
             return segment;
         }
         ColumnSegment result = new ColumnSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier());
         segment.getOwner().ifPresent(result::setOwner);
-        Collection<TableSegmentBinderContext> tableBinderContextValues =
-                segment.getOwner().isPresent() ? 
getTableBinderContextByOwner(segment.getOwner().get().getIdentifier().getValue(),
 tableBinderContexts, outerTableBinderContexts)
-                        : tableBinderContexts.values();
-        ColumnSegment inputColumnSegment = 
findInputColumnSegment(segment.getIdentifier().getValue(), 
tableBinderContextValues);
-        result.setOriginalDatabase(inputColumnSegment.getOriginalDatabase());
-        result.setOriginalSchema(inputColumnSegment.getOriginalSchema());
-        result.setOriginalTable(null == segment.getOriginalTable() ? 
inputColumnSegment.getOriginalTable() : segment.getOriginalTable());
+        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());
         return result;
     }
     
+    private static Collection<TableSegmentBinderContext> 
getTableSegmentBinderContexts(final ColumnSegment segment, final 
SQLStatementBinderContext statementBinderContext,
+                                                                               
        final Map<String, TableSegmentBinderContext> tableBinderContexts,
+                                                                               
        final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
+        if 
(!statementBinderContext.getJoinTableProjectionSegments().isEmpty()) {
+            return Collections.singleton(new 
TableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
+        }
+        if (segment.getOwner().isPresent()) {
+            return 
getTableBinderContextByOwner(segment.getOwner().get().getIdentifier().getValue(),
 tableBinderContexts, outerTableBinderContexts);
+        }
+        return tableBinderContexts.values();
+    }
+    
     private static Collection<TableSegmentBinderContext> 
getTableBinderContextByOwner(final String owner, final Map<String, 
TableSegmentBinderContext> tableBinderContexts,
                                                                                
       final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
         if (tableBinderContexts.containsKey(owner)) {
@@ -78,17 +91,18 @@ public final class ColumnSegmentBinder {
         return Collections.emptyList();
     }
     
-    private static ColumnSegment findInputColumnSegment(final String 
columnName, final Collection<TableSegmentBinderContext> tableBinderContexts) {
+    private static Optional<ColumnSegment> findInputColumnSegment(final String 
columnName, final Collection<TableSegmentBinderContext> tableBinderContexts) {
+        ProjectionSegment projectionSegment = null;
         ColumnSegment result = null;
         for (TableSegmentBinderContext each : tableBinderContexts) {
-            ProjectionSegment projectionSegment = 
each.getProjectionSegmentByColumnLabel(columnName);
+            projectionSegment = 
each.getProjectionSegmentByColumnLabel(columnName);
             if (projectionSegment instanceof ColumnProjectionSegment) {
                 ShardingSpherePreconditions.checkState(null == result, () -> 
new AmbiguousColumnException(columnName));
                 result = ((ColumnProjectionSegment) 
projectionSegment).getColumn();
             }
         }
         // TODO optimize exception message according to different segment
-        ShardingSpherePreconditions.checkNotNull(result, () -> new 
UnknownColumnException(columnName));
-        return result;
+        ShardingSpherePreconditions.checkState(null != projectionSegment, () 
-> new UnknownColumnException(columnName));
+        return Optional.ofNullable(result);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ExistsSubqueryExpressionBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ExistsSubqueryExpressionBinder.java
index 001dfdeacd0..7bec71aeab1 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ExistsSubqueryExpressionBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ExistsSubqueryExpressionBinder.java
@@ -20,7 +20,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.expression.impl;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 
@@ -36,14 +36,13 @@ public final class ExistsSubqueryExpressionBinder {
      * Bind exists subquery expression with metadata.
      *
      * @param segment exists subquery expression segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded exists subquery expression segment
      */
-    public static ExistsSubqueryExpression bind(final ExistsSubqueryExpression 
segment, final ShardingSphereMetaData metaData, final String 
defaultDatabaseName,
+    public static ExistsSubqueryExpression bind(final ExistsSubqueryExpression 
segment, final SQLStatementBinderContext statementBinderContext,
                                                 final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
-        SubquerySegment boundedSubquery = 
SubquerySegmentBinder.bind(segment.getSubquery(), metaData, 
defaultDatabaseName, tableBinderContexts);
+        SubquerySegment boundedSubquery = 
SubquerySegmentBinder.bind(segment.getSubquery(), statementBinderContext, 
tableBinderContexts);
         ExistsSubqueryExpression result = new 
ExistsSubqueryExpression(segment.getStartIndex(), segment.getStopIndex(), 
boundedSubquery);
         result.setNot(segment.isNot());
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/InExpressionBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/InExpressionBinder.java
index 5202af1a071..c9386aa34bf 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/InExpressionBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/InExpressionBinder.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
 
@@ -38,15 +38,13 @@ public final class InExpressionBinder {
      * Bind in expression segment with metadata.
      *
      * @param segment in expression
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded in expression
      */
-    public static InExpression bind(final InExpression segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
-                                    final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
-        ExpressionSegment boundedLeft = 
ExpressionSegmentBinder.bind(segment.getLeft(), metaData, defaultDatabaseName, 
tableBinderContexts, Collections.emptyMap());
-        ExpressionSegment boundedRight = 
ExpressionSegmentBinder.bind(segment.getRight(), metaData, defaultDatabaseName, 
tableBinderContexts, Collections.emptyMap());
+    public static InExpression bind(final InExpression segment, final 
SQLStatementBinderContext statementBinderContext, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        ExpressionSegment boundedLeft = 
ExpressionSegmentBinder.bind(segment.getLeft(), statementBinderContext, 
tableBinderContexts, Collections.emptyMap());
+        ExpressionSegment boundedRight = 
ExpressionSegmentBinder.bind(segment.getRight(), statementBinderContext, 
tableBinderContexts, Collections.emptyMap());
         return new InExpression(segment.getStartIndex(), 
segment.getStopIndex(), boundedLeft, boundedRight, segment.isNot());
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/NotExpressionBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/NotExpressionBinder.java
index c29d7137456..55f637a5773 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/NotExpressionBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/NotExpressionBinder.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
 
@@ -38,14 +38,13 @@ public final class NotExpressionBinder {
      * Bind not expression segment with metadata.
      *
      * @param segment not expression
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded not expression
      */
-    public static NotExpression bind(final NotExpression segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+    public static NotExpression bind(final NotExpression segment, final 
SQLStatementBinderContext statementBinderContext,
                                      final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
-        ExpressionSegment boundedExpression = 
ExpressionSegmentBinder.bind(segment.getExpression(), metaData, 
defaultDatabaseName, tableBinderContexts, Collections.emptyMap());
+        ExpressionSegment boundedExpression = 
ExpressionSegmentBinder.bind(segment.getExpression(), statementBinderContext, 
tableBinderContexts, Collections.emptyMap());
         return new NotExpression(segment.getStartIndex(), 
segment.getStopIndex(), boundedExpression, segment.getNotSign());
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubqueryExpressionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubqueryExpressionSegmentBinder.java
index d58fe4bec4b..96881fc6223 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubqueryExpressionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubqueryExpressionSegmentBinder.java
@@ -19,11 +19,12 @@ package 
org.apache.shardingsphere.infra.binder.segment.expression.impl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 
-import java.util.Collections;
+import java.util.Map;
 
 /**
  * Subquery expression segment binder.
@@ -35,12 +36,13 @@ public final class SubqueryExpressionSegmentBinder {
      * Bind subquery expression segment with metadata.
      *
      * @param segment subquery expression segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
+     * @param tableBinderContexts table binder contexts
      * @return bounded subquery expression segment
      */
-    public static SubqueryExpressionSegment bind(final 
SubqueryExpressionSegment segment, final ShardingSphereMetaData metaData, final 
String defaultDatabaseName) {
-        SubquerySegment boundedSubquery = 
SubquerySegmentBinder.bind(segment.getSubquery(), metaData, 
defaultDatabaseName, Collections.emptyMap());
+    public static SubqueryExpressionSegment bind(final 
SubqueryExpressionSegment segment, final SQLStatementBinderContext 
statementBinderContext,
+                                                 final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        SubquerySegment boundedSubquery = 
SubquerySegmentBinder.bind(segment.getSubquery(), statementBinderContext, 
tableBinderContexts);
         return new SubqueryExpressionSegment(boundedSubquery);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinder.java
index 735a3eea94f..1ab567a9f36 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/SubquerySegmentBinder.java
@@ -20,8 +20,8 @@ package 
org.apache.shardingsphere.infra.binder.segment.expression.impl;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 
@@ -37,14 +37,13 @@ public final class SubquerySegmentBinder {
      * Bind subquery segment with metadata.
      *
      * @param segment subquery segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param outerTableBinderContexts outer table binder contexts
      * @return bounded subquery segment
      */
-    public static SubquerySegment bind(final SubquerySegment segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
-                                       final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
-        SelectStatement boundedSelectStatement = new 
SelectStatementBinder().bindCorrelateSubquery(segment.getSelect(), metaData, 
defaultDatabaseName, outerTableBinderContexts);
+    public static SubquerySegment bind(final SubquerySegment segment, final 
SQLStatementBinderContext statementBinderContext, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
+        SelectStatement boundedSelectStatement =
+                new 
SelectStatementBinder().bindCorrelateSubquery(segment.getSelect(), 
statementBinderContext.getMetaData(), 
statementBinderContext.getDefaultDatabaseName(), outerTableBinderContexts);
         SubquerySegment result = new SubquerySegment(segment.getStartIndex(), 
segment.getStopIndex(), boundedSelectStatement);
         result.setSubqueryType(segment.getSubqueryType());
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
index d2f857506c4..c9bbae11196 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
@@ -22,8 +22,7 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.JoinTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SimpleTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SubqueryTableSegmentBinder;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
@@ -41,22 +40,19 @@ public final class TableSegmentBinder {
      * Bind table segment with metadata.
      *
      * @param segment table segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
-     * @param databaseType database type
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded table segment
      */
-    public static TableSegment bind(final TableSegment segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
-                                    final DatabaseType databaseType, final 
Map<String, TableSegmentBinderContext> tableBinderContexts) {
+    public static TableSegment bind(final TableSegment segment, final 
SQLStatementBinderContext statementBinderContext, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         if (segment instanceof SimpleTableSegment) {
-            return SimpleTableSegmentBinder.bind((SimpleTableSegment) segment, 
metaData, defaultDatabaseName, databaseType, tableBinderContexts);
+            return SimpleTableSegmentBinder.bind((SimpleTableSegment) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof JoinTableSegment) {
-            return JoinTableSegmentBinder.bind((JoinTableSegment) segment, 
metaData, defaultDatabaseName, databaseType, tableBinderContexts);
+            return JoinTableSegmentBinder.bind((JoinTableSegment) segment, 
statementBinderContext, tableBinderContexts);
         }
         if (segment instanceof SubqueryTableSegment) {
-            return SubqueryTableSegmentBinder.bind((SubqueryTableSegment) 
segment, metaData, defaultDatabaseName, tableBinderContexts);
+            return SubqueryTableSegmentBinder.bind((SubqueryTableSegment) 
segment, statementBinderContext, tableBinderContexts);
         }
         return segment;
     }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
index 7f826fd107b..9b4c1fac777 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.binder.segment.from;
 
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
 
@@ -27,6 +28,7 @@ import java.util.Map;
 /**
  * Table segment binder context.
  */
+@RequiredArgsConstructor
 public final class TableSegmentBinderContext {
     
     private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinder.java
index 27900490949..240707463cd 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/JoinTableSegmentBinder.java
@@ -22,10 +22,10 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
@@ -50,26 +50,24 @@ public final class JoinTableSegmentBinder {
      * Bind join table segment with metadata.
      *
      * @param segment join table segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
-     * @param databaseType database type
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded join table segment
      */
-    public static JoinTableSegment bind(final JoinTableSegment segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
-                                        final DatabaseType databaseType, final 
Map<String, TableSegmentBinderContext> tableBinderContexts) {
+    public static JoinTableSegment bind(final JoinTableSegment segment, final 
SQLStatementBinderContext statementBinderContext, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         JoinTableSegment result = new JoinTableSegment();
         result.setStartIndex(segment.getStartIndex());
         result.setStopIndex(segment.getStopIndex());
         segment.getAliasSegment().ifPresent(result::setAlias);
-        result.setLeft(TableSegmentBinder.bind(segment.getLeft(), metaData, 
defaultDatabaseName, databaseType, tableBinderContexts));
+        result.setLeft(TableSegmentBinder.bind(segment.getLeft(), 
statementBinderContext, tableBinderContexts));
         result.setNatural(segment.isNatural());
         result.setJoinType(segment.getJoinType());
-        result.setRight(TableSegmentBinder.bind(segment.getRight(), metaData, 
defaultDatabaseName, databaseType, tableBinderContexts));
-        
result.setCondition(ExpressionSegmentBinder.bind(segment.getCondition(), 
metaData, defaultDatabaseName, tableBinderContexts, Collections.emptyMap()));
+        result.setRight(TableSegmentBinder.bind(segment.getRight(), 
statementBinderContext, tableBinderContexts));
+        
result.setCondition(ExpressionSegmentBinder.bind(segment.getCondition(), 
statementBinderContext, tableBinderContexts, Collections.emptyMap()));
         // TODO bind using column in join table segment
         result.setUsing(segment.getUsing());
-        
result.getJoinTableProjectionSegments().addAll(getJoinTableProjectionSegments(result,
 databaseType, tableBinderContexts));
+        
result.getJoinTableProjectionSegments().addAll(getJoinTableProjectionSegments(result,
 statementBinderContext.getDatabaseType(), tableBinderContexts));
+        
statementBinderContext.getJoinTableProjectionSegments().addAll(result.getJoinTableProjectionSegments());
         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 5f1188e1475..dc82e714093 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
@@ -20,12 +20,12 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
 import 
org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
@@ -65,20 +65,17 @@ public final class SimpleTableSegmentBinder {
      * Bind simple table segment with metadata.
      *
      * @param segment simple table segment
-     * @param metaData metaData
-     * @param defaultDatabaseName default database name
-     * @param databaseType database type
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded simple table segment
      */
-    public static SimpleTableSegment bind(final SimpleTableSegment segment, 
final ShardingSphereMetaData metaData, final String defaultDatabaseName,
-                                          final DatabaseType databaseType, 
final Map<String, TableSegmentBinderContext> tableBinderContexts) {
-        IdentifierValue originalDatabase = getDatabaseName(segment, 
defaultDatabaseName, databaseType);
-        IdentifierValue originalSchema = getSchemaName(segment, 
defaultDatabaseName, databaseType);
+    public static SimpleTableSegment bind(final SimpleTableSegment segment, 
final SQLStatementBinderContext statementBinderContext, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        IdentifierValue originalDatabase = getDatabaseName(segment, 
statementBinderContext);
+        IdentifierValue originalSchema = getSchemaName(segment, 
statementBinderContext);
         // TODO check database and schema
-        ShardingSphereSchema schema = 
metaData.getDatabase(originalDatabase.getValue()).getSchema(originalSchema.getValue());
+        ShardingSphereSchema schema = 
statementBinderContext.getMetaData().getDatabase(originalDatabase.getValue()).getSchema(originalSchema.getValue());
         tableBinderContexts.put(segment.getAliasName().orElseGet(() -> 
segment.getTableName().getIdentifier().getValue()),
-                createSimpleTableBinderContext(segment, schema, 
originalDatabase, originalSchema, databaseType));
+                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);
@@ -88,22 +85,23 @@ public final class SimpleTableSegmentBinder {
         return result;
     }
     
-    private static IdentifierValue getDatabaseName(final SimpleTableSegment 
tableSegment, final String defaultDatabaseName, final DatabaseType 
databaseType) {
-        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
+    private static IdentifierValue getDatabaseName(final SimpleTableSegment 
tableSegment, final SQLStatementBinderContext statementBinderContext) {
+        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(statementBinderContext.getDatabaseType()).getDialectDatabaseMetaData();
         Optional<OwnerSegment> owner = 
dialectDatabaseMetaData.getDefaultSchema().isPresent() ? 
tableSegment.getOwner().flatMap(OwnerSegment::getOwner) : 
tableSegment.getOwner();
-        return new IdentifierValue(owner.map(optional -> 
optional.getIdentifier().getValue()).orElse(defaultDatabaseName));
+        return new IdentifierValue(owner.map(optional -> 
optional.getIdentifier().getValue()).orElse(statementBinderContext.getDefaultDatabaseName()));
     }
     
-    private static IdentifierValue getSchemaName(final SimpleTableSegment 
segment, final String defaultDatabaseName, final DatabaseType databaseType) {
+    private static IdentifierValue getSchemaName(final SimpleTableSegment 
segment, final SQLStatementBinderContext statementBinderContext) {
         if (segment.getOwner().isPresent()) {
             return segment.getOwner().get().getIdentifier();
         }
         // TODO getSchemaName according to search path
+        DatabaseType databaseType = statementBinderContext.getDatabaseType();
         if ((databaseType instanceof PostgreSQLDatabaseType || databaseType 
instanceof OpenGaussDatabaseType)
                 && 
SYSTEM_CATALOG_TABLES.contains(segment.getTableName().getIdentifier().getValue().toLowerCase()))
 {
             return new IdentifierValue(PG_CATALOG);
         }
-        return new IdentifierValue(new 
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(defaultDatabaseName));
+        return new IdentifierValue(new 
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(statementBinderContext.getDefaultDatabaseName()));
     }
     
     private static TableSegmentBinderContext 
createSimpleTableBinderContext(final SimpleTableSegment segment, final 
ShardingSphereSchema schema,
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 a5f706d60b6..96486d7ae9a 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
@@ -21,8 +21,8 @@ import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
@@ -48,14 +48,13 @@ public final class SubqueryTableSegmentBinder {
      * Bind subquery table segment with metadata.
      *
      * @param segment join table segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded subquery table segment
      */
-    public static SubqueryTableSegment bind(final SubqueryTableSegment 
segment, final ShardingSphereMetaData metaData, final String 
defaultDatabaseName,
+    public static SubqueryTableSegment bind(final SubqueryTableSegment 
segment, final SQLStatementBinderContext statementBinderContext,
                                             final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
-        SelectStatement boundedSelect = new 
SelectStatementBinder().bind(segment.getSubquery().getSelect(), metaData, 
defaultDatabaseName);
+        SelectStatement boundedSelect = new 
SelectStatementBinder().bind(segment.getSubquery().getSelect(), 
statementBinderContext.getMetaData(), 
statementBinderContext.getDefaultDatabaseName());
         SubquerySegment boundedSubquerySegment = new 
SubquerySegment(segment.getSubquery().getStartIndex(), 
segment.getSubquery().getStopIndex(), boundedSelect);
         
boundedSubquerySegment.setSubqueryType(segment.getSubquery().getSubqueryType());
         SubqueryTableSegment result = new 
SubqueryTableSegment(boundedSubquerySegment);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
index be821dc75be..3a8dee476fc 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderCon
 import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.ColumnProjectionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.ShorthandProjectionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.SubqueryProjectionSegmentBinder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 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.dml.item.ProjectionsSegment;
@@ -43,30 +43,29 @@ public final class ProjectionsSegmentBinder {
      * Bind projections segment with metadata.
      *
      * @param segment table segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param boundedTableSegment bounded table segment
      * @param tableBinderContexts table binder contexts
      * @return bounded projections segment
      */
-    public static ProjectionsSegment bind(final ProjectionsSegment segment, 
final ShardingSphereMetaData metaData, final String defaultDatabaseName, final 
TableSegment boundedTableSegment,
+    public static ProjectionsSegment bind(final ProjectionsSegment segment, 
final SQLStatementBinderContext statementBinderContext, final TableSegment 
boundedTableSegment,
                                           final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         ProjectionsSegment result = new 
ProjectionsSegment(segment.getStartIndex(), segment.getStopIndex());
         result.setDistinctRow(segment.isDistinctRow());
-        segment.getProjections().forEach(each -> 
result.getProjections().add(bind(each, metaData, defaultDatabaseName, 
boundedTableSegment, tableBinderContexts)));
+        segment.getProjections().forEach(each -> 
result.getProjections().add(bind(each, statementBinderContext, 
boundedTableSegment, tableBinderContexts)));
         return result;
     }
     
-    private static ProjectionSegment bind(final ProjectionSegment 
projectionSegment, final ShardingSphereMetaData metaData, final String 
defaultDatabaseName, final TableSegment boundedTableSegment,
-                                          final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+    private static ProjectionSegment bind(final ProjectionSegment 
projectionSegment, final SQLStatementBinderContext statementBinderContext,
+                                          final TableSegment 
boundedTableSegment, final Map<String, TableSegmentBinderContext> 
tableBinderContexts) {
         if (projectionSegment instanceof ColumnProjectionSegment) {
-            return 
ColumnProjectionSegmentBinder.bind((ColumnProjectionSegment) projectionSegment, 
tableBinderContexts);
+            return 
ColumnProjectionSegmentBinder.bind((ColumnProjectionSegment) projectionSegment, 
statementBinderContext, tableBinderContexts);
         }
         if (projectionSegment instanceof ShorthandProjectionSegment) {
             return 
ShorthandProjectionSegmentBinder.bind((ShorthandProjectionSegment) 
projectionSegment, boundedTableSegment, tableBinderContexts);
         }
         if (projectionSegment instanceof SubqueryProjectionSegment) {
-            return 
SubqueryProjectionSegmentBinder.bind((SubqueryProjectionSegment) 
projectionSegment, metaData, defaultDatabaseName, tableBinderContexts);
+            return 
SubqueryProjectionSegmentBinder.bind((SubqueryProjectionSegment) 
projectionSegment, statementBinderContext, tableBinderContexts);
         }
         // TODO support more ProjectionSegment bind
         return projectionSegment;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
index de825507e76..d1ae82549f9 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.ColumnSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 
@@ -37,11 +38,13 @@ public final class ColumnProjectionSegmentBinder {
      * Bind column projection segment with metadata.
      *
      * @param segment table segment
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @return bounded column projection segment
      */
-    public static ColumnProjectionSegment bind(final ColumnProjectionSegment 
segment, final Map<String, TableSegmentBinderContext> tableBinderContexts) {
-        ColumnSegment boundedColumn = 
ColumnSegmentBinder.bind(segment.getColumn(), tableBinderContexts, 
Collections.emptyMap());
+    public static ColumnProjectionSegment bind(final ColumnProjectionSegment 
segment, final SQLStatementBinderContext statementBinderContext,
+                                               final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        ColumnSegment boundedColumn = 
ColumnSegmentBinder.bind(segment.getColumn(), statementBinderContext, 
tableBinderContexts, Collections.emptyMap());
         ColumnProjectionSegment result = new 
ColumnProjectionSegment(boundedColumn);
         segment.getAliasSegment().ifPresent(result::setAlias);
         result.setVisible(segment.isVisible());
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
index bcc8a68046a..b9bce1b6a8e 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.SubquerySegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
 
@@ -37,14 +37,13 @@ public final class SubqueryProjectionSegmentBinder {
      * Bind subquery projection segment with metadata.
      *
      * @param segment subquery projection segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
-     * @param outerTableBinderContexts outer table binder contexts
+     * @param statementBinderContext statement binder context
+     * @param tableBinderContexts table binder contexts
      * @return bounded subquery projection segment
      */
-    public static SubqueryProjectionSegment bind(final 
SubqueryProjectionSegment segment, final ShardingSphereMetaData metaData, final 
String defaultDatabaseName,
-                                                 final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
-        SubquerySegment boundedSubquerySegment = 
SubquerySegmentBinder.bind(segment.getSubquery(), metaData, 
defaultDatabaseName, outerTableBinderContexts);
+    public static SubqueryProjectionSegment bind(final 
SubqueryProjectionSegment segment, final SQLStatementBinderContext 
statementBinderContext,
+                                                 final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        SubquerySegment boundedSubquerySegment = 
SubquerySegmentBinder.bind(segment.getSubquery(), statementBinderContext, 
tableBinderContexts);
         SubqueryProjectionSegment result = new 
SubqueryProjectionSegment(boundedSubquerySegment, segment.getText());
         segment.getAliasSegment().ifPresent(result::setAlias);
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/where/WhereSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/where/WhereSegmentBinder.java
index 958e0f7212f..129655fbc15 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/where/WhereSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/where/WhereSegmentBinder.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 
 import java.util.Map;
@@ -36,15 +36,14 @@ public final class WhereSegmentBinder {
      * Bind where segment with metadata.
      *
      * @param segment where segment
-     * @param metaData meta data
-     * @param defaultDatabaseName default database name
+     * @param statementBinderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @param outerTableBinderContexts outer table binder contexts
      * @return bounded where segment
      */
-    public static WhereSegment bind(final WhereSegment segment, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+    public static WhereSegment bind(final WhereSegment segment, final 
SQLStatementBinderContext statementBinderContext,
                                     final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         return new WhereSegment(segment.getStartIndex(), 
segment.getStopIndex(),
-                ExpressionSegmentBinder.bind(segment.getExpr(), metaData, 
defaultDatabaseName, tableBinderContexts, outerTableBinderContexts));
+                ExpressionSegmentBinder.bind(segment.getExpr(), 
statementBinderContext, tableBinderContexts, outerTableBinderContexts));
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinderContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinderContext.java
new file mode 100644
index 00000000000..999a6a72635
--- /dev/null
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinderContext.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.binder.statement;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * SQL statement binder context.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class SQLStatementBinderContext {
+    
+    private final ShardingSphereMetaData metaData;
+    
+    private final String defaultDatabaseName;
+    
+    private final DatabaseType databaseType;
+    
+    private final Collection<ProjectionSegment> joinTableProjectionSegments = 
new LinkedList<>();
+}
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
index 54a7da4ca85..d58817d9531 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.binder.statement.dml;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.impl.SubquerySegmentBinder;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
@@ -37,7 +38,8 @@ public final class InsertStatementBinder implements 
SQLStatementBinder<InsertSta
         InsertStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
         result.setTable(sqlStatement.getTable());
         sqlStatement.getInsertColumns().ifPresent(result::setInsertColumns);
-        sqlStatement.getInsertSelect().ifPresent(optional -> 
result.setInsertSelect(SubquerySegmentBinder.bind(optional, metaData, 
defaultDatabaseName, Collections.emptyMap())));
+        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(metaData, defaultDatabaseName, 
sqlStatement.getDatabaseType());
+        sqlStatement.getInsertSelect().ifPresent(optional -> 
result.setInsertSelect(SubquerySegmentBinder.bind(optional, 
statementBinderContext, Collections.emptyMap())));
         result.getValues().addAll(sqlStatement.getValues());
         
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(sqlStatement).ifPresent(optional
 -> InsertStatementHandler.setOnDuplicateKeyColumnsSegment(result, optional));
         
InsertStatementHandler.getSetAssignmentSegment(sqlStatement).ifPresent(optional 
-> InsertStatementHandler.setSetAssignmentSegment(result, optional));
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java
index 8bb18aed501..1bed325df42 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementBinder.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderCon
 import 
org.apache.shardingsphere.infra.binder.segment.projection.ProjectionsSegmentBinder;
 import org.apache.shardingsphere.infra.binder.segment.where.WhereSegmentBinder;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
@@ -49,15 +50,16 @@ public final class SelectStatementBinder implements 
SQLStatementBinder<SelectSta
                                  final Map<String, TableSegmentBinderContext> 
outerTableBinderContexts) {
         SelectStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getFrom(), metaData, defaultDatabaseName, 
sqlStatement.getDatabaseType(), tableBinderContexts);
+        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(metaData, defaultDatabaseName, 
sqlStatement.getDatabaseType());
+        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getFrom(), statementBinderContext, 
tableBinderContexts);
         result.setFrom(boundedTableSegment);
-        
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
 metaData, defaultDatabaseName, boundedTableSegment, tableBinderContexts));
+        
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
 statementBinderContext, boundedTableSegment, tableBinderContexts));
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, outerTableBinderContexts)));
         // TODO support other segment bind in select statement
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, metaData, 
defaultDatabaseName, tableBinderContexts, outerTableBinderContexts)));
         sqlStatement.getGroupBy().ifPresent(result::setGroupBy);
         sqlStatement.getHaving().ifPresent(result::setHaving);
         sqlStatement.getOrderBy().ifPresent(result::setOrderBy);
-        sqlStatement.getCombine().ifPresent(optional -> 
result.setCombine(CombineSegmentBinder.bind(optional, metaData, 
defaultDatabaseName)));
+        sqlStatement.getCombine().ifPresent(optional -> 
result.setCombine(CombineSegmentBinder.bind(optional, statementBinderContext)));
         
SelectStatementHandler.getLimitSegment(sqlStatement).ifPresent(optional -> 
SelectStatementHandler.setLimitSegment(result, optional));
         SelectStatementHandler.getLockSegment(sqlStatement).ifPresent(optional 
-> SelectStatementHandler.setLockSegment(result, optional));
         
SelectStatementHandler.getWindowSegment(sqlStatement).ifPresent(optional -> 
SelectStatementHandler.setWindowSegment(result, optional));
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 cfb5a60131a..cdd65583524 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
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import org.apache.commons.collections4.map.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -65,7 +66,7 @@ class JoinTableSegmentBinderTest {
         when(joinTableSegment.getRight()).thenReturn(rightTable);
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
@@ -106,7 +107,7 @@ class JoinTableSegmentBinderTest {
         when(joinTableSegment.getRight()).thenReturn(rightTable);
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
@@ -131,7 +132,7 @@ class JoinTableSegmentBinderTest {
         when(joinTableSegment.getJoinType()).thenReturn(JoinType.RIGHT.name());
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
@@ -170,7 +171,7 @@ class JoinTableSegmentBinderTest {
         when(joinTableSegment.getUsing()).thenReturn(Arrays.asList(new 
ColumnSegment(0, 0, new IdentifierValue("status")), new ColumnSegment(0, 0, new 
IdentifierValue("order_id"))));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
@@ -208,7 +209,7 @@ class JoinTableSegmentBinderTest {
         when(joinTableSegment.getRight()).thenReturn(rightTable);
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        JoinTableSegment actual = 
JoinTableSegmentBinder.bind(joinTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
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 38b3304c5c9..64d8d823e51 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
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import org.apache.commons.collections4.map.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -52,7 +53,7 @@ class SimpleTableSegmentBinderTest {
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
         assertTrue(tableBinderContexts.containsKey("t_order"));
@@ -86,7 +87,7 @@ class SimpleTableSegmentBinderTest {
         simpleTableSegment.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db")));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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"));
     }
@@ -96,7 +97,7 @@ class SimpleTableSegmentBinderTest {
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, databaseType, tableBinderContexts);
+        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));
     }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinderTest.java
index cb40d44ee8c..8cff2484e1d 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinderTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import org.apache.commons.collections4.map.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -69,7 +70,7 @@ class SubqueryTableSegmentBinderTest {
         subqueryTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("temp")));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, tableBinderContexts);
+        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getAlias().isPresent());
         assertTrue(tableBinderContexts.containsKey("temp"));
         List<ProjectionSegment> projectionSegments = new 
ArrayList<>(tableBinderContexts.get("temp").getProjectionSegments());
@@ -102,7 +103,7 @@ class SubqueryTableSegmentBinderTest {
         subqueryTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("temp")));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, tableBinderContexts);
+        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertTrue(actual.getAlias().isPresent());
         assertTrue(tableBinderContexts.containsKey("temp"));
         List<ProjectionSegment> projectionSegments = new 
ArrayList<>(tableBinderContexts.get("temp").getProjectionSegments());
@@ -124,7 +125,7 @@ class SubqueryTableSegmentBinderTest {
         SubqueryTableSegment subqueryTableSegment = new 
SubqueryTableSegment(new SubquerySegment(0, 0, selectStatement));
         ShardingSphereMetaData metaData = createMetaData();
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
-        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, tableBinderContexts);
+        SubqueryTableSegment actual = 
SubqueryTableSegmentBinder.bind(subqueryTableSegment, new 
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType), 
tableBinderContexts);
         assertFalse(actual.getAlias().isPresent());
         assertTrue(tableBinderContexts.containsKey(""));
     }

Reply via email to