This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 035380a68f8 Support cursor record bind (#28361)
035380a68f8 is described below
commit 035380a68f8fd385f39a3ff2cd466b56032a7e5a
Author: Chuxin Chen <[email protected]>
AuthorDate: Tue Sep 5 18:00:18 2023 +0800
Support cursor record bind (#28361)
* Support cursor record bind
* Revert "Support cursor record bind"
This reverts commit cc8073754cbdfc95be8a2c243260cf8d4be5d0ea.
* Support cursor record bind
---
.../segment/combine/CombineSegmentBinder.java | 6 +++--
.../expression/impl/ColumnSegmentBinder.java | 9 ++++++--
.../expression/impl/SubquerySegmentBinder.java | 4 ++--
.../from/impl/SubqueryTableSegmentBinder.java | 3 ++-
.../statement/SQLStatementBinderContext.java | 5 +++++
.../statement/dml/DeleteStatementBinder.java | 8 ++++++-
.../statement/dml/InsertStatementBinder.java | 10 ++++++++-
.../binder/statement/dml/MergeStatementBinder.java | 8 ++++++-
.../statement/dml/SelectStatementBinder.java | 26 +++++++++++++++++-----
.../statement/dml/UpdateStatementBinder.java | 8 ++++++-
10 files changed, 71 insertions(+), 16 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 3b4a84e54f3..b305daf2e3e 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
@@ -41,8 +41,10 @@ public final class CombineSegmentBinder {
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);
+ SelectStatement boundedLeftSelect = new
SelectStatementBinder().bindWithExternalTableContexts(segment.getLeft(),
metaData, defaultDatabaseName,
+ statementBinderContext.getExternalTableBinderContexts());
+ SelectStatement boundedRightSelect = new
SelectStatementBinder().bindWithExternalTableContexts(segment.getRight(),
metaData, defaultDatabaseName,
+ statementBinderContext.getExternalTableBinderContexts());
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/impl/ColumnSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
index a1a783e1873..03e31f5022f 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
@@ -85,7 +85,8 @@ public final class ColumnSegmentBinder {
final Map<String, TableSegmentBinderContext> tableBinderContexts,
final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
if (segment.getOwner().isPresent()) {
- return
getTableBinderContextByOwner(segment.getOwner().get().getIdentifier().getValue(),
tableBinderContexts, outerTableBinderContexts);
+ return
getTableBinderContextByOwner(segment.getOwner().get().getIdentifier().getValue(),
tableBinderContexts, outerTableBinderContexts,
+ statementBinderContext.getExternalTableBinderContexts());
}
if (!statementBinderContext.getJoinTableProjectionSegments().isEmpty()
&& isNeedUseJoinTableProjectionBind(segment, parentSegmentType,
statementBinderContext)) {
return Collections.singleton(new
TableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
@@ -99,13 +100,17 @@ public final class ColumnSegmentBinder {
}
private static Collection<TableSegmentBinderContext>
getTableBinderContextByOwner(final String owner, final Map<String,
TableSegmentBinderContext> tableBinderContexts,
-
final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
+
final Map<String, TableSegmentBinderContext> outerTableBinderContexts,
+
final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
if (tableBinderContexts.containsKey(owner)) {
return Collections.singleton(tableBinderContexts.get(owner));
}
if (outerTableBinderContexts.containsKey(owner)) {
return Collections.singleton(outerTableBinderContexts.get(owner));
}
+ if (externalTableBinderContexts.containsKey(owner)) {
+ return
Collections.singleton(externalTableBinderContexts.get(owner));
+ }
return Collections.emptyList();
}
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 1ab567a9f36..7a7273dab29 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,8 @@ 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.getDefaultDatabaseName(), outerTableBinderContexts);
+ SelectStatement boundedSelectStatement = new
SelectStatementBinder().bindCorrelateSubquery(segment.getSelect(),
statementBinderContext.getMetaData(),
+ statementBinderContext.getDefaultDatabaseName(),
outerTableBinderContexts,
statementBinderContext.getExternalTableBinderContexts());
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/impl/SubqueryTableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
index d1ecb081295..e8f965b43c2 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
@@ -55,7 +55,8 @@ public final class SubqueryTableSegmentBinder {
*/
public static SubqueryTableSegment bind(final SubqueryTableSegment
segment, final SQLStatementBinderContext statementBinderContext,
final Map<String,
TableSegmentBinderContext> tableBinderContexts) {
- SelectStatement boundedSelect = new
SelectStatementBinder().bind(segment.getSubquery().getSelect(),
statementBinderContext.getMetaData(),
statementBinderContext.getDefaultDatabaseName());
+ SelectStatement boundedSelect = new
SelectStatementBinder().bindWithExternalTableContexts(segment.getSubquery().getSelect(),
statementBinderContext.getMetaData(),
+ statementBinderContext.getDefaultDatabaseName(),
statementBinderContext.getExternalTableBinderContexts());
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/statement/SQLStatementBinderContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementBinderContext.java
index 7d056da44b2..21c5ed6ccf6 100644
---
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
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.infra.binder.statement;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.map.CaseInsensitiveMap;
+import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
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;
@@ -26,6 +28,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.Map;
/**
* SQL statement binder context.
@@ -45,4 +48,6 @@ public final class SQLStatementBinderContext {
private final Collection<String> usingColumnNames = new HashSet<>();
private final Collection<ProjectionSegment> joinTableProjectionSegments =
new LinkedList<>();
+
+ private final Map<String, TableSegmentBinderContext>
externalTableBinderContexts = new CaseInsensitiveMap<>();
}
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 af3ad3fedb9..431e3a452a8 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
@@ -37,12 +37,18 @@ import java.util.Map;
*/
public final class DeleteStatementBinder implements
SQLStatementBinder<DeleteStatement> {
- @SneakyThrows
@Override
public DeleteStatement bind(final DeleteStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+ return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap());
+ }
+
+ @SneakyThrows
+ private DeleteStatement bind(final DeleteStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+ final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
DeleteStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
+
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
TableSegment boundedTableSegment =
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext,
tableBinderContexts);
result.setTable(boundedTableSegment);
sqlStatement.getWhere().ifPresent(optional ->
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext,
tableBinderContexts, Collections.emptyMap())));
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 62143ab9ba6..a0cf9de542c 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
@@ -19,6 +19,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.segment.from.TableSegmentBinderContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -26,19 +27,26 @@ import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertState
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
import java.util.Collections;
+import java.util.Map;
/**
* Select statement binder.
*/
public final class InsertStatementBinder implements
SQLStatementBinder<InsertStatement> {
- @SneakyThrows
@Override
public InsertStatement bind(final InsertStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+ return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap());
+ }
+
+ @SneakyThrows
+ private InsertStatement bind(final InsertStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+ final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
InsertStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
result.setTable(sqlStatement.getTable());
sqlStatement.getInsertColumns().ifPresent(result::setInsertColumns);
SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
+
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
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));
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
index e27fd508235..eae67d10d97 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
@@ -55,12 +55,18 @@ import java.util.Optional;
*/
public final class MergeStatementBinder implements
SQLStatementBinder<MergeStatement> {
- @SneakyThrows
@Override
public MergeStatement bind(final MergeStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+ return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap());
+ }
+
+ @SneakyThrows
+ private MergeStatement bind(final MergeStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+ final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
MergeStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
+
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
TableSegment boundedTargetTableSegment =
TableSegmentBinder.bind(sqlStatement.getTarget(), statementBinderContext,
tableBinderContexts);
TableSegment boundedSourceTableSegment =
TableSegmentBinder.bind(sqlStatement.getSource(), statementBinderContext,
tableBinderContexts);
result.setTarget(boundedTargetTableSegment);
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 91064950657..2c12c0a4fff 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
@@ -43,15 +43,16 @@ public final class SelectStatementBinder implements
SQLStatementBinder<SelectSta
@SneakyThrows
@Override
public SelectStatement bind(final SelectStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
- return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap());
+ return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap(), Collections.emptyMap());
}
@SneakyThrows
private SelectStatement bind(final SelectStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName,
- final Map<String, TableSegmentBinderContext>
outerTableBinderContexts) {
+ final Map<String, TableSegmentBinderContext>
outerTableBinderContexts, final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
SelectStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
+
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
TableSegment boundedTableSegment =
TableSegmentBinder.bind(sqlStatement.getFrom(), statementBinderContext,
tableBinderContexts);
result.setFrom(boundedTableSegment);
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
statementBinderContext, boundedTableSegment, tableBinderContexts));
@@ -74,16 +75,31 @@ public final class SelectStatementBinder implements
SQLStatementBinder<SelectSta
/**
* Bind correlate subquery select statement.
- *
+ *
* @param sqlStatement subquery select statement
* @param metaData meta data
* @param defaultDatabaseName default database name
* @param outerTableBinderContexts outer select statement table binder
contexts
+ * @param externalTableBinderContexts external table binder contexts
* @return bounded correlate subquery select statement
*/
@SneakyThrows
public SelectStatement bindCorrelateSubquery(final SelectStatement
sqlStatement, final ShardingSphereMetaData metaData, final String
defaultDatabaseName,
- final Map<String,
TableSegmentBinderContext> outerTableBinderContexts) {
- return bind(sqlStatement, metaData, defaultDatabaseName,
outerTableBinderContexts);
+ final Map<String,
TableSegmentBinderContext> outerTableBinderContexts, final Map<String,
TableSegmentBinderContext> externalTableBinderContexts) {
+ return bind(sqlStatement, metaData, defaultDatabaseName,
outerTableBinderContexts, externalTableBinderContexts);
+ }
+
+ /**
+ * Bind with external table contexts.
+ *
+ * @param statement select statement
+ * @param metaData meta data
+ * @param defaultDatabaseName default database name
+ * @param externalTableContexts external table contexts
+ * @return select statement
+ */
+ public SelectStatement bindWithExternalTableContexts(final SelectStatement
statement, final ShardingSphereMetaData metaData, final String
defaultDatabaseName,
+ final Map<String,
TableSegmentBinderContext> externalTableContexts) {
+ return bind(statement, metaData, defaultDatabaseName,
Collections.emptyMap(), externalTableContexts);
}
}
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 ffa89b7bfa3..dc96e88bd65 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
@@ -37,12 +37,18 @@ import java.util.Map;
*/
public final class UpdateStatementBinder implements
SQLStatementBinder<UpdateStatement> {
- @SneakyThrows
@Override
public UpdateStatement bind(final UpdateStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+ return bind(sqlStatement, metaData, defaultDatabaseName,
Collections.emptyMap());
+ }
+
+ @SneakyThrows
+ private UpdateStatement bind(final UpdateStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName,
+ final Map<String, TableSegmentBinderContext>
externalTableBinderContexts) {
UpdateStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
+
statementBinderContext.getExternalTableBinderContexts().putAll(externalTableBinderContexts);
TableSegment boundedTableSegment =
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext,
tableBinderContexts);
result.setTable(boundedTableSegment);
result.setSetAssignment(sqlStatement.getSetAssignment());