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 341dc3b7ce7 Fix function table bind ex (#28419)
341dc3b7ce7 is described below

commit 341dc3b7ce7d984698e571e29ee38d9853791b43
Author: Chuxin Chen <[email protected]>
AuthorDate: Tue Sep 12 13:39:35 2023 +0800

    Fix function table bind ex (#28419)
---
 .../expression/impl/ColumnSegmentBinder.java       | 47 ++++++++++++++--------
 .../from/FunctionTableSegmentBinderContext.java    | 40 ++++++++++++++++++
 ...t.java => SimpleTableSegmentBinderContext.java} | 24 ++++-------
 .../binder/segment/from/TableSegmentBinder.java    |  5 +++
 .../segment/from/TableSegmentBinderContext.java    | 35 +++-------------
 .../from/impl/SimpleTableSegmentBinder.java        |  9 +++--
 .../from/impl/SubqueryTableSegmentBinder.java      |  3 +-
 .../expression/impl/ColumnSegmentBinderTest.java   |  9 +++--
 .../from/impl/SimpleTableSegmentBinderTest.java    | 43 +++++++++++---------
 .../impl/ShorthandProjectionSegmentBinderTest.java |  7 ++--
 10 files changed, 129 insertions(+), 93 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 cf11560d320..531320b6ef8 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
@@ -21,6 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.groovy.util.Maps;
 import org.apache.shardingsphere.infra.binder.enums.SegmentType;
+import 
org.apache.shardingsphere.infra.binder.segment.from.FunctionTableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import org.apache.shardingsphere.infra.exception.AmbiguousColumnException;
@@ -91,7 +93,7 @@ public final class ColumnSegmentBinder {
                     statementBinderContext.getExternalTableBinderContexts());
         }
         if (!statementBinderContext.getJoinTableProjectionSegments().isEmpty() 
&& isNeedUseJoinTableProjectionBind(segment, parentSegmentType, 
statementBinderContext)) {
-            return Collections.singleton(new 
TableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
+            return Collections.singleton(new 
SimpleTableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
         }
         return tableBinderContexts.values();
     }
@@ -121,13 +123,13 @@ public final class ColumnSegmentBinder {
         ColumnSegment result = null;
         boolean isFindInputColumn = false;
         for (TableSegmentBinderContext each : tableBinderContexts) {
-            ProjectionSegment projectionSegment = 
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
-            if (projectionSegment instanceof ColumnProjectionSegment) {
+            Optional<ProjectionSegment> projectionSegment = 
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+            if (projectionSegment.isPresent() && projectionSegment.get() 
instanceof ColumnProjectionSegment) {
                 ShardingSpherePreconditions.checkState(null == result,
                         () -> new 
AmbiguousColumnException(segment.getExpression(), 
SEGMENT_TYPE_MESSAGES.getOrDefault(parentSegmentType, 
UNKNOWN_SEGMENT_TYPE_MESSAGE)));
-                result = ((ColumnProjectionSegment) 
projectionSegment).getColumn();
+                result = ((ColumnProjectionSegment) 
projectionSegment.get()).getColumn();
             }
-            if (!isFindInputColumn && null != projectionSegment) {
+            if (!isFindInputColumn && projectionSegment.isPresent()) {
                 isFindInputColumn = true;
             }
         }
@@ -149,7 +151,7 @@ public final class ColumnSegmentBinder {
             result = findInputColumnSegmentByVariables(segment, 
statementBinderContext.getVariableNames()).orElse(null);
             isFindInputColumn = result != null;
         }
-        ShardingSpherePreconditions.checkState(isFindInputColumn,
+        ShardingSpherePreconditions.checkState(isFindInputColumn || 
containsFunctionTable(tableBinderContexts, outerTableBinderContexts.values()),
                 () -> new UnknownColumnException(segment.getExpression(), 
SEGMENT_TYPE_MESSAGES.getOrDefault(parentSegmentType, 
UNKNOWN_SEGMENT_TYPE_MESSAGE)));
         return Optional.ofNullable(result);
     }
@@ -158,9 +160,9 @@ public final class ColumnSegmentBinder {
         ListIterator<TableSegmentBinderContext> listIterator = new 
ArrayList<>(outerTableBinderContexts.values()).listIterator(outerTableBinderContexts.size());
         while (listIterator.hasPrevious()) {
             TableSegmentBinderContext each = listIterator.previous();
-            ProjectionSegment projectionSegment = 
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
-            if (null != projectionSegment) {
-                return Optional.of(projectionSegment);
+            Optional<ProjectionSegment> result = 
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+            if (result.isPresent()) {
+                return result;
             }
         }
         return Optional.empty();
@@ -168,9 +170,9 @@ public final class ColumnSegmentBinder {
     
     private static Optional<ProjectionSegment> 
findInputColumnSegmentFromExternalTables(final ColumnSegment segment, final 
Map<String, TableSegmentBinderContext> externalTableBinderContexts) {
         for (TableSegmentBinderContext each : 
externalTableBinderContexts.values()) {
-            ProjectionSegment projectionSegment = 
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
-            if (null != projectionSegment) {
-                return Optional.of(projectionSegment);
+            Optional<ProjectionSegment> result = 
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+            if (result.isPresent()) {
+                return result;
             }
         }
         return Optional.empty();
@@ -185,6 +187,20 @@ public final class ColumnSegmentBinder {
         return Optional.empty();
     }
     
+    private static boolean containsFunctionTable(final 
Collection<TableSegmentBinderContext> tableBinderContexts, final 
Collection<TableSegmentBinderContext> outerBinderContexts) {
+        for (TableSegmentBinderContext each : tableBinderContexts) {
+            if (each instanceof FunctionTableSegmentBinderContext) {
+                return true;
+            }
+        }
+        for (TableSegmentBinderContext each : outerBinderContexts) {
+            if (each instanceof FunctionTableSegmentBinderContext) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
     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();
@@ -219,12 +235,11 @@ public final class ColumnSegmentBinder {
     }
     
     private static Collection<ColumnSegment> 
findUsingInputColumnSegments(final String columnName, final 
Collection<TableSegmentBinderContext> tableBinderContexts) {
-        ProjectionSegment projectionSegment;
         Collection<ColumnSegment> result = new LinkedList<>();
         for (TableSegmentBinderContext each : tableBinderContexts) {
-            projectionSegment = 
each.getProjectionSegmentByColumnLabel(columnName);
-            if (projectionSegment instanceof ColumnProjectionSegment) {
-                result.add(((ColumnProjectionSegment) 
projectionSegment).getColumn());
+            Optional<ProjectionSegment> projectionSegment = 
each.findProjectionSegmentByColumnLabel(columnName);
+            if (projectionSegment.isPresent() && projectionSegment.get() 
instanceof ColumnProjectionSegment) {
+                result.add(((ColumnProjectionSegment) 
projectionSegment.get()).getColumn());
             }
         }
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
new file mode 100644
index 00000000000..9fc755f3374
--- /dev/null
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
@@ -0,0 +1,40 @@
+/*
+ * 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.segment.from;
+
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+/**
+ * Function table segment binder context.
+ */
+public final class FunctionTableSegmentBinderContext implements 
TableSegmentBinderContext {
+    
+    @Override
+    public Optional<ProjectionSegment> 
findProjectionSegmentByColumnLabel(final String columnLabel) {
+        return Optional.empty();
+    }
+    
+    @Override
+    public Collection<ProjectionSegment> getProjectionSegments() {
+        return Collections.emptyList();
+    }
+}
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/SimpleTableSegmentBinderContext.java
similarity index 79%
copy from 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
copy to 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/SimpleTableSegmentBinderContext.java
index 9b4c1fac777..82852b7d83d 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/SimpleTableSegmentBinderContext.java
@@ -24,16 +24,17 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Shorthan
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Optional;
 
 /**
- * Table segment binder context.
+ * Simple table segment binder context.
  */
 @RequiredArgsConstructor
-public final class TableSegmentBinderContext {
+public final class SimpleTableSegmentBinderContext implements 
TableSegmentBinderContext {
     
     private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
     
-    public TableSegmentBinderContext(final Collection<ProjectionSegment> 
projectionSegments) {
+    public SimpleTableSegmentBinderContext(final Collection<ProjectionSegment> 
projectionSegments) {
         columnLabelProjectionSegments = new 
LinkedHashMap<>(projectionSegments.size(), 1F);
         projectionSegments.forEach(each -> 
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
     }
@@ -46,21 +47,12 @@ public final class TableSegmentBinderContext {
         }
     }
     
-    /**
-     * Get projection segment by column label.
-     * 
-     * @param columnLabel column label
-     * @return projection segment
-     */
-    public ProjectionSegment getProjectionSegmentByColumnLabel(final String 
columnLabel) {
-        return columnLabelProjectionSegments.get(columnLabel.toLowerCase());
+    @Override
+    public Optional<ProjectionSegment> 
findProjectionSegmentByColumnLabel(final String columnLabel) {
+        return 
Optional.ofNullable(columnLabelProjectionSegments.get(columnLabel.toLowerCase()));
     }
     
-    /**
-     * Get projection segments.
-     *
-     * @return projection segments
-     */
+    @Override
     public Collection<ProjectionSegment> getProjectionSegments() {
         return columnLabelProjectionSegments.values();
     }
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 d402122e080..37b778e3afa 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
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SimpleTableSegme
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SubqueryTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.FunctionTableSegment;
 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;
@@ -61,6 +62,10 @@ public final class TableSegmentBinder {
         if (segment instanceof DeleteMultiTableSegment) {
             return 
DeleteMultiTableSegmentBinder.bind((DeleteMultiTableSegment) segment, 
statementBinderContext, tableBinderContexts);
         }
+        if (segment instanceof FunctionTableSegment) {
+            tableBinderContexts.put(segment.getAliasName().orElseGet(() -> 
((FunctionTableSegment) segment).getTableFunction().getText()).toLowerCase(), 
new FunctionTableSegmentBinderContext());
+            return segment;
+        }
         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 9b4c1fac777..d7069152527 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,51 +17,28 @@
 
 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;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.Optional;
 
 /**
  * Table segment binder context.
  */
-@RequiredArgsConstructor
-public final class TableSegmentBinderContext {
-    
-    private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
-    
-    public TableSegmentBinderContext(final Collection<ProjectionSegment> 
projectionSegments) {
-        columnLabelProjectionSegments = new 
LinkedHashMap<>(projectionSegments.size(), 1F);
-        projectionSegments.forEach(each -> 
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
-    }
-    
-    private void putColumnLabelProjectionSegments(final ProjectionSegment 
projectionSegment, final Map<String, ProjectionSegment> 
columnLabelProjectionSegments) {
-        if (projectionSegment instanceof ShorthandProjectionSegment) {
-            ((ShorthandProjectionSegment) 
projectionSegment).getActualProjectionSegments().forEach(each -> 
columnLabelProjectionSegments.put(each.getColumnLabel().toLowerCase(), each));
-        } else {
-            
columnLabelProjectionSegments.put(projectionSegment.getColumnLabel().toLowerCase(),
 projectionSegment);
-        }
-    }
+public interface TableSegmentBinderContext {
     
     /**
-     * Get projection segment by column label.
-     * 
+     * Find projection segment by column label.
+     *
      * @param columnLabel column label
      * @return projection segment
      */
-    public ProjectionSegment getProjectionSegmentByColumnLabel(final String 
columnLabel) {
-        return columnLabelProjectionSegments.get(columnLabel.toLowerCase());
-    }
+    Optional<ProjectionSegment> findProjectionSegmentByColumnLabel(String 
columnLabel);
     
     /**
      * Get projection segments.
      *
      * @return projection segments
      */
-    public Collection<ProjectionSegment> getProjectionSegments() {
-        return columnLabelProjectionSegments.values();
-    }
+    Collection<ProjectionSegment> getProjectionSegments();
 }
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 f46774efbdb..76431790969 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
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 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;
@@ -108,9 +109,9 @@ public final class SimpleTableSegmentBinder {
         return new IdentifierValue(new 
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(statementBinderContext.getDefaultDatabaseName()));
     }
     
-    private static TableSegmentBinderContext 
createSimpleTableBinderContext(final SimpleTableSegment segment, final 
ShardingSphereSchema schema,
-                                                                            
final IdentifierValue originalDatabase, final IdentifierValue originalSchema,
-                                                                            
final SQLStatementBinderContext statementBinderContext) {
+    private static SimpleTableSegmentBinderContext 
createSimpleTableBinderContext(final SimpleTableSegment segment, final 
ShardingSphereSchema schema,
+                                                                               
   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<>();
@@ -124,7 +125,7 @@ public final class SimpleTableSegmentBinder {
             columnProjectionSegment.setVisible(each.isVisible());
             projectionSegments.add(columnProjectionSegment);
         }
-        return new TableSegmentBinderContext(projectionSegments);
+        return new SimpleTableSegmentBinderContext(projectionSegments);
     }
     
     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/segment/from/impl/SubqueryTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
index 2b874884028..74bb8196f6e 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
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 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;
@@ -64,7 +65,7 @@ public final class SubqueryTableSegmentBinder {
         segment.getAliasSegment().ifPresent(result::setAlias);
         IdentifierValue subqueryTableName = 
segment.getAliasSegment().map(AliasSegment::getIdentifier).orElseGet(() -> new 
IdentifierValue(""));
         tableBinderContexts.put(subqueryTableName.getValue().toLowerCase(),
-                new 
TableSegmentBinderContext(createSubqueryProjections(boundedSelect.getProjections().getProjections(),
 subqueryTableName)));
+                new 
SimpleTableSegmentBinderContext(createSubqueryProjections(boundedSelect.getProjections().getProjections(),
 subqueryTableName)));
         return result;
     }
     
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 0de5d321033..66119adb2f1 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
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.binder.segment.expression.impl;
 
 import org.apache.shardingsphere.infra.binder.enums.SegmentType;
+import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 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;
@@ -48,11 +49,11 @@ class ColumnSegmentBinderTest {
         ColumnSegment boundedOrderIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
         boundedOrderIdColumn.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
                 new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
-        tableBinderContexts.put("t_order", new 
TableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderIdColumn))));
+        tableBinderContexts.put("t_order", new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderIdColumn))));
         ColumnSegment boundedItemIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("item_id"));
         boundedItemIdColumn.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("item_id")));
-        tableBinderContexts.put("t_order_item", new 
TableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedItemIdColumn))));
+        tableBinderContexts.put("t_order_item", new 
SimpleTableSegmentBinderContext(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"), Collections.emptySet());
@@ -71,11 +72,11 @@ class ColumnSegmentBinderTest {
         ColumnSegment boundedOrderStatusColumn = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
         boundedOrderStatusColumn.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
                 new IdentifierValue("t_order"), new 
IdentifierValue("status")));
-        outerTableBinderContexts.put("t_order", new 
TableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderStatusColumn))));
+        outerTableBinderContexts.put("t_order", new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderStatusColumn))));
         ColumnSegment boundedOrderItemStatusColumn = new ColumnSegment(0, 0, 
new IdentifierValue("status"));
         boundedOrderItemStatusColumn.setColumnBoundedInfo(new 
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
                 new IdentifierValue("t_order_item"), new 
IdentifierValue("status")));
-        outerTableBinderContexts.put("t_order_item", new 
TableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderItemStatusColumn))));
+        outerTableBinderContexts.put("t_order_item", new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundedOrderItemStatusColumn))));
         SQLStatementBinderContext statementBinderContext =
                 new 
