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

sunnianjun 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 b4d7ff303f1 Refactor SQLStatementBinder (#32058)
b4d7ff303f1 is described below

commit b4d7ff303f1db02d085d35c08528914aa4d1fe62
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 10 22:09:49 2024 +0800

    Refactor SQLStatementBinder (#32058)
    
    * Refactor SQLStatementBinder
    
    * Refactor SQLStatementBinder
---
 .../segment/combine/CombineSegmentBinder.java      | 13 +++++-
 .../expression/impl/SubquerySegmentBinder.java     |  5 +-
 .../from/impl/SubqueryTableSegmentBinder.java      |  6 ++-
 .../infra/binder/statement/SQLStatementBinder.java |  6 +--
 .../statement/ddl/CursorStatementBinder.java       |  6 +--
 .../statement/dml/DeleteStatementBinder.java       | 14 ++----
 .../statement/dml/InsertStatementBinder.java       | 17 ++-----
 .../statement/dml/SelectStatementBinder.java       | 53 +++++-----------------
 .../statement/dml/UpdateStatementBinder.java       | 16 ++-----
 .../infra/binder/type/DDLStatementBindEngine.java  |  4 +-
 .../infra/binder/type/DMLStatementBindEngine.java  | 10 ++--
 .../statement/DeleteStatementBinderTest.java       |  2 +-
 .../statement/InsertStatementBinderTest.java       |  6 +--
 .../statement/SelectStatementBinderTest.java       | 14 +++---
 .../statement/UpdateStatementBinderTest.java       |  2 +-
 15 files changed, 67 insertions(+), 107 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 b15c09dcc00..3390eb13d86 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
@@ -46,8 +46,10 @@ public final class CombineSegmentBinder {
         ShardingSphereMetaData metaData = statementBinderContext.getMetaData();
         String currentDatabaseName = 
statementBinderContext.getCurrentDatabaseName();
         Map<String, TableSegmentBinderContext> externalTableBinderContexts = 
statementBinderContext.getExternalTableBinderContexts();
-        SelectStatement boundLeftSelect = new 
SelectStatementBinder().bind(segment.getLeft().getSelect(), metaData, 
currentDatabaseName, externalTableBinderContexts);
-        SelectStatement boundRightSelect = new 
SelectStatementBinder().bind(segment.getRight().getSelect(), metaData, 
currentDatabaseName, externalTableBinderContexts);
+        SelectStatement boundLeftSelect = new SelectStatementBinder().bind(
+                segment.getLeft().getSelect(), 
createBinderContext(segment.getLeft().getSelect(), metaData, 
currentDatabaseName, externalTableBinderContexts));
+        SelectStatement boundRightSelect = new SelectStatementBinder().bind(
+                segment.getRight().getSelect(), 
createBinderContext(segment.getRight().getSelect(), metaData, 
currentDatabaseName, externalTableBinderContexts));
         SubquerySegment boundLeft = new 
SubquerySegment(segment.getLeft().getStartIndex(), 
segment.getLeft().getStopIndex(), segment.getLeft().getText());
         boundLeft.setSelect(boundLeftSelect);
         boundLeft.setSubqueryType(segment.getLeft().getSubqueryType());
@@ -56,4 +58,11 @@ public final class CombineSegmentBinder {
         boundedRight.setSubqueryType(segment.getRight().getSubqueryType());
         return new CombineSegment(segment.getStartIndex(), 
segment.getStopIndex(), boundLeft, segment.getCombineType(), boundedRight);
     }
+    
+    private static SQLStatementBinderContext createBinderContext(final 
SelectStatement select, final ShardingSphereMetaData metaData,
+                                                                 final String 
currentDatabaseName, final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+        SQLStatementBinderContext result = new 
SQLStatementBinderContext(select, metaData, currentDatabaseName);
+        
result.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
+        return result;
+    }
 }
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 293d03cb85f..f695b9f9ea4 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
@@ -42,8 +42,9 @@ public final class SubquerySegmentBinder {
      * @return bounded subquery segment
      */
     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.getCurrentDatabaseName(), 
outerTableBinderContexts, 
statementBinderContext.getExternalTableBinderContexts());
+        SQLStatementBinderContext binderContext = new 
SQLStatementBinderContext(segment.getSelect(), 
statementBinderContext.getMetaData(), 
statementBinderContext.getCurrentDatabaseName());
+        
binderContext.getExternalTableBinderContexts().putAll(statementBinderContext.getExternalTableBinderContexts());
+        SelectStatement boundedSelectStatement = new 
SelectStatementBinder(outerTableBinderContexts).bind(segment.getSelect(), 
binderContext);
         SubquerySegment result = new SubquerySegment(segment.getStartIndex(), 
segment.getStopIndex(), boundedSelectStatement, segment.getText());
         result.setSubqueryType(segment.getSubqueryType());
         return result;
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 c56cf8f0c57..b3b55f7b959 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
@@ -68,8 +68,10 @@ public final class SubqueryTableSegmentBinder {
     public static SubqueryTableSegment bind(final SubqueryTableSegment 
segment, final SQLStatementBinderContext statementBinderContext,
                                             final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         fillPivotColumnNamesInBinderContext(segment, statementBinderContext);
-        SelectStatement boundedSelect = new 
SelectStatementBinder().bindCorrelateSubquery(segment.getSubquery().getSelect(),
 statementBinderContext.getMetaData(),
-                statementBinderContext.getCurrentDatabaseName(), 
outerTableBinderContexts, 
statementBinderContext.getExternalTableBinderContexts());
+        SQLStatementBinderContext binderContext = new 
SQLStatementBinderContext(
+                segment.getSubquery().getSelect(), 
statementBinderContext.getMetaData(), 
statementBinderContext.getCurrentDatabaseName());
+        
binderContext.getExternalTableBinderContexts().putAll(statementBinderContext.getExternalTableBinderContexts());
+        SelectStatement boundedSelect = new 
SelectStatementBinder(outerTableBinderContexts).bind(segment.getSubquery().getSelect(),
 binderContext);
         SubquerySegment boundedSubquerySegment = new 
SubquerySegment(segment.getSubquery().getStartIndex(), 
segment.getSubquery().getStopIndex(), boundedSelect, 
segment.getSubquery().getText());
         
boundedSubquerySegment.setSubqueryType(segment.getSubquery().getSubqueryType());
         IdentifierValue subqueryTableName = 
segment.getAliasSegment().map(AliasSegment::getIdentifier).orElseGet(() -> new 
IdentifierValue(""));
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinder.java
index 54280df826e..a3682154128 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinder.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.binder.statement;
 
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 
 /**
@@ -31,9 +30,8 @@ public interface SQLStatementBinder<T extends SQLStatement> {
      * Bind SQL statement.
      *
      * @param sqlStatement SQL statement
-     * @param metaData meta data
-     * @param currentDatabaseName current database name
+     * @param binderContext SQL statement binder context
      * @return bound SQL statement
      */
-    T bind(T sqlStatement, ShardingSphereMetaData metaData, String 
currentDatabaseName);
+    T bind(T sqlStatement, SQLStatementBinderContext binderContext);
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java
index 80c79ca28f8..5d56b77303a 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementBinder.java
@@ -19,8 +19,8 @@ package org.apache.shardingsphere.infra.binder.statement.ddl;
 
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
+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.statement.core.statement.ddl.CursorStatement;
 
 /**
@@ -29,9 +29,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorS
 public final class CursorStatementBinder implements 
SQLStatementBinder<CursorStatement> {
     
     @Override
-    public CursorStatement bind(final CursorStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
+    public CursorStatement bind(final CursorStatement sqlStatement, final 
SQLStatementBinderContext binderContext) {
         CursorStatement result = copy(sqlStatement);
-        result.setSelect(new 
SelectStatementBinder().bind(sqlStatement.getSelect(), metaData, 
currentDatabaseName));
+        result.setSelect(new 
SelectStatementBinder().bind(sqlStatement.getSelect(), binderContext));
         return result;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
index be35eae4d0b..8f651b2ec6e 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
@@ -23,7 +23,6 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderCon
 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.statement.core.statement.dml.DeleteStatement;
 
 import java.util.Collections;
@@ -36,18 +35,11 @@ import java.util.Map;
 public final class DeleteStatementBinder implements 
SQLStatementBinder<DeleteStatement> {
     
     @Override
-    public DeleteStatement bind(final DeleteStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
Collections.emptyMap());
-    }
-    
-    private DeleteStatement bind(final DeleteStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                 final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+    public DeleteStatement bind(final DeleteStatement sqlStatement, final 
SQLStatementBinderContext binderContext) {
         DeleteStatement result = copy(sqlStatement);
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
-        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(sqlStatement, metaData, currentDatabaseName);
-        
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
-        result.setTable(TableSegmentBinder.bind(sqlStatement.getTable(), 
statementBinderContext, tableBinderContexts, Collections.emptyMap()));
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, Collections.emptyMap())));
+        result.setTable(TableSegmentBinder.bind(sqlStatement.getTable(), 
binderContext, tableBinderContexts, Collections.emptyMap()));
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, Collections.emptyMap())));
         return result;
     }
     
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 de385645322..c94df3c2f3e 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
@@ -24,14 +24,12 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderCon
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SimpleTableSegmentBinder;
 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.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -43,24 +41,17 @@ import java.util.stream.Collectors;
 public final class InsertStatementBinder implements 
SQLStatementBinder<InsertStatement> {
     
     @Override
-    public InsertStatement bind(final InsertStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
Collections.emptyMap());
-    }
-    
-    private InsertStatement bind(final InsertStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                 final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+    public InsertStatement bind(final InsertStatement sqlStatement, final 
SQLStatementBinderContext binderContext) {
         InsertStatement result = copy(sqlStatement);
-        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(sqlStatement, metaData, currentDatabaseName);
-        
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
-        Optional.ofNullable(sqlStatement.getTable()).ifPresent(optional -> 
result.setTable(SimpleTableSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts)));
+        Optional.ofNullable(sqlStatement.getTable()).ifPresent(optional -> 
result.setTable(SimpleTableSegmentBinder.bind(optional, binderContext, 
tableBinderContexts)));
         if (sqlStatement.getInsertColumns().isPresent() && 
!sqlStatement.getInsertColumns().get().getColumns().isEmpty()) {
-            
result.setInsertColumns(InsertColumnsSegmentBinder.bind(sqlStatement.getInsertColumns().get(),
 statementBinderContext, tableBinderContexts));
+            
result.setInsertColumns(InsertColumnsSegmentBinder.bind(sqlStatement.getInsertColumns().get(),
 binderContext, tableBinderContexts));
         } else {
             
sqlStatement.getInsertColumns().ifPresent(result::setInsertColumns);
             tableBinderContexts.values().forEach(each -> 
result.getDerivedInsertColumns().addAll(getVisibleColumns(each.getProjectionSegments())));
         }
-        sqlStatement.getInsertSelect().ifPresent(optional -> 
result.setInsertSelect(SubquerySegmentBinder.bind(optional, 
statementBinderContext, tableBinderContexts)));
+        sqlStatement.getInsertSelect().ifPresent(optional -> 
result.setInsertSelect(SubquerySegmentBinder.bind(optional, binderContext, 
tableBinderContexts)));
         return result;
     }
     
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 a4f9ce4f8ba..2568b7c9c84 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.binder.statement.dml;
 
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.binder.segment.combine.CombineSegmentBinder;
 import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
@@ -27,7 +28,6 @@ import 
org.apache.shardingsphere.infra.binder.segment.where.WhereSegmentBinder;
 import org.apache.shardingsphere.infra.binder.segment.with.WithSegmentBinder;
 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.statement.core.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
 
@@ -39,56 +39,27 @@ import java.util.Optional;
 /**
  * Select statement binder.
  */
+@RequiredArgsConstructor
 public final class SelectStatementBinder implements 
SQLStatementBinder<SelectStatement> {
     
-    /**
-     * Bind correlate subquery select statement.
-     *
-     * @param sqlStatement subquery select statement
-     * @param metaData meta data
-     * @param currentDatabaseName current database name
-     * @param outerTableBinderContexts outer select statement table binder 
contexts
-     * @param externalTableBinderContexts external table binder contexts
-     * @return bounded correlate subquery select statement
-     */
-    public SelectStatement bindCorrelateSubquery(final SelectStatement 
sqlStatement, final ShardingSphereMetaData metaData, final String 
currentDatabaseName,
-                                                 final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts, final Map<String, 
TableSegmentBinderContext> externalTableBinderContexts) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
outerTableBinderContexts, externalTableBinderContexts);
-    }
+    private final Map<String, TableSegmentBinderContext> 
outerTableBinderContexts;
     
-    /**
-     * Bind with external table contexts.
-     *
-     * @param statement select statement
-     * @param metaData meta data
-     * @param currentDatabaseName current database name
-     * @param externalTableContexts external table contexts
-     * @return select statement
-     */
-    public SelectStatement bind(final SelectStatement statement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                final Map<String, TableSegmentBinderContext> 
externalTableContexts) {
-        return bind(statement, metaData, currentDatabaseName, 
Collections.emptyMap(), externalTableContexts);
+    public SelectStatementBinder() {
+        outerTableBinderContexts = Collections.emptyMap();
     }
     
     @Override
-    public SelectStatement bind(final SelectStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
Collections.emptyMap(), Collections.emptyMap());
-    }
-    
-    private SelectStatement bind(final SelectStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                 final Map<String, TableSegmentBinderContext> 
outerTableBinderContexts, final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+    public SelectStatement bind(final SelectStatement sqlStatement, final 
SQLStatementBinderContext binderContext) {
         SelectStatement result = copy(sqlStatement);
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
-        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(sqlStatement, metaData, currentDatabaseName);
-        
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
         sqlStatement.getWithSegment()
-                .ifPresent(optional -> 
result.setWithSegment(WithSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, statementBinderContext.getExternalTableBinderContexts())));
-        Optional<TableSegment> boundedTableSegment = 
sqlStatement.getFrom().map(optional -> TableSegmentBinder.bind(optional, 
statementBinderContext, tableBinderContexts, outerTableBinderContexts));
+                .ifPresent(optional -> 
result.setWithSegment(WithSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, binderContext.getExternalTableBinderContexts())));
+        Optional<TableSegment> boundedTableSegment = 
sqlStatement.getFrom().map(optional -> TableSegmentBinder.bind(optional, 
binderContext, tableBinderContexts, outerTableBinderContexts));
         boundedTableSegment.ifPresent(result::setFrom);
-        
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
 statementBinderContext, boundedTableSegment.orElse(null), tableBinderContexts, 
outerTableBinderContexts));
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, outerTableBinderContexts)));
-        sqlStatement.getCombine().ifPresent(optional -> 
result.setCombine(CombineSegmentBinder.bind(optional, statementBinderContext)));
-        sqlStatement.getLock().ifPresent(optional -> 
result.setLock(LockSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, outerTableBinderContexts)));
+        
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
 binderContext, boundedTableSegment.orElse(null), tableBinderContexts, 
