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