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 96dd75934be Extract variables from column segments (#28334)
96dd75934be is described below
commit 96dd75934be190cedc0477af982e133425849d9b
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Sep 4 17:02:43 2023 +0800
Extract variables from column segments (#28334)
* Extract variables from column segments
* Extract variables from column segments
* Extract variables from column segments
---
.../expression/impl/ColumnSegmentBinder.java | 17 +++++++++++++++
.../segment/from/TableSegmentBinderContext.java | 23 ++++++++++++++++++++
.../from/impl/SimpleTableSegmentBinder.java | 25 ++++++++++++++++++----
.../statement/SQLStatementBinderContext.java | 2 ++
.../statement/dml/DeleteStatementBinder.java | 2 +-
.../statement/dml/InsertStatementBinder.java | 2 +-
.../binder/statement/dml/MergeStatementBinder.java | 2 +-
.../statement/dml/SelectStatementBinder.java | 2 +-
.../statement/dml/UpdateStatementBinder.java | 2 +-
.../expression/impl/ColumnSegmentBinderTest.java | 2 +-
.../from/impl/JoinTableSegmentBinderTest.java | 16 +++++++++-----
.../from/impl/SimpleTableSegmentBinderTest.java | 13 +++++++----
.../from/impl/SubqueryTableSegmentBinderTest.java | 10 ++++++---
.../common/segment/dml/column/ColumnSegment.java | 2 ++
.../sql/common/statement/AbstractSQLStatement.java | 2 ++
.../parser/sql/common/statement/SQLStatement.java | 12 +++++++++++
16 files changed, 112 insertions(+), 22 deletions(-)
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 6d66e493c95..a1a783e1873 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
@@ -75,6 +75,7 @@ public final class ColumnSegmentBinder {
Collection<TableSegmentBinderContext> tableBinderContextValues =
getTableSegmentBinderContexts(segment, parentSegmentType,
statementBinderContext, tableBinderContexts, outerTableBinderContexts);
Optional<ColumnSegment> inputColumnSegment =
findInputColumnSegment(segment, parentSegmentType, tableBinderContextValues);
+ inputColumnSegment.ifPresent(optional ->
result.setVariable(optional.isVariable()));
result.setColumnBoundedInfo(createColumnSegmentBoundedInfo(segment,
inputColumnSegment.orElse(null)));
return result;
}
@@ -122,11 +123,27 @@ public final class ColumnSegmentBinder {
isFindInputColumn = true;
}
}
+ if (!isFindInputColumn) {
+ result = findInputColumnSegmentByVariables(segment,
tableBinderContexts).orElse(null);
+ isFindInputColumn = result != null;
+ }
ShardingSpherePreconditions.checkState(isFindInputColumn,
() -> new UnknownColumnException(segment.getExpression(),
SEGMENT_TYPE_MESSAGES.getOrDefault(parentSegmentType,
UNKNOWN_SEGMENT_TYPE_MESSAGE)));
return Optional.ofNullable(result);
}
+ private static Optional<ColumnSegment>
findInputColumnSegmentByVariables(final ColumnSegment segment, final
Collection<TableSegmentBinderContext> tableBinderContexts) {
+ ColumnSegment result = null;
+ for (TableSegmentBinderContext each : tableBinderContexts) {
+ ProjectionSegment variableSegment =
each.getProjectionSegmentByVariableLabel(segment.getIdentifier().getValue());
+ if (variableSegment instanceof ColumnProjectionSegment) {
+ result = ((ColumnProjectionSegment)
variableSegment).getColumn();
+ break;
+ }
+ }
+ return Optional.ofNullable(result);
+ }
+
private static ColumnSegmentBoundedInfo
createColumnSegmentBoundedInfo(final ColumnSegment segment, final ColumnSegment
inputColumnSegment) {
IdentifierValue originalDatabase = null == inputColumnSegment ? null :
inputColumnSegment.getColumnBoundedInfo().getOriginalDatabase();
IdentifierValue originalSchema = null == inputColumnSegment ? null :
inputColumnSegment.getColumnBoundedInfo().getOriginalSchema();
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 9b4c1fac777..fdcf634e163 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.Getter;
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;
@@ -33,6 +34,9 @@ public final class TableSegmentBinderContext {
private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
+ @Getter
+ private final Map<String, ProjectionSegment>
variableLabelProjectionSegments = new LinkedHashMap<>();
+
public TableSegmentBinderContext(final Collection<ProjectionSegment>
projectionSegments) {
columnLabelProjectionSegments = new
LinkedHashMap<>(projectionSegments.size(), 1F);
projectionSegments.forEach(each ->
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
@@ -64,4 +68,23 @@ public final class TableSegmentBinderContext {
public Collection<ProjectionSegment> getProjectionSegments() {
return columnLabelProjectionSegments.values();
}
+
+ /**
+ * Put projection segment by variable label.
+ *
+ * @param projectionSegment projection segment
+ */
+ public void putVariableLabelProjectionSegments(final ProjectionSegment
projectionSegment) {
+
variableLabelProjectionSegments.put(projectionSegment.getColumnLabel().toLowerCase(),
projectionSegment);
+ }
+
+ /**
+ * Get projection segment by variable label.
+ *
+ * @param variableLabel variable label
+ * @return projection segment
+ */
+ public ProjectionSegment getProjectionSegmentByVariableLabel(final String
variableLabel) {
+ return
variableLabelProjectionSegments.get(variableLabel.toLowerCase());
+ }
}
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 e189c3a93b2..2c26d30e2fd 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
@@ -42,6 +42,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Sim
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -80,7 +81,7 @@ public final class SimpleTableSegmentBinder {
checkTableExists(segment.getTableName().getIdentifier().getValue(),
statementBinderContext, originalDatabase.getValue(), 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, statementBinderContext.getDatabaseType()));
+ createSimpleTableBinderContext(segment, schema,
originalDatabase, originalSchema, statementBinderContext));
TableNameSegment tableNameSegment = new
TableNameSegment(segment.getTableName().getStartIndex(),
segment.getTableName().getStopIndex(), segment.getTableName().getIdentifier());
tableNameSegment.setTableBoundedInfo(new
TableSegmentBoundedInfo(originalDatabase, originalSchema));
SimpleTableSegment result = new SimpleTableSegment(tableNameSegment);
@@ -109,11 +110,12 @@ public final class SimpleTableSegmentBinder {
}
private static TableSegmentBinderContext
createSimpleTableBinderContext(final SimpleTableSegment segment, final
ShardingSphereSchema schema,
-
final IdentifierValue originalDatabase, final IdentifierValue originalSchema,
final DatabaseType databaseType) {
+
final IdentifierValue originalDatabase, final IdentifierValue originalSchema,
+
final SQLStatementBinderContext statementBinderContext) {
Collection<ShardingSphereColumn> columnNames =
Optional.ofNullable(schema.getTable(segment.getTableName().getIdentifier().getValue())).map(ShardingSphereTable::getColumnValues).orElseGet(Collections::emptyList);
Collection<ProjectionSegment> projectionSegments = new LinkedList<>();
- DialectDatabaseMetaData dialectDatabaseMetaData = new
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
+ DialectDatabaseMetaData dialectDatabaseMetaData = new
DatabaseTypeRegistry(statementBinderContext.getDatabaseType()).getDialectDatabaseMetaData();
for (ShardingSphereColumn each : columnNames) {
ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue(each.getName(), dialectDatabaseMetaData.getQuoteCharacter()));
columnSegment.setOwner(new OwnerSegment(0, 0,
segment.getAlias().orElse(segment.getTableName().getIdentifier())));
@@ -123,7 +125,22 @@ public final class SimpleTableSegmentBinder {
columnProjectionSegment.setVisible(each.isVisible());
projectionSegments.add(columnProjectionSegment);
}
- return new TableSegmentBinderContext(projectionSegments);
+ TableSegmentBinderContext result = new
TableSegmentBinderContext(projectionSegments);
+ getVariableProjectionSegments(segment, originalDatabase,
originalSchema, statementBinderContext,
dialectDatabaseMetaData).forEach(result::putVariableLabelProjectionSegments);
+ return result;
+ }
+
+ private static Collection<ProjectionSegment>
getVariableProjectionSegments(final SimpleTableSegment segment, final
IdentifierValue originalDatabase, final IdentifierValue originalSchema,
+
final SQLStatementBinderContext statementBinderContext, final
DialectDatabaseMetaData dialectDatabaseMetaData) {
+ Collection<ProjectionSegment> result = new
ArrayList<>(statementBinderContext.getVariableNames().size());
+ statementBinderContext.getVariableNames().forEach(each -> {
+ ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue(each, dialectDatabaseMetaData.getQuoteCharacter()));
+ columnSegment.setVariable(true);
+ columnSegment.setColumnBoundedInfo(new
ColumnSegmentBoundedInfo(originalDatabase, originalSchema,
segment.getTableName().getIdentifier(),
+ new IdentifierValue(each,
dialectDatabaseMetaData.getQuoteCharacter())));
+ result.add(new ColumnProjectionSegment(columnSegment));
+ });
+ return result;
}
private static void checkTableExists(final String tableName, final
SQLStatementBinderContext statementBinderContext, final String databaseName,
final String schemaName) {
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 8d1c8df99c1..7d056da44b2 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
@@ -40,6 +40,8 @@ public final class SQLStatementBinderContext {
private final DatabaseType databaseType;
+ private final Collection<String> variableNames;
+
private final Collection<String> usingColumnNames = new HashSet<>();
private final Collection<ProjectionSegment> joinTableProjectionSegments =
new LinkedList<>();
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 53664c6d6c1..af3ad3fedb9 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
@@ -42,7 +42,7 @@ public final class DeleteStatementBinder implements
SQLStatementBinder<DeleteSta
public DeleteStatement bind(final DeleteStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
DeleteStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType());
+ SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
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 d58817d9531..62143ab9ba6 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
@@ -38,7 +38,7 @@ public final class InsertStatementBinder implements
SQLStatementBinder<InsertSta
InsertStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
result.setTable(sqlStatement.getTable());
sqlStatement.getInsertColumns().ifPresent(result::setInsertColumns);
- SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType());
+ SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
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 afe5ade07c1..e27fd508235 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
@@ -60,7 +60,7 @@ public final class MergeStatementBinder implements
SQLStatementBinder<MergeState
public MergeStatement bind(final MergeStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
MergeStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType());
+ SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
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 7e5fcc818cc..91064950657 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
@@ -51,7 +51,7 @@ public final class SelectStatementBinder implements
SQLStatementBinder<SelectSta
final Map<String, TableSegmentBinderContext>
outerTableBinderContexts) {
SelectStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType());
+ SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
TableSegment boundedTableSegment =
TableSegmentBinder.bind(sqlStatement.getFrom(), statementBinderContext,
tableBinderContexts);
result.setFrom(boundedTableSegment);
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
statementBinderContext, boundedTableSegment, tableBinderContexts));
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 62f51217018..ffa89b7bfa3 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
@@ -42,7 +42,7 @@ public final class UpdateStatementBinder implements
SQLStatementBinder<UpdateSta
public UpdateStatement bind(final UpdateStatement sqlStatement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
UpdateStatement result =
sqlStatement.getClass().getDeclaredConstructor().newInstance();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType());
+ SQLStatementBinderContext statementBinderContext = new
SQLStatementBinderContext(metaData, defaultDatabaseName,
sqlStatement.getDatabaseType(), sqlStatement.getVariableNames());
TableSegment boundedTableSegment =
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext,
tableBinderContexts);
result.setTable(boundedTableSegment);
result.setSetAssignment(sqlStatement.getSetAssignment());
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
index 2a6286996b7..50dd6ae4e6c 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
@@ -55,7 +55,7 @@ class ColumnSegmentBinderTest {
tableBinderContexts.put("t_order_item", new
TableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedItemIdColumn))));
ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue("order_id"));
SQLStatementBinderContext statementBinderContext =
- new
SQLStatementBinderContext(mock(ShardingSphereMetaData.class),
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
+ new
SQLStatementBinderContext(mock(ShardingSphereMetaData.class),
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"), Collections.emptySet());
ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment,
SegmentType.JOIN_ON, statementBinderContext, tableBinderContexts,
Collections.emptyMap());
assertNotNull(actual.getColumnBoundedInfo());
assertNull(actual.getOtherUsingColumnBoundedInfo());
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 7f6bc4d476f..725c1e36d1a 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
@@ -41,6 +41,7 @@ import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -66,7 +67,8 @@ class JoinTableSegmentBinderTest {
when(joinTableSegment.getRight()).thenReturn(rightTable);
ShardingSphereMetaData metaData = createMetaData();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- JoinTableSegment actual =
JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ JoinTableSegment actual =
+ JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getLeft() instanceof SimpleTableSegment);
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
@@ -107,7 +109,8 @@ class JoinTableSegmentBinderTest {
when(joinTableSegment.getRight()).thenReturn(rightTable);
ShardingSphereMetaData metaData = createMetaData();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- JoinTableSegment actual =
JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ JoinTableSegment actual =
+ JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getLeft() instanceof SimpleTableSegment);
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
@@ -132,7 +135,8 @@ class JoinTableSegmentBinderTest {
when(joinTableSegment.getJoinType()).thenReturn(JoinType.RIGHT.name());
ShardingSphereMetaData metaData = createMetaData();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- JoinTableSegment actual =
JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ JoinTableSegment actual =
+ JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getLeft() instanceof SimpleTableSegment);
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
@@ -171,7 +175,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ JoinTableSegment actual =
+ JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getLeft() instanceof SimpleTableSegment);
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(((SimpleTableSegment)
actual.getLeft()).getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
@@ -209,7 +214,8 @@ class JoinTableSegmentBinderTest {
when(joinTableSegment.getRight()).thenReturn(rightTable);
ShardingSphereMetaData metaData = createMetaData();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
- JoinTableSegment actual =
JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ JoinTableSegment actual =
+ JoinTableSegmentBinder.bind(joinTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getLeft() instanceof JoinTableSegment);
assertTrue(((JoinTableSegment) actual.getLeft()).getLeft() instanceof
SimpleTableSegment);
assertThat(((SimpleTableSegment) ((JoinTableSegment)
actual.getLeft()).getLeft()).getTableName().getTableBoundedInfo().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 3a63b4be718..cdc497669a7 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
@@ -36,6 +36,7 @@ import org.junit.jupiter.api.Test;
import java.sql.Types;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
@@ -55,7 +56,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SimpleTableSegment actual =
+ SimpleTableSegmentBinder.bind(simpleTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertTrue(tableBinderContexts.containsKey("t_order"));
@@ -95,7 +97,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SimpleTableSegment actual =
+ SimpleTableSegmentBinder.bind(simpleTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is("sharding_db"));
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is("sharding_db"));
}
@@ -105,7 +108,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SimpleTableSegment actual =
+ SimpleTableSegmentBinder.bind(simpleTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
}
@@ -139,6 +143,7 @@ class SimpleTableSegmentBinderTest {
ShardingSphereMetaData metaData = createMetaData();
Map<String, TableSegmentBinderContext> tableBinderContexts = new
CaseInsensitiveMap<>();
assertThrows(TableNotExistsException.class,
- () -> SimpleTableSegmentBinder.bind(simpleTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts));
+ () -> SimpleTableSegmentBinder.bind(simpleTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()),
+ tableBinderContexts));
}
}
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 e0bdbc223c4..060d60f091c 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
@@ -43,6 +43,7 @@ import org.junit.jupiter.api.Test;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -70,7 +71,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SubqueryTableSegment actual =
+ SubqueryTableSegmentBinder.bind(subqueryTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getAlias().isPresent());
assertTrue(tableBinderContexts.containsKey("temp"));
List<ProjectionSegment> projectionSegments = new
ArrayList<>(tableBinderContexts.get("temp").getProjectionSegments());
@@ -103,7 +105,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SubqueryTableSegment actual =
+ SubqueryTableSegmentBinder.bind(subqueryTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertTrue(actual.getAlias().isPresent());
assertTrue(tableBinderContexts.containsKey("temp"));
List<ProjectionSegment> projectionSegments = new
ArrayList<>(tableBinderContexts.get("temp").getProjectionSegments());
@@ -125,7 +128,8 @@ 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, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType),
tableBinderContexts);
+ SubqueryTableSegment actual =
+ SubqueryTableSegmentBinder.bind(subqueryTableSegment, new
SQLStatementBinderContext(metaData, DefaultDatabase.LOGIC_NAME, databaseType,
Collections.emptySet()), tableBinderContexts);
assertFalse(actual.getAlias().isPresent());
assertTrue(tableBinderContexts.containsKey(""));
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
index 5703b4fff69..f7269bb1f9d 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/column/ColumnSegment.java
@@ -50,6 +50,8 @@ public final class ColumnSegment implements
ExpressionSegment, OwnerAvailable {
private ColumnSegmentBoundedInfo otherUsingColumnBoundedInfo;
+ private boolean isVariable;
+
public ColumnSegment(final int startIndex, final int stopIndex, final
IdentifierValue identifier) {
this.startIndex = startIndex;
this.stopIndex = stopIndex;
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
index e92ce219d4d..b65e5670397 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
@@ -37,6 +37,8 @@ public abstract class AbstractSQLStatement implements
SQLStatement {
private final Collection<CommentSegment> commentSegments = new
LinkedList<>();
+ private final Collection<String> variableNames = new HashSet<>();
+
@Override
public int getParameterCount() {
return uniqueParameterIndexes.size();
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
index 2590c433ede..edced0de37d 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
@@ -21,6 +21,9 @@ import
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
+import java.util.Collection;
+import java.util.Collections;
+
/**
* SQL statement.
*/
@@ -41,4 +44,13 @@ public interface SQLStatement extends ASTNode {
default DatabaseType getDatabaseType() {
return TypedSPILoader.getService(DatabaseType.class, "SQL92");
}
+
+ /**
+ * Get variable names.
+ *
+ * @return variable names
+ */
+ default Collection<String> getVariableNames() {
+ return Collections.emptyList();
+ }
}