outerTableBinderContexts));
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, outerTableBinderContexts)));
+        sqlStatement.getCombine().ifPresent(optional -> 
result.setCombine(CombineSegmentBinder.bind(optional, binderContext)));
+        sqlStatement.getLock().ifPresent(optional -> 
result.setLock(LockSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, outerTableBinderContexts)));
         // TODO support other segment bind in select statement
         return result;
     }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
index 104913ec9b5..773519caa47 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
@@ -24,7 +24,6 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderCon
 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.statement.core.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
 
@@ -38,20 +37,13 @@ import java.util.Map;
 public final class UpdateStatementBinder implements 
SQLStatementBinder<UpdateStatement> {
     
     @Override
-    public UpdateStatement bind(final UpdateStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName) {
-        return bind(sqlStatement, metaData, currentDatabaseName, 
Collections.emptyMap());
-    }
-    
-    private UpdateStatement bind(final UpdateStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String currentDatabaseName,
-                                 final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+    public UpdateStatement bind(final UpdateStatement sqlStatement, final 
SQLStatementBinderContext binderContext) {
         UpdateStatement result = copy(sqlStatement);
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
-        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(sqlStatement, metaData, currentDatabaseName);
-        
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
-        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext, 
tableBinderContexts, Collections.emptyMap());
+        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getTable(), binderContext, 
tableBinderContexts, Collections.emptyMap());
         result.setTable(boundedTableSegment);
-        sqlStatement.getAssignmentSegment().ifPresent(optional -> 
result.setSetAssignment(AssignmentSegmentBinder.bind(optional, 
statementBinderContext, tableBinderContexts, Collections.emptyMap())));
-        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, Collections.emptyMap())));
+        sqlStatement.getAssignmentSegment().ifPresent(optional -> 
result.setSetAssignment(AssignmentSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, Collections.emptyMap())));
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, binderContext, 
tableBinderContexts, Collections.emptyMap())));
         return result;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DDLStatementBindEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DDLStatementBindEngine.java
