diff --git a/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/clause/OrderByClauseParser.java b/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/clause/OrderByClauseParser.java index f558a520e91c1..eedf10b71869d 100644 --- a/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/clause/OrderByClauseParser.java +++ b/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/clause/OrderByClauseParser.java @@ -17,6 +17,7 @@ package io.shardingsphere.core.parsing.parser.clause; +import com.google.common.base.Optional; import io.shardingsphere.core.constant.OrderDirection; import io.shardingsphere.core.parsing.lexer.LexerEngine; import io.shardingsphere.core.parsing.lexer.dialect.oracle.OracleKeyword; @@ -30,7 +31,9 @@ import io.shardingsphere.core.parsing.parser.expression.SQLIdentifierExpression; import io.shardingsphere.core.parsing.parser.expression.SQLIgnoreExpression; import io.shardingsphere.core.parsing.parser.expression.SQLNumberExpression; +import io.shardingsphere.core.parsing.parser.expression.SQLPlaceholderExpression; import io.shardingsphere.core.parsing.parser.expression.SQLPropertyExpression; +import io.shardingsphere.core.parsing.parser.expression.SQLTextExpression; import io.shardingsphere.core.parsing.parser.sql.dql.select.SelectStatement; import io.shardingsphere.core.util.SQLUtil; import lombok.Getter; @@ -68,12 +71,15 @@ public final void parse(final SelectStatement selectStatement) { lexerEngine.skipIfEqual(OracleKeyword.SIBLINGS); lexerEngine.accept(DefaultKeyword.BY); do { - result.add(parseSelectOrderByItem(selectStatement)); + Optional orderItem = parseSelectOrderByItem(selectStatement); + if (orderItem.isPresent()) { + result.add(orderItem.get()); + } } while (lexerEngine.skipIfEqual(Symbol.COMMA)); selectStatement.getOrderByItems().addAll(result); } - private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) { + private Optional parseSelectOrderByItem(final SelectStatement selectStatement) { SQLExpression sqlExpression = basicExpressionParser.parse(selectStatement); OrderDirection orderDirection = OrderDirection.ASC; if (lexerEngine.skipIfEqual(DefaultKeyword.ASC)) { @@ -81,21 +87,28 @@ private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) } else if (lexerEngine.skipIfEqual(DefaultKeyword.DESC)) { orderDirection = OrderDirection.DESC; } + if (sqlExpression instanceof SQLTextExpression) { + return Optional.of(new OrderItem(SQLUtil.getExactlyValue(((SQLTextExpression) sqlExpression).getText()), orderDirection, getNullOrderDirection())); + } if (sqlExpression instanceof SQLNumberExpression) { - return new OrderItem(((SQLNumberExpression) sqlExpression).getNumber().intValue(), orderDirection, getNullOrderDirection()); + return Optional.of(new OrderItem(((SQLNumberExpression) sqlExpression).getNumber().intValue(), orderDirection, getNullOrderDirection())); } if (sqlExpression instanceof SQLIdentifierExpression) { - return new OrderItem(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()), - orderDirection, getNullOrderDirection(), selectStatement.getAlias(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()))); + return Optional.of(new OrderItem(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName()), + orderDirection, getNullOrderDirection(), selectStatement.getAlias(SQLUtil.getExactlyValue(((SQLIdentifierExpression) sqlExpression).getName())))); } if (sqlExpression instanceof SQLPropertyExpression) { SQLPropertyExpression sqlPropertyExpression = (SQLPropertyExpression) sqlExpression; - return new OrderItem(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()), SQLUtil.getExactlyValue(sqlPropertyExpression.getName()), orderDirection, getNullOrderDirection(), - selectStatement.getAlias(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()) + "." + SQLUtil.getExactlyValue(sqlPropertyExpression.getName()))); + return Optional.of( + new OrderItem(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()), SQLUtil.getExactlyValue(sqlPropertyExpression.getName()), orderDirection, getNullOrderDirection(), + selectStatement.getAlias(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()) + "." + SQLUtil.getExactlyValue(sqlPropertyExpression.getName())))); } if (sqlExpression instanceof SQLIgnoreExpression) { SQLIgnoreExpression sqlIgnoreExpression = (SQLIgnoreExpression) sqlExpression; - return new OrderItem(sqlIgnoreExpression.getExpression(), orderDirection, getNullOrderDirection(), selectStatement.getAlias(sqlIgnoreExpression.getExpression())); + return Optional.of(new OrderItem(sqlIgnoreExpression.getExpression(), orderDirection, getNullOrderDirection(), selectStatement.getAlias(sqlIgnoreExpression.getExpression()))); + } + if (sqlExpression instanceof SQLPlaceholderExpression) { + return Optional.absent(); } throw new SQLParsingException(lexerEngine); } diff --git a/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/context/OrderItem.java b/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/context/OrderItem.java index f975bdfd137d9..6ea581743588c 100644 --- a/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/context/OrderItem.java +++ b/sharding-core/src/main/java/io/shardingsphere/core/parsing/parser/context/OrderItem.java @@ -71,6 +71,14 @@ public OrderItem(final int index, final OrderDirection orderDirection, final Ord alias = Optional.absent(); } + public OrderItem(final String name, final OrderDirection orderDirection, final OrderDirection nullOrderDirection) { + owner = Optional.absent(); + this.name = Optional.of(name); + this.orderDirection = orderDirection; + this.nullOrderDirection = nullOrderDirection; + alias = Optional.absent(); + } + /** * Get column label. * diff --git a/sharding-core/src/test/resources/parser/select_order_by.xml b/sharding-core/src/test/resources/parser/select_order_by.xml index 174a90395dd2c..bfab4d337e386 100644 --- a/sharding-core/src/test/resources/parser/select_order_by.xml +++ b/sharding-core/src/test/resources/parser/select_order_by.xml @@ -91,7 +91,7 @@ - + @@ -103,7 +103,7 @@ - +
@@ -115,7 +115,7 @@ - +
@@ -127,7 +127,20 @@ - + + + + + + + + + + + + + +
@@ -141,7 +154,7 @@ - +
@@ -153,7 +166,7 @@ - +
diff --git a/sharding-jdbc/src/test/resources/integrate/cases/dql/dql-integrate-test-cases.xml b/sharding-jdbc/src/test/resources/integrate/cases/dql/dql-integrate-test-cases.xml index 495f142a538fc..5e547f170f16f 100644 --- a/sharding-jdbc/src/test/resources/integrate/cases/dql/dql-integrate-test-cases.xml +++ b/sharding-jdbc/src/test/resources/integrate/cases/dql/dql-integrate-test-cases.xml @@ -243,27 +243,32 @@ - + - + - + - + - + - + + + + + + diff --git a/sharding-sql-test/src/main/resources/sql/dql/select_order_by.xml b/sharding-sql-test/src/main/resources/sql/dql/select_order_by.xml index e1f6320ffadb6..33070a4bfdf9e 100644 --- a/sharding-sql-test/src/main/resources/sql/dql/select_order_by.xml +++ b/sharding-sql-test/src/main/resources/sql/dql/select_order_by.xml @@ -9,6 +9,9 @@ + + +