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 140fb9ea4d7 fix names with multi owners (#28298)
140fb9ea4d7 is described below
commit 140fb9ea4d7d1a402e139a0b8cb2e4e3136635ad
Author: Yunbo Ni <[email protected]>
AuthorDate: Mon Sep 4 17:43:02 2023 +0800
fix names with multi owners (#28298)
* feat: projection names with multi owners
* fix: check style
* fix: spotless
---------
Co-authored-by: Zhengqiang Duan <[email protected]>
---
.../segment/expression/impl/ColumnConverter.java | 21 +++++++++++++++------
.../impl/ShorthandProjectionConverter.java | 17 +++++++++++++++--
.../src/test/resources/converter/select.xml | 4 ++++
3 files changed, 34 insertions(+), 8 deletions(-)
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
index 37ef187ace4..f7f9b4b429e 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
@@ -24,7 +24,8 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.SQLSegmentConverter;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
/**
@@ -34,10 +35,18 @@ public final class ColumnConverter implements
SQLSegmentConverter<ColumnSegment,
@Override
public Optional<SqlNode> convert(final ColumnSegment segment) {
- Optional<OwnerSegment> owner = segment.getOwner();
- String columnName = segment.getIdentifier().getValue();
- SqlIdentifier sqlIdentifier = owner.map(optional -> new
SqlIdentifier(Arrays.asList(optional.getIdentifier().getValue(), columnName),
SqlParserPos.ZERO))
- .orElseGet(() -> new SqlIdentifier(columnName,
SqlParserPos.ZERO));
- return Optional.of(sqlIdentifier);
+ List<String> names = new ArrayList<>();
+ if (segment.getOwner().isPresent()) {
+ addOwnerNames(names, segment.getOwner().get());
+ }
+ names.add(segment.getIdentifier().getValue());
+ return Optional.of(new SqlIdentifier(names, SqlParserPos.ZERO));
+ }
+
+ private void addOwnerNames(final List<String> names, final OwnerSegment
owner) {
+ if (null != owner) {
+ addOwnerNames(names, owner.getOwner().orElse(null));
+ names.add(owner.getIdentifier().getValue());
+ }
}
}
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
index 78812c7a9d5..b80d845b8e3 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
@@ -22,10 +22,13 @@ import org.apache.calcite.sql.SqlIdentifier;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParserPos;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.SQLSegmentConverter;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
+import java.util.stream.IntStream;
/**
* Shorthand projection converter.
@@ -38,8 +41,18 @@ public final class ShorthandProjectionConverter implements
SQLSegmentConverter<S
return Optional.empty();
}
if (segment.getOwner().isPresent()) {
- return
Optional.of(SqlIdentifier.star(Arrays.asList(segment.getOwner().get().getIdentifier().getValue(),
""), SqlParserPos.ZERO, ImmutableList.of(SqlParserPos.ZERO,
SqlParserPos.ZERO)));
+ List<String> names = new ArrayList<>();
+ addOwnerNames(names, segment.getOwner().get());
+ names.add("");
+ return Optional.of(SqlIdentifier.star(names, SqlParserPos.ZERO,
IntStream.range(0, names.size()).mapToObj(i ->
SqlParserPos.ZERO).collect(ImmutableList.toImmutableList())));
}
return Optional.of(SqlIdentifier.star(SqlParserPos.ZERO));
}
+
+ private void addOwnerNames(final List<String> names, final OwnerSegment
owner) {
+ if (null != owner) {
+ addOwnerNames(names, owner.getOwner().orElse(null));
+ names.add(owner.getIdentifier().getValue());
+ }
+ }
}
diff --git a/test/it/optimizer/src/test/resources/converter/select.xml
b/test/it/optimizer/src/test/resources/converter/select.xml
index a28f2fe6a8d..a17523123ca 100644
--- a/test/it/optimizer/src/test/resources/converter/select.xml
+++ b/test/it/optimizer/src/test/resources/converter/select.xml
@@ -20,6 +20,10 @@
<test-cases sql-case-id="select_string_constant_type_cast"
expected-sql="SELECT CAST('1' AS INTEGER), CAST('2' AS DECIMAL)"
dbtypes="openGauss,PostgreSQL" />
<test-cases
sql-case-id="select_with_database_name_and_schema_name_in_table"
expected-sql="SELECT "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = ? AND "order_id" = ?"
db-types="PostgreSQL,openGauss" sql-case-types="PLACEHOLDER" />
<test-cases
sql-case-id="select_with_database_name_and_schema_name_in_table"
expected-sql="SELECT "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = 1 AND "order_id" = 1"
db-types="PostgreSQL,openGauss" sql-case-types="LITERAL" />
+ <test-cases sql-case-id="select_with_schema_name_in_shorthand_projection"
expected-sql="SELECT `sharding_db`.`t_order`.* FROM `t_order` WHERE `user_id` =
? AND `order_id` = ?" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+ <test-cases sql-case-id="select_with_schema_name_in_shorthand_projection"
expected-sql="SELECT `sharding_db`.`t_order`.* FROM `t_order` WHERE `user_id` =
1 AND `order_id` = 1" db-types="MySQL" sql-case-types="LITERAL" />
+ <test-cases sql-case-id="select_with_schema_name_in_column_projection"
expected-sql="SELECT `sharding_db`.`t_order`.`order_id` FROM `t_order` WHERE
`user_id` = ? AND `order_id` = ?" db-types="MySQL" sql-case-types="PLACEHOLDER"
/>
+ <test-cases sql-case-id="select_with_schema_name_in_column_projection"
expected-sql="SELECT `sharding_db`.`t_order`.`order_id` FROM `t_order` WHERE
`user_id` = 1 AND `order_id` = 1" db-types="MySQL" sql-case-types="LITERAL" />
<test-cases sql-case-id="select_with_match_against" expected-sql="SELECT *
FROM `t_order_item` WHERE MATCH (`t_order_item`.`description`) AGAINST (? IN
NATURAL LANGUAGE MODE) AND `user_id` = ?" db-types="MySQL"
sql-case-types="PLACEHOLDER" />
<test-cases sql-case-id="select_with_match_against" expected-sql="SELECT *
FROM `t_order_item` WHERE MATCH (`t_order_item`.`description`) AGAINST ('hello'
IN NATURAL LANGUAGE MODE) AND `user_id` = 10" db-types="MySQL"
sql-case-types="LITERAL" />
<test-cases sql-case-id="select_with_dollar_parameter_for_postgresql"
expected-sql="SELECT "order_id" FROM "t_order" WHERE
"user_id" = ? AND "order_id" = ? OR "user_id" =
?" db-types="PostgreSQL, openGauss" sql-case-types="PLACEHOLDER" />