提交 7a40f16a 编写于 作者: H haocao

Merge branch '1.5.2-SNAPSHOT' of...

Merge branch '1.5.2-SNAPSHOT' of https://github.com/dangdangdotcom/sharding-jdbc into 1.5.2-SNAPSHOT
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
### 缺陷修正 ### 缺陷修正
1. [ISSUE #334](https://github.com/dangdangdotcom/sharding-jdbc/issues/334) 解析有函数的ORDER BY会将后面的ASC, DESC解析到OrderItem的name属性中 1. [ISSUE #334](https://github.com/dangdangdotcom/sharding-jdbc/issues/334) 解析有函数的ORDER BY会将后面的ASC, DESC解析到OrderItem的name属性中
1. [ISSUE #335](https://github.com/dangdangdotcom/sharding-jdbc/issues/335) 支持GROUP BY + 自定义函数的SQL
## 1.5.1 ## 1.5.1
......
...@@ -140,18 +140,22 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -140,18 +140,22 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
selectStatement.getItems().add(parseRowNumberSelectItem()); selectStatement.getItems().add(parseRowNumberSelectItem());
return; return;
} }
String literals = sqlParser.getLexer().getCurrentToken().getLiterals(); if (isStarSelectItem()) {
if (Symbol.STAR.getLiterals().equals(SQLUtil.getExactlyValue(literals))) {
selectStatement.getItems().add(parseStarSelectItem()); selectStatement.getItems().add(parseStarSelectItem());
return; return;
} }
if (isAggregationSelectItem()) { if (isAggregationSelectItem()) {
selectStatement.getItems().add(parseAggregationSelectItem(literals)); selectStatement.getItems().add(parseAggregationSelectItem());
return; return;
} }
StringBuilder expression = new StringBuilder(); StringBuilder expression = new StringBuilder();
Token lastToken = null; Token lastToken = null;
while (!sqlParser.equalAny(DefaultKeyword.AS) && !sqlParser.equalAny(Symbol.COMMA) && !sqlParser.equalAny(DefaultKeyword.FROM) && !sqlParser.equalAny(Assist.END)) { while (!sqlParser.equalAny(DefaultKeyword.AS) && !sqlParser.equalAny(Symbol.COMMA) && !sqlParser.equalAny(DefaultKeyword.FROM) && !sqlParser.equalAny(Assist.END)) {
if (sqlParser.equalAny(Symbol.LEFT_PAREN)) {
expression.append(sqlParser.skipParentheses());
lastToken = sqlParser.getLexer().getCurrentToken();
continue;
}
String value = sqlParser.getLexer().getCurrentToken().getLiterals(); String value = sqlParser.getLexer().getCurrentToken().getLiterals();
int position = sqlParser.getLexer().getCurrentToken().getEndPosition() - value.length(); int position = sqlParser.getLexer().getCurrentToken().getEndPosition() - value.length();
expression.append(value); expression.append(value);
...@@ -180,6 +184,10 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -180,6 +184,10 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
throw new UnsupportedOperationException("Cannot support special select item."); throw new UnsupportedOperationException("Cannot support special select item.");
} }
private boolean isStarSelectItem() {
return Symbol.STAR.getLiterals().equals(SQLUtil.getExactlyValue(sqlParser.getLexer().getCurrentToken().getLiterals()));
}
private SelectItem parseStarSelectItem() { private SelectItem parseStarSelectItem() {
if (!containSubquery) { if (!containSubquery) {
containStarForOutQuery = true; containStarForOutQuery = true;
...@@ -190,11 +198,13 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -190,11 +198,13 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
} }
private boolean isAggregationSelectItem() { private boolean isAggregationSelectItem() {
return sqlParser.skipIfEqual(DefaultKeyword.MAX, DefaultKeyword.MIN, DefaultKeyword.SUM, DefaultKeyword.AVG, DefaultKeyword.COUNT); return sqlParser.equalAny(DefaultKeyword.MAX, DefaultKeyword.MIN, DefaultKeyword.SUM, DefaultKeyword.AVG, DefaultKeyword.COUNT);
} }
private SelectItem parseAggregationSelectItem(final String literals) { private SelectItem parseAggregationSelectItem() {
return new AggregationSelectItem(AggregationType.valueOf(literals.toUpperCase()), sqlParser.skipParentheses(), sqlParser.parseAlias()); AggregationType aggregationType = AggregationType.valueOf(sqlParser.getLexer().getCurrentToken().getLiterals().toUpperCase());
sqlParser.getLexer().nextToken();
return new AggregationSelectItem(aggregationType, sqlParser.skipParentheses(), sqlParser.parseAlias());
} }
private boolean hasAlias(final StringBuilder expression, final Token lastToken) { private boolean hasAlias(final StringBuilder expression, final Token lastToken) {
...@@ -308,6 +318,9 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -308,6 +318,9 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
} else if (sqlExpression instanceof SQLIdentifierExpression) { } else if (sqlExpression instanceof SQLIdentifierExpression) {
SQLIdentifierExpression sqlIdentifierExpression = (SQLIdentifierExpression) sqlExpression; SQLIdentifierExpression sqlIdentifierExpression = (SQLIdentifierExpression) sqlExpression;
orderItem = new OrderItem(SQLUtil.getExactlyValue(sqlIdentifierExpression.getName()), orderByType, getAlias(SQLUtil.getExactlyValue(sqlIdentifierExpression.getName()))); orderItem = new OrderItem(SQLUtil.getExactlyValue(sqlIdentifierExpression.getName()), orderByType, getAlias(SQLUtil.getExactlyValue(sqlIdentifierExpression.getName())));
} else if (sqlExpression instanceof SQLIgnoreExpression) {
SQLIgnoreExpression sqlIgnoreExpression = (SQLIgnoreExpression) sqlExpression;
orderItem = new OrderItem(sqlIgnoreExpression.getExpression(), orderByType, getAlias(sqlIgnoreExpression.getExpression()));
} else { } else {
return; return;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册