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;

Reply via email to