SQLStatementBinderContext(mock(ShardingSphereMetaData.class), 
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class, 
"FIXTURE"), Collections.emptySet());
         ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("status"));
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 8018ade80fa..25f6a270ff9 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
@@ -62,32 +62,35 @@ class SimpleTableSegmentBinderTest {
         
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
 is(DefaultDatabase.LOGIC_NAME));
         assertTrue(tableBinderContexts.containsKey("t_order"));
         
assertThat(tableBinderContexts.get("t_order").getProjectionSegments().size(), 
is(3));
-        
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").isPresent());
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()
 instanceof ColumnProjectionSegment);
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+                .getValue(), is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
-                is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
                 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
                 is("user_id"));
-        
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
-                is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
-                is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").isPresent());
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()
 instanceof ColumnProjectionSegment);
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+                .getValue(), is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalSchema()
+                .getValue(), is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
                 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
-                is("order_id"));
-        
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")
 instanceof ColumnProjectionSegment);
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
-                is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalColumn()
+                .getValue(), is("order_id"));
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").isPresent());
+        
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()
 instanceof ColumnProjectionSegment);
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+                .getValue(), is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
                 is(DefaultDatabase.LOGIC_NAME));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
                 is("t_order"));
-        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
                 is("status"));
     }
     
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
index 8200fc2213d..5a383048215 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.binder.segment.projection.impl;
 
