From ad661ecd93c1586b745175d5f14f0d46c9a8bb1a Mon Sep 17 00:00:00 2001 From: tuohai666 Date: Tue, 14 Aug 2018 18:53:40 +0800 Subject: [PATCH 1/5] #373, support "order by ?" --- .../core/parsing/parser/clause/OrderByClauseParser.java | 4 ++++ .../core/parsing/parser/context/OrderItem.java | 8 ++++++++ 2 files changed, 12 insertions(+) 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..eee42092d1aec 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 @@ -31,6 +31,7 @@ import io.shardingsphere.core.parsing.parser.expression.SQLIgnoreExpression; import io.shardingsphere.core.parsing.parser.expression.SQLNumberExpression; 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; @@ -81,6 +82,9 @@ private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) } else if (lexerEngine.skipIfEqual(DefaultKeyword.DESC)) { orderDirection = OrderDirection.DESC; } + if (sqlExpression instanceof SQLTextExpression) { + return new OrderItem(SQLUtil.getExactlyValue(((SQLTextExpression) sqlExpression).getText()), orderDirection, getNullOrderDirection()); + } if (sqlExpression instanceof SQLNumberExpression) { return new OrderItem(((SQLNumberExpression) sqlExpression).getNumber().intValue(), orderDirection, getNullOrderDirection()); } 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. * From f7be7a558d2b16949047215f8e130f09a603c5fc Mon Sep 17 00:00:00 2001 From: tuohai666 Date: Tue, 14 Aug 2018 21:57:50 +0800 Subject: [PATCH 2/5] #373, support "order by ?" --- .../core/parsing/parser/clause/OrderByClauseParser.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 eee42092d1aec..b8196ccf4ca75 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 @@ -30,6 +30,7 @@ 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; @@ -69,7 +70,10 @@ public final void parse(final SelectStatement selectStatement) { lexerEngine.skipIfEqual(OracleKeyword.SIBLINGS); lexerEngine.accept(DefaultKeyword.BY); do { - result.add(parseSelectOrderByItem(selectStatement)); + OrderItem orderItem = parseSelectOrderByItem(selectStatement); + if (null != orderItem) { + result.add(orderItem); + } } while (lexerEngine.skipIfEqual(Symbol.COMMA)); selectStatement.getOrderByItems().addAll(result); } @@ -101,6 +105,9 @@ private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) SQLIgnoreExpression sqlIgnoreExpression = (SQLIgnoreExpression) sqlExpression; return new OrderItem(sqlIgnoreExpression.getExpression(), orderDirection, getNullOrderDirection(), selectStatement.getAlias(sqlIgnoreExpression.getExpression())); } + if (sqlExpression instanceof SQLPlaceholderExpression) { + return null; + } throw new SQLParsingException(lexerEngine); } From 2771907a42cb6b6e820571e95dc188880f04413a Mon Sep 17 00:00:00 2001 From: tuohai666 Date: Wed, 15 Aug 2018 11:47:26 +0800 Subject: [PATCH 3/5] #373, support "order by ?" --- .../parser/clause/OrderByClauseParser.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) 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 b8196ccf4ca75..39e1528729d3e 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; @@ -70,15 +71,15 @@ public final void parse(final SelectStatement selectStatement) { lexerEngine.skipIfEqual(OracleKeyword.SIBLINGS); lexerEngine.accept(DefaultKeyword.BY); do { - OrderItem orderItem = parseSelectOrderByItem(selectStatement); - if (null != orderItem) { - result.add(orderItem); + 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)) { @@ -87,26 +88,26 @@ private OrderItem parseSelectOrderByItem(final SelectStatement selectStatement) orderDirection = OrderDirection.DESC; } if (sqlExpression instanceof SQLTextExpression) { - return new OrderItem(SQLUtil.getExactlyValue(((SQLTextExpression) sqlExpression).getText()), orderDirection, getNullOrderDirection()); + 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 null; + return Optional.absent(); } throw new SQLParsingException(lexerEngine); } From a13bc32014c255f6f862652400614aaa51b4b7c1 Mon Sep 17 00:00:00 2001 From: tuohai666 Date: Wed, 15 Aug 2018 11:51:10 +0800 Subject: [PATCH 4/5] #373, for checkstyle --- .../core/parsing/parser/clause/OrderByClauseParser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 39e1528729d3e..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 @@ -99,7 +99,8 @@ private Optional parseSelectOrderByItem(final SelectStatement selectS } if (sqlExpression instanceof SQLPropertyExpression) { SQLPropertyExpression sqlPropertyExpression = (SQLPropertyExpression) sqlExpression; - return Optional.of(new OrderItem(SQLUtil.getExactlyValue(sqlPropertyExpression.getOwner().getName()), SQLUtil.getExactlyValue(sqlPropertyExpression.getName()), orderDirection, getNullOrderDirection(), + 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) { From 45bb0046ec3257b614f594927a84402c9f4bc6ba Mon Sep 17 00:00:00 2001 From: tuohai666 Date: Wed, 15 Aug 2018 16:21:23 +0800 Subject: [PATCH 5/5] #373, add test cases --- .../test/resources/parser/select_order_by.xml | 25 ++++++++++++++----- .../cases/dql/dql-integrate-test-cases.xml | 17 ++++++++----- .../resources/sql/dql/select_order_by.xml | 3 +++ 3 files changed, 33 insertions(+), 12 deletions(-) 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 @@ + + +