You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2023/07/27 09:47:25 UTC
[shardingsphere] branch master updated: Add unit test for SimpleTableSegmentBinder (#27509)
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 <du...@apache.org>
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;