This is an automated email from the ASF dual-hosted git repository.

chengzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new f2f8d1a90bb Add unit test for SimpleTableSegmentBinder (#27509)
f2f8d1a90bb is described below

commit f2f8d1a90bb23f0eda81bd5d7d3ce823ed0b9a63
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jul 27 17:47:17 2023 +0800

    Add unit test for SimpleTableSegmentBinder (#27509)
    
    * Add unit test for SimpleTableSegmentBinder
    
    * optimize sequence for shorthand expand
---
 .../segment/expression/ColumnSegmentBinder.java    |  16 ++-
 .../segment/from/TableSegmentBinderContext.java    |  39 +++++-
 .../from/impl/SimpleTableSegmentBinder.java        |  16 ++-
 .../from/impl/SubqueryTableSegmentBinder.java      |  18 +--
 .../impl/ShorthandProjectionSegmentBinder.java     |   5 +-
 .../from/impl/SimpleTableSegmentBinderTest.java    | 144 +++++++++++++++++++++
 .../common/segment/dml/column/ColumnSegment.java   |   4 +
 7 files changed, 206 insertions(+), 36 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ColumnSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ColumnSegmentBinder.java
index c43e7abee32..3fc567ebbfd 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ColumnSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/ColumnSegmentBinder.java
@@ -24,7 +24,6 @@ import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePrecondition
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -53,20 +52,23 @@ public final class ColumnSegmentBinder {
         }
         ColumnSegment result = new ColumnSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier());
         segment.getOwner().ifPresent(result::setOwner);
-        result.setOriginalColumn(null == segment.getOriginalColumn() ? 
segment.getIdentifier() : segment.getOriginalColumn());
         Collection<TableSegmentBinderContext> tableBinderContextValues =
                 segment.getOwner().isPresent() ? 
Collections.singleton(tableBinderContexts.get(segment.getOwner().get().getIdentifier().getValue()))
 : tableBinderContexts.values();
-        result.setOriginalTable(null == segment.getOriginalTable() ? 
findTableNameByColumnName(segment.getIdentifier().getValue(), 
tableBinderContextValues) : segment.getOriginalTable());
+        ColumnSegment inputColumnSegment = 
findInputColumnSegment(segment.getIdentifier().getValue(), 
tableBinderContextValues);
+        result.setOriginalDatabase(inputColumnSegment.getOriginalDatabase());
+        result.setOriginalSchema(inputColumnSegment.getOriginalSchema());
+        result.setOriginalTable(null == segment.getOriginalTable() ? 
inputColumnSegment.getOriginalTable() : segment.getOriginalTable());
+        result.setOriginalColumn(null == segment.getOriginalColumn() ? 
segment.getIdentifier() : segment.getOriginalColumn());
         return result;
     }
     
