This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 2dbfd78c49d Support select join using statement and escape projection
convert to SqlNode (#20229)
2dbfd78c49d is described below
commit 2dbfd78c49d435109e19c6f6d7a48a0d958b06b2
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Aug 17 14:12:18 2022 +0800
Support select join using statement and escape projection convert to
SqlNode (#20229)
* Support select join using statement and escape projection convert to
SqlNode
* Refactor join condition convert logic
---
.../segment/from/impl/JoinTableConverter.java | 31 ++++++++++++++++++++--
.../impl/AggregationProjectionConverter.java | 3 ++-
.../SQLNodeConvertEngineParameterizedTest.java | 2 ++
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/from/impl/JoinTableConverter.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/from/impl/JoinTableConverter.java
index 9a58950ed45..55b886b4ce0 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/from/impl/JoinTableConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/from/impl/JoinTableConverter.java
@@ -22,12 +22,17 @@ import org.apache.calcite.sql.JoinType;
import org.apache.calcite.sql.SqlJoin;
import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.parser.SqlParserPos;
import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.SQLSegmentConverter;
import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.expression.ExpressionConverter;
+import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.expression.impl.ColumnConverter;
import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.from.TableConverter;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
+import java.util.Collection;
+import java.util.LinkedList;
import java.util.Optional;
/**
@@ -39,9 +44,31 @@ public final class JoinTableConverter implements
SQLSegmentConverter<JoinTableSe
public Optional<SqlJoin> convert(final JoinTableSegment segment) {
SqlNode left = new
TableConverter().convert(segment.getLeft()).orElseThrow(IllegalStateException::new);
SqlNode right = new
TableConverter().convert(segment.getRight()).orElseThrow(IllegalStateException::new);
- Optional<SqlNode> condition = new
ExpressionConverter().convert(segment.getCondition());
- SqlLiteral conditionType = condition.isPresent() ?
JoinConditionType.ON.symbol(SqlParserPos.ZERO) :
JoinConditionType.NONE.symbol(SqlParserPos.ZERO);
+ Optional<SqlNode> condition = convertJoinCondition(segment);
+ SqlLiteral conditionType = convertConditionType(segment);
SqlLiteral joinType =
JoinType.valueOf(segment.getJoinType()).symbol(SqlParserPos.ZERO);
return Optional.of(new SqlJoin(SqlParserPos.ZERO, left,
SqlLiteral.createBoolean(false, SqlParserPos.ZERO), joinType, right,
conditionType, condition.orElse(null)));
}
+
+ private static SqlLiteral convertConditionType(final JoinTableSegment
segment) {
+ if (!segment.getUsing().isEmpty()) {
+ return JoinConditionType.USING.symbol(SqlParserPos.ZERO);
+ }
+ return null != segment.getCondition() ?
JoinConditionType.ON.symbol(SqlParserPos.ZERO) :
JoinConditionType.NONE.symbol(SqlParserPos.ZERO);
+ }
+
+ private static Optional<SqlNode> convertJoinCondition(final
JoinTableSegment segment) {
+ if (null != segment.getCondition()) {
+ return new ExpressionConverter().convert(segment.getCondition());
+ }
+ if (!segment.getUsing().isEmpty()) {
+ Collection<SqlNode> sqlNodes = new LinkedList<>();
+ ColumnConverter columnConverter = new ColumnConverter();
+ for (ColumnSegment each : segment.getUsing()) {
+ columnConverter.convert(each).ifPresent(sqlNodes::add);
+ }
+ return Optional.of(new SqlNodeList(sqlNodes, SqlParserPos.ZERO));
+ }
+ return Optional.empty();
+ }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
index 5916f40cfb3..ee5628f83e8 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
@@ -65,7 +65,8 @@ public final class AggregationProjectionConverter implements
SQLSegmentConverter
return Optional.empty();
}
SqlLiteral functionQuantifier = null;
- List<String> parameters =
Splitter.on(",").trimResults().splitToList(SQLUtil.getExpressionWithoutOutsideParentheses(segment.getInnerExpression()));
+ List<String> parameters = Splitter.on(",").trimResults().splitToList(
+
SQLUtil.getExactlyValue(SQLUtil.getExpressionWithoutOutsideParentheses(segment.getInnerExpression())));
if (segment instanceof AggregationDistinctProjectionSegment) {
parameters =
Collections.singletonList(((AggregationDistinctProjectionSegment)
segment).getDistinctExpression());
functionQuantifier =
SqlLiteral.createSymbol(SqlSelectKeyword.DISTINCT, SqlParserPos.ZERO);
diff --git
a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
index f455b52eb2d..1906b0b68e2 100644
---
a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
+++
b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
@@ -97,6 +97,8 @@ public final class SQLNodeConvertEngineParameterizedTest {
SUPPORTED_SQL_CASE_IDS.add("select_group_by_with_having_count");
SUPPORTED_SQL_CASE_IDS.add("select_constant_without_table");
SUPPORTED_SQL_CASE_IDS.add("select_count_with_binding_tables_with_join");
+ SUPPORTED_SQL_CASE_IDS.add("select_join_using");
+ SUPPORTED_SQL_CASE_IDS.add("select_count_with_escape_character");
}
private final String sqlCaseId;