Skip to content

Commit 60d396a

Browse files
committed
fixed #320
1 parent be88226 commit 60d396a

File tree

10 files changed

+27
-4
lines changed

10 files changed

+27
-4
lines changed

RELEASE-NOTES.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
1. [ISSUE #308](https://github.com/dangdangdotcom/sharding-jdbc/issues/308) 数据库原生的自增GeneratedKey的返回无效
1010
1. [ISSUE #309](https://github.com/dangdangdotcom/sharding-jdbc/issues/310) 子查询中的orderby和groupby不列入解析上下文
1111
1. [ISSUE #313](https://github.com/dangdangdotcom/sharding-jdbc/issues/313) 支持<>操作符
12+
1. [ISSUE #320](https://github.com/dangdangdotcom/sharding-jdbc/issues/320) GROUP BY + LIMIT的SQL改写错误
1213

1314
## 1.5.0
1415

sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ protected void parseGroupBy() {
186186
if (getSqlParser().skipIfEqual(DefaultKeyword.HAVING)) {
187187
throw new UnsupportedOperationException("Cannot support Having");
188188
}
189-
getSelectStatement().setGroupByLastPosition(getSqlParser().getLexer().getCurrentToken().getEndPosition());
189+
getSelectStatement().setGroupByLastPosition(getSqlParser().getLexer().getCurrentToken().getEndPosition() - getSqlParser().getLexer().getCurrentToken().getLiterals().length());
190190
}
191191
}
192192

sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ protected void parseGroupBy() {
252252
if (sqlParser.skipIfEqual(DefaultKeyword.HAVING)) {
253253
throw new UnsupportedOperationException("Cannot support Having");
254254
}
255-
selectStatement.setGroupByLastPosition(sqlParser.getLexer().getCurrentToken().getEndPosition());
255+
selectStatement.setGroupByLastPosition(sqlParser.getLexer().getCurrentToken().getEndPosition() - getSqlParser().getLexer().getCurrentToken().getLiterals().length());
256256
} else if (sqlParser.skipIfEqual(DefaultKeyword.HAVING)) {
257257
throw new UnsupportedOperationException("Cannot support Having");
258258
}

sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public SQLBuilder rewrite(final boolean isRewriteLimit) {
9090
} else if (each instanceof OffsetToken) {
9191
appendLimitOffsetToken(result, (OffsetToken) each, count, sqlTokens, isRewriteLimit);
9292
} else if (each instanceof OrderByToken) {
93-
appendOrderByToken(result);
93+
appendOrderByToken(result, count, sqlTokens);
9494
}
9595
count++;
9696
}
@@ -147,7 +147,7 @@ private void appendLimitOffsetToken(final SQLBuilder sqlBuilder, final OffsetTok
147147
sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
148148
}
149149

150-
private void appendOrderByToken(final SQLBuilder sqlBuilder) {
150+
private void appendOrderByToken(final SQLBuilder sqlBuilder, final int count, final List<SQLToken> sqlTokens) {
151151
SelectStatement selectStatement = (SelectStatement) sqlStatement;
152152
StringBuilder orderByLiterals = new StringBuilder(" ORDER BY ");
153153
int i = 0;
@@ -161,6 +161,9 @@ private void appendOrderByToken(final SQLBuilder sqlBuilder) {
161161
}
162162
orderByLiterals.append(" ");
163163
sqlBuilder.appendLiterals(orderByLiterals.toString());
164+
int beginPosition = ((SelectStatement) sqlStatement).getGroupByLastPosition();
165+
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
166+
sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
164167
}
165168

166169
/**

sharding-jdbc-core/src/test/resources/integrate/assert/select_group_by.xml

+6
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,10 @@
4242
<data parameter="1,9,1000,1909"/>
4343
</sharding-rule>
4444
</sql>
45+
<sql id="assertSelectWithGroupByAndLimit">
46+
<sharding-rule>
47+
<data parameter="1" expected="select_group_by/SelectLimit.xml" />
48+
<data parameter="0" />
49+
</sharding-rule>
50+
</sql>
4551
</sqls>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<dataset>
2+
<t_order user_id="10" />
3+
</dataset>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<dataset>
2+
<t_order user_id="10" />
3+
</dataset>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<dataset>
2+
<t_order user_id="10" />
3+
</dataset>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<dataset>
2+
<t_order user_id="10" />
3+
</dataset>

sharding-jdbc-core/src/test/resources/sql/select_group_by.xml

+1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
<sql id="assertSelectOrderByDescWithGroupBy" value="SELECT SUM(order_id) AS orders_sum, user_id FROM t_order GROUP BY user_id ORDER BY orders_sum DESC" />
99
<sql id="assertSelectCountWithoutGroupedColumn" value="SELECT count(*) as items_count FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s GROUP BY o.user_id" />
1010
<sql id="assertSelectCountWithGroupByBindingTable" value="SELECT count(*) as items_count, o.user_id FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s GROUP BY o.user_id" />
11+
<sql id="assertSelectWithGroupByAndLimit" value="SELECT user_id FROM t_order GROUP BY user_id LIMIT %s" type="H2,MySQL,PostgreSQL" />
1112
</sqls>

0 commit comments

Comments
 (0)