index c1e72c42c0f..d87c6f442f0 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DDLStatementBindEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DDLStatementBindEngine.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.binder.type;
 
 import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementBinder;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement;
@@ -40,8 +41,9 @@ public final class DDLStatementBindEngine {
      * @return bound DDL statement
      */
     public DDLStatement bind(final DDLStatement statement) {
+        SQLStatementBinderContext binderContext = new 
SQLStatementBinderContext(statement, metaData, currentDatabaseName);
         if (statement instanceof CursorStatement) {
-            return new CursorStatementBinder().bind((CursorStatement) 
statement, metaData, currentDatabaseName);
+            return new CursorStatementBinder().bind((CursorStatement) 
statement, binderContext);
         }
         return statement;
     }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
index 72bbd3fdc65..c2c74aa6f23 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/type/DMLStatementBindEngine.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.binder.type;
 
 import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
@@ -46,17 +47,18 @@ public final class DMLStatementBindEngine {
      * @return bound DML statement
      */
     public DMLStatement bind(final DMLStatement statement) {
+        SQLStatementBinderContext binderContext = new 
SQLStatementBinderContext(statement, metaData, currentDatabaseName);
         if (statement instanceof SelectStatement) {
-            return new SelectStatementBinder().bind((SelectStatement) 
statement, metaData, currentDatabaseName);
+            return new SelectStatementBinder().bind((SelectStatement) 
statement, binderContext);
         }
         if (statement instanceof InsertStatement) {
-            return new InsertStatementBinder().bind((InsertStatement) 
statement, metaData, currentDatabaseName);
+            return new InsertStatementBinder().bind((InsertStatement) 
statement, binderContext);
         }
         if (statement instanceof UpdateStatement) {
-            return new UpdateStatementBinder().bind((UpdateStatement) 
statement, metaData, currentDatabaseName);
+            return new UpdateStatementBinder().bind((UpdateStatement) 
statement, binderContext);
         }
         if (statement instanceof DeleteStatement) {
-            return new DeleteStatementBinder().bind((DeleteStatement) 
statement, metaData, currentDatabaseName);
+            return new DeleteStatementBinder().bind((DeleteStatement) 
statement, binderContext);
         }
         return statement;
     }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
index efdd4c7a761..03c41344e28 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
@@ -54,7 +54,7 @@ class DeleteStatementBinderTest {
         deleteStatement.setTable(simpleTableSegment);
         deleteStatement.setWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("status")),
                 new LiteralExpressionSegment(0, 0, 0), "=", "status = 1")));
