diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java index 31a9d034ac8073116c7122b52209796c99b59bfb..b366194a911db3d0be95ed6fcf2a0f7177cf1ff5 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/MySQLDMLVisitor.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.Duplica import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.EscapedTableReferenceContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExprContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FromClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GroupByClauseContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertValuesClauseContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.JoinedTableContext; @@ -36,6 +37,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LimitRo import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.MultipleTableNamesContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.MultipleTablesClauseContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.OnDuplicateKeyClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.OrderByItemContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ProjectionContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ProjectionsContext; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QualifiedShorthandContext; @@ -66,7 +68,9 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ExpressionProje import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionsSegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ShorthandProjectionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.GroupBySegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.OrderBySegment; +import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.OrderByItemSegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.PaginationValueSegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.LimitSegment; import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.NumberLiteralLimitValueSegment; @@ -295,6 +299,11 @@ public final class MySQLDMLVisitor extends MySQLVisitor { result.setWhere(where); result.getAllSQLSegments().add(where); } + if (null != ctx.groupByClause()) { + GroupBySegment groupBy = (GroupBySegment) visit(ctx.groupByClause()); + result.setGroupBy(groupBy); + result.getAllSQLSegments().add(groupBy); + } if (null != ctx.orderByClause()) { OrderBySegment orderBy = (OrderBySegment) visit(ctx.orderByClause()); result.setOrderBy(orderBy); @@ -457,6 +466,15 @@ public final class MySQLDMLVisitor extends MySQLVisitor { return result; } + @Override + public ASTNode visitGroupByClause(final GroupByClauseContext ctx) { + Collection items = new LinkedList<>(); + for (OrderByItemContext each : ctx.orderByItem()) { + items.add((OrderByItemSegment) visit(each)); + } + return new GroupBySegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), items); + } + @Override public ASTNode visitLimitClause(final LimitClauseContext ctx) { if (null == ctx.limitOffset()) { diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-group-by.xml b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-group-by.xml new file mode 100644 index 0000000000000000000000000000000000000000..a15a59c978c50543b18d2b2117f7c4f3344b40e8 --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-group-by.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-pagination-group-by-order-by.xml b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-pagination-group-by-order-by.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6619fc0718dee2d852a8b865772501a07d59e76 --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/resources/visitor/dml/select-pagination-group-by-order-by.xml @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + + +