You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2021/07/21 11:01:49 UTC
[GitHub] [shardingsphere] strongduanmu commented on a change in pull request #11426: union mysql parser support
strongduanmu commented on a change in pull request #11426:
URL: https://github.com/apache/shardingsphere/pull/11426#discussion_r673866068
##########
File path: shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
##########
@@ -605,9 +608,36 @@ public ASTNode visitQueryExpressionBody(final QueryExpressionBodyContext ctx) {
if (1 == ctx.getChildCount() && ctx.getChild(0) instanceof QueryPrimaryContext) {
return visit(ctx.queryPrimary());
}
- throw new IllegalStateException("union select is not supported yet.");
+ if (ctx.queryExpressionBody() != null) {
Review comment:
@tuichenchuxin `null != ctx.queryExpressionBody()` is better.
##########
File path: shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
##########
@@ -605,9 +608,36 @@ public ASTNode visitQueryExpressionBody(final QueryExpressionBodyContext ctx) {
if (1 == ctx.getChildCount() && ctx.getChild(0) instanceof QueryPrimaryContext) {
return visit(ctx.queryPrimary());
}
- throw new IllegalStateException("union select is not supported yet.");
+ if (ctx.queryExpressionBody() != null) {
+ MySQLSelectStatement result = (MySQLSelectStatement) visit(ctx.queryExpressionBody());
+ ParserRuleContext ruleContext = ctx.queryPrimary() != null ? ctx.queryPrimary() : ctx.queryExpressionParens(0);
+ MySQLSelectStatement union = (MySQLSelectStatement) visit(ruleContext);
+ UnionSegment unionSegment = new UnionSegment(getUnionType(ctx), union, ctx.UNION().getSymbol().getStartIndex(), ruleContext.getStop().getStopIndex());
+ addUnionSegments(result, unionSegment);
+ return result;
+ }
+ MySQLSelectStatement result = (MySQLSelectStatement) visit(ctx.queryExpressionParens(0));
Review comment:
This code block looks same with previous, please consider to extract with method.
##########
File path: shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
##########
@@ -605,9 +608,36 @@ public ASTNode visitQueryExpressionBody(final QueryExpressionBodyContext ctx) {
if (1 == ctx.getChildCount() && ctx.getChild(0) instanceof QueryPrimaryContext) {
return visit(ctx.queryPrimary());
}
- throw new IllegalStateException("union select is not supported yet.");
+ if (ctx.queryExpressionBody() != null) {
+ MySQLSelectStatement result = (MySQLSelectStatement) visit(ctx.queryExpressionBody());
+ ParserRuleContext ruleContext = ctx.queryPrimary() != null ? ctx.queryPrimary() : ctx.queryExpressionParens(0);
+ MySQLSelectStatement union = (MySQLSelectStatement) visit(ruleContext);
+ UnionSegment unionSegment = new UnionSegment(getUnionType(ctx), union, ctx.UNION().getSymbol().getStartIndex(), ruleContext.getStop().getStopIndex());
+ addUnionSegments(result, unionSegment);
+ return result;
+ }
+ MySQLSelectStatement result = (MySQLSelectStatement) visit(ctx.queryExpressionParens(0));
+ ParserRuleContext ruleContext = ctx.queryPrimary() != null ? ctx.queryPrimary() : ctx.queryExpressionParens(1);
+ MySQLSelectStatement union = (MySQLSelectStatement) visit(ruleContext);
+ UnionSegment unionSegment = new UnionSegment(getUnionType(ctx), union, ctx.UNION().getSymbol().getStartIndex(), ruleContext.getStop().getStopIndex());
+ addUnionSegments(result, unionSegment);
Review comment:
Please init UnionSegments in MySQLSelectStatement.
##########
File path: shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/SelectStatementHandler.java
##########
@@ -113,4 +115,17 @@
}
return Optional.empty();
}
+
+ /**
+ * Get union segment.
+ *
+ * @param selectStatement select statement
+ * @return union segment list
+ */
+ public static Optional<List<UnionSegment>> getUnionSegments(final SelectStatement selectStatement) {
Review comment:
UnionSegment should be a common segment for different dialects.
##########
File path: shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/SelectStatement.java
##########
@@ -52,6 +54,8 @@
private OrderBySegment orderBy;
private WithSegment withSegment;
+
+ private List<UnionSegment> unionSegments;
Review comment:
`Collection<UnionSegment> unionSegments = new LinkedList()` is better.
##########
File path: shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dml/impl/SelectStatementAssert.java
##########
@@ -68,8 +72,9 @@ public static void assertIs(final SQLCaseAssertContext assertContext, final Sele
assertTable(assertContext, actual, expected);
assertLockClause(assertContext, actual, expected);
assertWithClause(assertContext, actual, expected);
+ assertUnions(assertContext, actual, expected);
}
-
Review comment:
Please keep indents consistent with the previous one.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@shardingsphere.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org