-        DeleteStatement actual = new 
DeleteStatementBinder().bind(deleteStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        DeleteStatement actual = new 
DeleteStatementBinder().bind(deleteStatement, new 
SQLStatementBinderContext(deleteStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(deleteStatement));
         assertThat(actual.getTable(), not(deleteStatement.getTable()));
         assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class));
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/InsertStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/InsertStatementBinderTest.java
index ea06a6eff2c..54d65a5bcfe 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/InsertStatementBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/InsertStatementBinderTest.java
@@ -62,7 +62,7 @@ class InsertStatementBinderTest {
                 new ColumnSegment(0, 0, new IdentifierValue("user_id")), new 
ColumnSegment(0, 0, new IdentifierValue("status")))));
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Arrays.asList(new LiteralExpressionSegment(0, 0, 1),
                 new LiteralExpressionSegment(0, 0, 1), new 
LiteralExpressionSegment(0, 0, "OK"))));
-        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, new 
SQLStatementBinderContext(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(insertStatement));
         assertThat(actual.getTable().getTableName(), 
not(insertStatement.getTable().getTableName()));
         assertTrue(actual.getInsertColumns().isPresent());
@@ -105,7 +105,7 @@ class InsertStatementBinderTest {
         insertStatement.setInsertSelect(new SubquerySegment(0, 0, 
subSelectStatement, ""));
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Arrays.asList(new LiteralExpressionSegment(0, 0, 1),
                 new LiteralExpressionSegment(0, 0, 1), new 
LiteralExpressionSegment(0, 0, "OK"))));
-        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, new 
SQLStatementBinderContext(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(insertStatement));
         assertThat(actual.getTable().getTableName(), 
not(insertStatement.getTable().getTableName()));
         assertTrue(actual.getInsertColumns().isPresent());
