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;