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));