@@ -127,7 +127,7 @@ class InsertStatementBinderTest {
         insertStatement.setInsertSelect(new SubquerySegment(0, 0, 
subSelectStatement, ""));
         insertStatement.getValues().add(new InsertValuesSegment(0, 0, 
Arrays.asList(new LiteralExpressionSegment(0, 0, 1),
                 new LiteralExpressionSegment(0, 0, 1), new 
LiteralExpressionSegment(0, 0, "OK"))));
-        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        InsertStatement actual = new 
InsertStatementBinder().bind(insertStatement, new 
SQLStatementBinderContext(insertStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(insertStatement));
         assertThat(actual.getTable().getTableName(), 
not(insertStatement.getTable().getTableName()));
         assertInsertColumns(actual.getDerivedInsertColumns());
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/SelectStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/SelectStatementBinderTest.java
index 4f938fcfe93..d085f55b860 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/SelectStatementBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/SelectStatementBinderTest.java
@@ -81,7 +81,7 @@ class SelectStatementBinderTest {
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
         selectStatement.setFrom(simpleTableSegment);
         selectStatement.setWhere(mockWhereSegment());
-        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, new 
SQLStatementBinderContext(selectStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(selectStatement));
         assertTrue(actual.getFrom().isPresent());
         assertThat(actual.getFrom().get(), not(simpleTableSegment));
@@ -149,11 +149,11 @@ class SelectStatementBinderTest {
         ShardingSphereMetaData metaData =
                 new 
ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, 
database), resourceMetaData, ruleMetaData, new ConfigurationProperties(new 
Properties()));
         SelectStatement selectStatement = (SelectStatement) 
parserEngine.parse(sql, false);
-        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, metaData, 
DefaultDatabase.LOGIC_NAME);
+        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, new 
SQLStatementBinderContext(selectStatement, metaData, 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(selectStatement));
         assertThat(actual, instanceOf(OracleSelectStatement.class));
-        assertTrue(((OracleSelectStatement) 
actual).getWithSegment().isPresent());
-        assertThat(((OracleSelectStatement) 
actual).getWithSegment().get().getCommonTableExpressions().size(), is(5));
+        assertTrue(actual.getWithSegment().isPresent());
+        
assertThat(actual.getWithSegment().get().getCommonTableExpressions().size(), 
is(5));
     }
     
     @Test
