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();
+    }
 }


Reply via email to