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>