@@ -179,11 +179,11 @@ class SelectStatementBinderTest {
         ShardingSphereMetaData metaData =
                 new 
ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, 
database), resourceMetaData, ruleMetaData, new ConfigurationProperties(new 
Properties()));
         SelectStatement selectStatement = (SelectStatement) 
parserEngine.parse(sql, false);
-        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, metaData, 
DefaultDatabase.LOGIC_NAME);
+        SelectStatement actual = new 
SelectStatementBinder().bind(selectStatement, new 
SQLStatementBinderContext(selectStatement, metaData, 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(selectStatement));
         assertThat(actual, instanceOf(OracleSelectStatement.class));
-        assertTrue(((OracleSelectStatement) 
actual).getWithSegment().isPresent());
-        assertThat(((OracleSelectStatement) 
actual).getWithSegment().get().getCommonTableExpressions().size(), is(1));
+        assertTrue(actual.getWithSegment().isPresent());
+        
assertThat(actual.getWithSegment().get().getCommonTableExpressions().size(), 
is(1));
     }
     
     private Map<String, ShardingSphereSchema> buildSchemas() {
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
index 370b1e12f5a..b982860dc8d 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
@@ -54,7 +54,7 @@ class UpdateStatementBinderTest {
         updateStatement.setTable(simpleTableSegment);
         updateStatement.setWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("status")),
                 new LiteralExpressionSegment(0, 0, 0), "=", "status = 1")));
-        UpdateStatement actual = new 
UpdateStatementBinder().bind(updateStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        UpdateStatement actual = new 
UpdateStatementBinder().bind(updateStatement, new 
SQLStatementBinderContext(updateStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME));
         assertThat(actual, not(updateStatement));
         assertThat(actual.getTable(), not(updateStatement.getTable()));
         assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class));


Reply via email to