diff --git a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4 b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4 index 4b5afee79f227..8c56339adfa66 100644 --- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4 +++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4 @@ -89,7 +89,7 @@ duplicateSpecification ; projections - : (unqualifiedShorthand | projection | top (unqualifiedShorthand | projection)) (COMMA_ (unqualifiedShorthand | projection))* + : (unqualifiedShorthand | projection | top (unqualifiedShorthand | projection)?) (COMMA_ (unqualifiedShorthand | projection))* ; projection @@ -98,7 +98,7 @@ projection ; top - : TOP LP_? topNum RP_? PERCENT? (WITH TIES)? (ROW_NUMBER LP_ RP_ OVER LP_ orderByClause RP_)? + : TOP LP_? topNum RP_? PERCENT? (WITH TIES)? (ROW_NUMBER LP_ RP_ OVER LP_ orderByClause RP_ (AS? alias)?)? ; topNum diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java index 9c7cdf163a923..bbbcfea55ca26 100644 --- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java +++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java @@ -854,8 +854,7 @@ private boolean isDistinct(final SelectClauseContext ctx) { public ASTNode visitProjections(final ProjectionsContext ctx) { Collection projections = new LinkedList<>(); if (null != ctx.top()) { - RowNumberValueSegment rowNumber = (RowNumberValueSegment) visit(ctx.top()); - projections.add(new TopProjectionSegment(ctx.top().getStart().getStartIndex(), ctx.top().getStop().getStopIndex(), rowNumber, null)); + projections.add((ProjectionSegment) visit(ctx.top())); } for (UnqualifiedShorthandContext each : ctx.unqualifiedShorthand()) { projections.add(new ShorthandProjectionSegment(each.getStart().getStartIndex(), each.getStop().getStopIndex())); @@ -1154,11 +1153,12 @@ public ASTNode visitTop(final TopContext ctx) { int stopIndex = ctx.topNum().getStop().getStopIndex(); ASTNode topNum = visit(ctx.topNum()); if (topNum instanceof NumberLiteralValue) { - return new NumberLiteralRowNumberValueSegment(startIndex, stopIndex, ((NumberLiteralValue) topNum).getValue().longValue(), false); + NumberLiteralRowNumberValueSegment rowNumberSegment = new NumberLiteralRowNumberValueSegment(startIndex, stopIndex, ((NumberLiteralValue) topNum).getValue().longValue(), false); + return new TopProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), rowNumberSegment, null != ctx.alias() ? ctx.alias().getText() : null); } - ParameterMarkerSegment result = new ParameterMarkerRowNumberValueSegment(startIndex, stopIndex, ((ParameterMarkerValue) topNum).getValue(), false); - parameterMarkerSegments.add(result); - return result; + ParameterMarkerSegment parameterSegment = new ParameterMarkerRowNumberValueSegment(startIndex, stopIndex, ((ParameterMarkerValue) topNum).getValue(), false); + parameterMarkerSegments.add(parameterSegment); + return new TopProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (RowNumberValueSegment) parameterSegment, null != ctx.alias() ? ctx.alias().getText() : null); } @Override diff --git a/test/it/parser/src/main/resources/case/dml/select-pagination-group-by-order-by.xml b/test/it/parser/src/main/resources/case/dml/select-pagination-group-by-order-by.xml index 7de217646673d..e5ba2832a5d26 100644 --- a/test/it/parser/src/main/resources/case/dml/select-pagination-group-by-order-by.xml +++ b/test/it/parser/src/main/resources/case/dml/select-pagination-group-by-order-by.xml @@ -253,10 +253,9 @@ - + - @@ -543,10 +541,9 @@ - + - @@ -833,10 +829,9 @@ - + - @@ -1123,10 +1117,9 @@ - + - diff --git a/test/it/parser/src/main/resources/case/dml/select-pagination.xml b/test/it/parser/src/main/resources/case/dml/select-pagination.xml index cd4321f53926e..46ae6047b1892 100644 --- a/test/it/parser/src/main/resources/case/dml/select-pagination.xml +++ b/test/it/parser/src/main/resources/case/dml/select-pagination.xml @@ -460,10 +460,9 @@ - + - @@ -925,10 +923,9 @@ - + - @@ -1205,10 +1201,9 @@ - + - diff --git a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml index d97bd618ac9ab..a2a47e796b954 100644 --- a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml +++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml @@ -375,26 +375,26 @@ - - + + - - + + - - + + - - + + @@ -419,26 +419,26 @@ - - + + - - + + - - + + - - + +