This is an automated email from the ASF dual-hosted git repository.

panjuan 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 087588b  fix visitor of SQLServer for limit
     new bbc9ff6  Merge pull request #7077 from jingshanglu/issue-7032
087588b is described below

commit 087588b1890c40d112fb33975aa1c6caad3ce504
Author: JingShang Lu <[email protected]>
AuthorDate: Wed Aug 26 13:50:39 2020 +0800

    fix visitor of SQLServer for limit
---
 .../parser/sqlserver/visitor/SQLServerVisitor.java | 17 --------
 .../visitor/impl/SQLServerDMLVisitor.java          | 46 +++++++++++++++++++++-
 .../asserts/segment/limit/LimitClauseAssert.java   |  2 +-
 .../main/resources/case/dml/select-pagination.xml  |  5 ++-
 4 files changed, 50 insertions(+), 20 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
index 2f10a5b..1bfb6fb 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
@@ -46,7 +46,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Ind
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.LiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.NullValueLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.NumberLiteralsContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OrderByClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OrderByItemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OwnerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ParameterMarkerContext;
@@ -74,11 +73,9 @@ import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.Subque
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.AggregationDistinctProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ExpressionProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.OrderBySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ExpressionOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.OrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateBetweenRightValue;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
@@ -487,20 +484,6 @@ public abstract class SQLServerVisitor extends 
SQLServerStatementBaseVisitor<AST
     }
     
     @Override
-    public final ASTNode visitOrderByClause(final OrderByClauseContext ctx) {
-        Collection<OrderByItemSegment> items = new LinkedList<>();
-        for (OrderByItemContext each : ctx.orderByItem()) {
-            items.add((OrderByItemSegment) visit(each));
-        }
-        if (null != ctx.expr()) {
-            for (ExprContext each : ctx.expr()) {
-                visit(each);
-            }
-        }
-        return new OrderBySegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), items);
-    }
-    
-    @Override
     public final ASTNode visitOrderByItem(final OrderByItemContext ctx) {
         OrderDirection orderDirection = null != ctx.DESC() ? 
OrderDirection.DESC : OrderDirection.ASC;
         if (null != ctx.columnName()) {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/impl/SQLServerDMLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/impl/SQLServerDMLVisitor.java
index d47064e9..29f7179 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/impl/SQLServerDMLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/impl/SQLServerDMLVisitor.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sqlserver.visitor.impl;
 
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.visitor.statement.DMLVisitor;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OrderByClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AliasContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentValueContext;
@@ -65,6 +66,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.column.InsertColumns
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.complex.CommonExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.AggregationProjectionSegment;
@@ -77,6 +79,10 @@ import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.SubqueryProject
 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;
+import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.ParameterMarkerLimitValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.rownum.RowNumberValueSegment;
@@ -272,10 +278,48 @@ public final class SQLServerDMLVisitor extends 
SQLServerVisitor implements DMLVi
             result.setGroupBy((GroupBySegment) visit(ctx.groupByClause()));
         }
         if (null != ctx.orderByClause()) {
-            result.setOrderBy((OrderBySegment) visit(ctx.orderByClause()));
+            result = visitOrderBy(result, ctx.orderByClause());
         }
         return result;
     }
+    
+    private SelectStatement visitOrderBy(final SelectStatement 
selectStatement, final OrderByClauseContext ctx) {
+        Collection<OrderByItemSegment> items = new LinkedList<>();
+        int orderByStartIndex = ctx.start.getStartIndex();
+        int orderByStopIndex = ctx.start.getStartIndex();
+        for (OrderByItemContext each : ctx.orderByItem()) {
+            items.add((OrderByItemSegment) visit(each));
+            orderByStopIndex = each.stop.getStopIndex();
+        }
+        OrderBySegment orderBySegment = new OrderBySegment(orderByStartIndex, 
orderByStopIndex, items);
+        selectStatement.setOrderBy(orderBySegment);
+        PaginationValueSegment offset = null;
+        PaginationValueSegment rowcount = null;
+        LimitSegment limitSegment = null;
+        if (null != ctx.OFFSET()) {
+            ASTNode astNode = visit(ctx.expr(0));
+            if (astNode instanceof LiteralExpressionSegment && 
((LiteralExpressionSegment) astNode).getLiterals() instanceof Number) {
+                offset = new 
NumberLiteralLimitValueSegment(ctx.expr(0).start.getStartIndex(), 
ctx.expr(0).stop.getStopIndex(),
+                        ((Number) ((LiteralExpressionSegment) 
astNode).getLiterals()).longValue());
+            } else if (astNode instanceof ParameterMarkerExpressionSegment) {
+                offset = new 
ParameterMarkerLimitValueSegment(ctx.expr(0).start.getStartIndex(), 
ctx.expr(0).stop.getStopIndex(), getCurrentParameterIndex());
+            }
+        }
+        if (null != ctx.FETCH()) {
+            ASTNode astNode = visit(ctx.expr(1));
+            if (astNode instanceof LiteralExpressionSegment && 
((LiteralExpressionSegment) astNode).getLiterals() instanceof Number) {
+                rowcount = new 
NumberLiteralLimitValueSegment(ctx.expr(1).start.getStartIndex(), 
ctx.expr(1).stop.getStopIndex(),
+                        ((Number) ((LiteralExpressionSegment) 
astNode).getLiterals()).longValue());
+            } else if (astNode instanceof ParameterMarkerExpressionSegment) {
+                rowcount = new 
ParameterMarkerLimitValueSegment(ctx.expr(1).start.getStartIndex(), 
ctx.expr(1).stop.getStopIndex(), getCurrentParameterIndex());
+            }
+        }
+        if (null != offset) {
+            limitSegment = new 
LimitSegment(ctx.OFFSET().getSymbol().getStartIndex(), ctx.stop.getStopIndex(), 
offset, rowcount);
+        }
+        selectStatement.setLimit(limitSegment);
+        return selectStatement;
+    }
 
     private boolean isDistinct(final SelectClauseContext ctx) {
         return ((BooleanLiteralValue) 
visit(ctx.duplicateSpecification())).getValue();
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/limit/LimitClauseAssert.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/limit/LimitClauseAssert.java
index 8a99765..2864e5c 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/limit/LimitClauseAssert.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/limit/LimitClauseAssert.java
@@ -49,7 +49,7 @@ public final class LimitClauseAssert {
             assertNull(assertContext.getText("Offset should not exist."), 
expected);
             return;
         }
-        if (SQLCaseType.Placeholder == assertContext.getSqlCaseType()) {
+        if (actual instanceof ParameterMarkerPaginationValueSegment) {
             assertThat(assertContext.getText("Offset index assertion error: "),
                     ((ParameterMarkerPaginationValueSegment) 
actual).getParameterIndex(), is(expected.getParameterIndex()));
         } else {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-pagination.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-pagination.xml
index 77bee90..8475528 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-pagination.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-pagination.xml
@@ -1465,6 +1465,9 @@
         <order-by>
             <column-item name="order_id" start-index="31" stop-index="38" />
         </order-by>
-        <row-count value="20" parameter-index="0" />
+        <limit literal-start-index="40" literal-stop-index="75" 
start-index="40" stop-index="74">
+            <offset value="0" start-index="47" stop-index="47" 
literal-start-index="47" literal-stop-index="47"/>
+            <row-count value="20" parameter-index="1" literal-start-index="64" 
literal-stop-index="65" start-index="64" stop-index="64"/>
+        </limit>
     </select>
 </sql-parser-test-cases>

Reply via email to