提交 087588b1 编写于 作者: J JingShang Lu

fix visitor of SQLServer for limit

上级 6ba9a428
......@@ -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;
......@@ -486,20 +483,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;
......
......@@ -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();
......
......@@ -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 {
......
......@@ -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>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册