-    private static IdentifierValue findTableNameByColumnName(final String 
columnName, final Collection<TableSegmentBinderContext> tableBinderContexts) {
-        IdentifierValue result = null;
+    private static ColumnSegment findInputColumnSegment(final String 
columnName, final Collection<TableSegmentBinderContext> tableBinderContexts) {
+        ColumnSegment result = null;
         for (TableSegmentBinderContext each : tableBinderContexts) {
-            ProjectionSegment projectionSegment = 
each.getColumnLabelProjectionSegments().get(columnName);
+            ProjectionSegment projectionSegment = 
each.getProjectionSegmentByColumnLabel(columnName);
             if (projectionSegment instanceof ColumnProjectionSegment) {
                 ShardingSpherePreconditions.checkState(null == result, () -> 
new IllegalStateException(String.format("Column '%s' in field list is 
ambiguous.", columnName)));
-                result = ((ColumnProjectionSegment) 
projectionSegment).getColumn().getOriginalTable();
+                result = ((ColumnProjectionSegment) 
projectionSegment).getColumn();
             }
         }
         ShardingSpherePreconditions.checkNotNull(result, () -> new 
IllegalStateException(String.format("Unknown column '%s' in 'field list'.", 
columnName)));
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 66da672e292..7f826fd107b 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,18 +17,49 @@
 
 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;
 
+import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
  * Table segment binder context.
  */
-@RequiredArgsConstructor
-@Getter
 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);
+        }
+    }
+    
+    /**
+     * Get projection segment by column label.
+     * 
+     * @param columnLabel column label
+     * @return projection segment
+     */
+    public ProjectionSegment getProjectionSegmentByColumnLabel(final String 
columnLabel) {
+        return columnLabelProjectionSegments.get(columnLabel.toLowerCase());
+    }
+    
+    /**
+     * Get projection segments.
+     *
+     * @return projection segments
+     */
+    public Collection<ProjectionSegment> getProjectionSegments() {
+        return columnLabelProjectionSegments.values();
+    }
 }
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 812667a9352..c904ba9ff20 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,7 +19,6 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.commons.collections4.map.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
@@ -36,6 +35,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.Identifi
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Optional;
 
@@ -71,7 +71,8 @@ public final class SimpleTableSegmentBinder {
         IdentifierValue originalSchema = getSchemaName(segment, 
defaultDatabaseName, databaseType);
         // TODO check database and schema
         ShardingSphereSchema schema = 
metaData.getDatabase(originalDatabase.getValue()).getSchema(originalSchema.getValue());
-        tableBinderContexts.put(segment.getAliasName().orElseGet(() -> 
segment.getTableName().getIdentifier().getValue()), 
createSimpleTableBinderContext(segment, schema));
+        tableBinderContexts.put(segment.getAliasName().orElseGet(() -> 
segment.getTableName().getIdentifier().getValue()),
+                createSimpleTableBinderContext(segment, schema, 
originalDatabase, originalSchema));
         segment.getTableName().setOriginalDatabase(originalDatabase);
         segment.getTableName().setOriginalSchema(originalSchema);
         return segment;
@@ -94,14 +95,17 @@ public final class SimpleTableSegmentBinder {
         return new 
IdentifierValue(DatabaseTypeEngine.getDefaultSchemaName(databaseType, 
defaultDatabaseName));
     }
     
-    private static TableSegmentBinderContext 
createSimpleTableBinderContext(final SimpleTableSegment segment, final 
ShardingSphereSchema schema) {
+    private static TableSegmentBinderContext 
createSimpleTableBinderContext(final SimpleTableSegment segment, final 
ShardingSphereSchema schema, final IdentifierValue originalDatabase,
+                                                                            
final IdentifierValue originalSchema) {
         Collection<String> columnNames = 
schema.getAllColumnNames(segment.getTableName().getIdentifier().getValue());
-        Map<String, ProjectionSegment> projectionSegments = new 
CaseInsensitiveMap<>(columnNames.size(), 1L);
+        Collection<ProjectionSegment> projectionSegments = new LinkedList<>();
         for (String each : columnNames) {
             ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue(each));
-            columnSegment.setOriginalColumn(new IdentifierValue(each));
+            columnSegment.setOriginalDatabase(originalDatabase);
+            columnSegment.setOriginalSchema(originalSchema);
             
columnSegment.setOriginalTable(segment.getTableName().getIdentifier());
-            projectionSegments.put(each, new 
ColumnProjectionSegment(columnSegment));
+            columnSegment.setOriginalColumn(new IdentifierValue(each));
+            projectionSegments.add(new ColumnProjectionSegment(columnSegment));
         }
         return new TableSegmentBinderContext(projectionSegments);
     }
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 dc58962b2e1..5be80ef7a93 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
@@ -19,19 +19,15 @@ package 
org.apache.shardingsphere.infra.binder.segment.from.impl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.commons.collections4.map.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
-import java.util.Collection;
 import java.util.Map;
 
 /**
@@ -57,19 +53,7 @@ public final class SubqueryTableSegmentBinder {
         SubqueryTableSegment result = new 
SubqueryTableSegment(boundedSubquerySegment);
         segment.getAliasSegment().ifPresent(result::setAlias);
         IdentifierValue subqueryTableName = 
segment.getAliasSegment().map(AliasSegment::getIdentifier).orElseGet(() -> new 
IdentifierValue(""));
-        tableBinderContexts.put(subqueryTableName.getValue(), 
createSubqueryTableBinderContext(boundedSelect.getProjections().getProjections()));
+        tableBinderContexts.put(subqueryTableName.getValue(), new 
TableSegmentBinderContext(boundedSelect.getProjections().getProjections()));
         return result;
     }
-    
-    private static TableSegmentBinderContext 
createSubqueryTableBinderContext(final Collection<ProjectionSegment> 
projectionSegments) {
-        Map<String, ProjectionSegment> columnLabelProjectionSegments = new 
CaseInsensitiveMap<>(projectionSegments.size(), 1F);
-        for (ProjectionSegment each : projectionSegments) {
-            if (each instanceof ShorthandProjectionSegment) {
-                ((ShorthandProjectionSegment) 
each).getActualProjectionSegments().forEach(actualProjection -> 
columnLabelProjectionSegments.put(actualProjection.getColumnLabel(), 
actualProjection));
-            } else {
-                columnLabelProjectionSegments.put(each.getColumnLabel(), each);
-            }
-        }
-        return new TableSegmentBinderContext(columnLabelProjectionSegments);
-    }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
index 74d91ac5be1..364b2808c8f 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
@@ -40,9 +40,10 @@ public final class ShorthandProjectionSegmentBinder {
     public static ShorthandProjectionSegment bind(final 
ShorthandProjectionSegment segment, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         if (segment.getOwner().isPresent()) {
             TableSegmentBinderContext tableBinderContext = 
tableBinderContexts.get(segment.getOwner().get().getIdentifier().getValue());
-            
segment.getActualProjectionSegments().addAll(tableBinderContext.getColumnLabelProjectionSegments().values());
+            
segment.getActualProjectionSegments().addAll(tableBinderContext.getProjectionSegments());
         } else {
-            tableBinderContexts.values().forEach(each -> 
segment.getActualProjectionSegments().addAll(each.getColumnLabelProjectionSegments().values()));
+            // TODO expand according to different database with multi tables
+            tableBinderContexts.values().forEach(each -> 
segment.getActualProjectionSegments().addAll(each.getProjectionSegments()));
         }
         return segment;
     }
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
new file mode 100644
index 00000000000..29565ea9201
--- /dev/null
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.impl;
+
+import org.apache.commons.collections4.map.CaseInsensitiveMap;
+import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.database.mysql.MySQLDatabaseType;
+import 
org.apache.shardingsphere.infra.database.postgresql.PostgreSQLDatabaseType;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class SimpleTableSegmentBinderTest {
+    
+    @Test
+    void assertBind() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getTableName().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().getOriginalDatabase().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalSchema().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().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().getOriginalDatabase().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalSchema().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getOriginalColumn().getValue(),
 is("order_id"));
+        
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")
 instanceof ColumnProjectionSegment);
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalDatabase().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalSchema().getValue(),
+                is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalTable().getValue(),
 is("t_order"));
+        assertThat(((ColumnProjectionSegment) 
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getOriginalColumn().getValue(),
 is("status"));
+    }
+    
+    @Test
+    void assertBindWithSchemaForMySQL() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
+        simpleTableSegment.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db")));
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is("sharding_db"));
+        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is("sharding_db"));
+    }
+    
+    @Test
+    void assertBindWithoutSchemaForMySQL() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+    }
+    
+    @Test
+    void assertBindWithSchemaForPostgreSQL() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
+        OwnerSegment schema = new OwnerSegment(0, 0, new 
IdentifierValue("test"));
+        schema.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db")));
+        simpleTableSegment.setOwner(schema);
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new PostgreSQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is("sharding_db"));
+        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is("test"));
+    }
+    
+    @Test
+    void assertBindWithoutSchemaForPostgreSQL() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_order")));
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new PostgreSQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is("public"));
+    }
+    
+    @Test
+    void assertBindWhenContainsPgCatalogTableForPostgreSQL() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("pg_database")));
+        ShardingSphereMetaData metaData = createMetaData();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SimpleTableSegment actual = 
SimpleTableSegmentBinder.bind(simpleTableSegment, metaData, 
DefaultDatabase.LOGIC_NAME, new PostgreSQLDatabaseType(), tableBinderContexts);
+        assertThat(actual.getTableName().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getTableName().getOriginalSchema().getValue(), 
is("pg_catalog"));
+    }
+    
+    private ShardingSphereMetaData createMetaData() {
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+        
when(schema.getAllColumnNames("t_order")).thenReturn(Arrays.asList("order_id", 
"user_id", "status"));
+        
when(schema.getAllColumnNames("pg_database")).thenReturn(Arrays.asList("datname",
 "datdba"));
+        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
+        
when(result.getDatabase("sharding_db").getSchema("sharding_db")).thenReturn(schema);
+        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema("public")).thenReturn(schema);
+        
when(result.getDatabase("sharding_db").getSchema("test")).thenReturn(schema);
+        return result;
+    }
+}
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 f5fc5c877de..026d5e8e91f 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
@@ -43,6 +43,10 @@ public final class ColumnSegment implements 
ExpressionSegment, OwnerAvailable {
     
     private OwnerSegment owner;
     
+    private IdentifierValue originalDatabase;
+    
+    private IdentifierValue originalSchema;
+    
     private IdentifierValue originalTable;
     
     private IdentifierValue originalColumn;

Reply via email to