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 <duanzhengqi...@apache.org> 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;