+import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
 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;
@@ -53,7 +54,7 @@ class ShorthandProjectionSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
         ColumnProjectionSegment invisibleColumn = new 
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
         invisibleColumn.setVisible(false);
-        tableBinderContexts.put("o", new 
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+        tableBinderContexts.put("o", new 
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
         ShorthandProjectionSegment actual = 
ShorthandProjectionSegmentBinder.bind(shorthandProjectionSegment, 
mock(TableSegment.class), tableBinderContexts);
         assertThat(actual.getActualProjectionSegments().size(), is(1));
         ProjectionSegment visibleColumn = 
actual.getActualProjectionSegments().iterator().next();
@@ -66,7 +67,7 @@ class ShorthandProjectionSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
         ColumnProjectionSegment invisibleColumn = new 
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
         invisibleColumn.setVisible(false);
-        tableBinderContexts.put("o", new 
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+        tableBinderContexts.put("o", new 
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
         SimpleTableSegment boundedTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
         boundedTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("o")));
         ShorthandProjectionSegment actual = 
ShorthandProjectionSegmentBinder.bind(new ShorthandProjectionSegment(0, 0), 
boundedTableSegment, tableBinderContexts);
@@ -81,7 +82,7 @@ class ShorthandProjectionSegmentBinderTest {
         Map<String, TableSegmentBinderContext> tableBinderContexts = new 
LinkedHashMap<>();
         ColumnProjectionSegment invisibleColumn = new 
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
         invisibleColumn.setVisible(false);
-        tableBinderContexts.put("o", new 
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+        tableBinderContexts.put("o", new 
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new 
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
         SubqueryTableSegment boundedTableSegment = new 
SubqueryTableSegment(new SubquerySegment(0, 0, 
mock(MySQLSelectStatement.class)));
         boundedTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("o")));
         ShorthandProjectionSegment actual = 
ShorthandProjectionSegmentBinder.bind(new ShorthandProjectionSegment(0, 0), 
boundedTableSegment, tableBinderContexts);


Reply via email to