提交 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 @@
### 缺陷修正
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
......
......@@ -140,18 +140,22 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
selectStatement.getItems().add(parseRowNumberSelectItem());
return;
}
String literals = sqlParser.getLexer().getCurrentToken().getLiterals();
if (Symbol.STAR.getLiterals().equals(SQLUtil.getExactlyValue(literals))) {
if (isStarSelectItem()) {
selectStatement.getItems().add(parseStarSelectItem());
return;
}
if (isAggregationSelectItem()) {
selectStatement.getItems().add(parseAggregationSelectItem(literals));
selectStatement.getItems().add(parseAggregationSelectItem());
return;
}
StringBuilder expression = new StringBuilder();
Token lastToken = null;
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();
int position = sqlParser.getLexer().getCurrentToken().getEndPosition() - value.length();
expression.append(value);
......@@ -180,6 +184,10 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
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() {
if (!containSubquery) {
containStarForOutQuery = true;
......@@ -190,11 +198,13 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
}
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) {
return new AggregationSelectItem(AggregationType.valueOf(literals.toUpperCase()), sqlParser.skipParentheses(), sqlParser.parseAlias());
private SelectItem parseAggregationSelectItem() {
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) {
......@@ -308,6 +318,9 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
} else if (sqlExpression instanceof SQLIdentifierExpression) {
SQLIdentifierExpression sqlIdentifierExpression = (SQLIdentifierExpression) sqlExpression;
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 {
return;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册