提交 8c112eda 编写于 作者: T terrymanu

fix #419

上级 49f55999
......@@ -7,6 +7,7 @@
### 缺陷修正
1. [ISSUE #404](https://github.com/shardingjdbc/sharding-jdbc/issues/404) sharding-jdbc-spring-boot-starter不支持HikariDataSource
1. [ISSUE #419](https://github.com/shardingjdbc/sharding-jdbc/issues/419) SQL改写时, 未判断别名是否为关键字未加转义符导致了SQL异常
## 2.0.0.M1
......
......@@ -94,5 +94,6 @@ public enum MySQLKeyword implements Keyword {
ROLLUP,
RESTRICT,
STRAIGHT_JOIN,
REGEXP
REGEXP,
KEY
}
......@@ -18,6 +18,7 @@
package io.shardingjdbc.core.rewrite;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.rule.BindingTableRule;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
......@@ -34,6 +35,7 @@ import io.shardingjdbc.core.parsing.parser.token.TableToken;
import io.shardingjdbc.core.routing.type.TableUnit;
import io.shardingjdbc.core.routing.type.complex.CartesianTableReference;
import com.google.common.base.Optional;
import io.shardingjdbc.core.util.SQLUtil;
import java.util.Collections;
import java.util.Comparator;
......@@ -55,6 +57,8 @@ public final class SQLRewriteEngine {
private final String originalSQL;
private final DatabaseType databaseType;
private final List<SQLToken> sqlTokens = new LinkedList<>();
private final SQLStatement sqlStatement;
......@@ -64,11 +68,13 @@ public final class SQLRewriteEngine {
*
* @param shardingRule databases and tables sharding rule
* @param originalSQL original SQL
* @param databaseType database type
* @param sqlStatement SQL statement
*/
public SQLRewriteEngine(final ShardingRule shardingRule, final String originalSQL, final SQLStatement sqlStatement) {
public SQLRewriteEngine(final ShardingRule shardingRule, final String originalSQL, final DatabaseType databaseType, final SQLStatement sqlStatement) {
this.shardingRule = shardingRule;
this.originalSQL = originalSQL;
this.databaseType = databaseType;
this.sqlStatement = sqlStatement;
sqlTokens.addAll(sqlStatement.getSqlTokens());
}
......@@ -118,7 +124,8 @@ public final class SQLRewriteEngine {
}
private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> sqlTokens) {
String tableName = sqlStatement.getTables().getTableNames().contains(tableToken.getTableName()) ? tableToken.getTableName() : tableToken.getOriginalLiterals();
String tableName =
SQLUtil.getOriginalValue(sqlStatement.getTables().getTableNames().contains(tableToken.getTableName()) ? tableToken.getTableName() : tableToken.getOriginalLiterals(), databaseType);
sqlBuilder.appendTable(tableName);
int beginPosition = tableToken.getBeginPosition() + tableToken.getOriginalLiterals().length();
appendRest(sqlBuilder, count, sqlTokens, beginPosition);
......@@ -127,7 +134,7 @@ public final class SQLRewriteEngine {
private void appendItemsToken(final SQLBuilder sqlBuilder, final ItemsToken itemsToken, final int count, final List<SQLToken> sqlTokens) {
for (String item : itemsToken.getItems()) {
sqlBuilder.appendLiterals(", ");
sqlBuilder.appendLiterals(item);
sqlBuilder.appendLiterals(SQLUtil.getOriginalValue(item, databaseType));
}
int beginPosition = itemsToken.getBeginPosition();
appendRest(sqlBuilder, count, sqlTokens, beginPosition);
......@@ -159,10 +166,11 @@ public final class SQLRewriteEngine {
orderByLiterals.append(" ").append(DefaultKeyword.ORDER).append(" ").append(DefaultKeyword.BY).append(" ");
int i = 0;
for (OrderItem each : selectStatement.getOrderByItems()) {
String columnLabel = SQLUtil.getOriginalValue(each.getColumnLabel(), databaseType);
if (0 == i) {
orderByLiterals.append(each.getColumnLabel()).append(" ").append(each.getType().name());
orderByLiterals.append(columnLabel).append(" ").append(each.getType().name());
} else {
orderByLiterals.append(",").append(each.getColumnLabel()).append(" ").append(each.getType().name());
orderByLiterals.append(",").append(columnLabel).append(" ").append(each.getType().name());
}
i++;
}
......
......@@ -83,7 +83,7 @@ public final class ParsingSQLRouter implements SQLRouter {
processGeneratedKey(parameters, (InsertStatement) sqlStatement, result);
}
RoutingResult routingResult = route(parameters, sqlStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, logicSQL, sqlStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, logicSQL, databaseType, sqlStatement);
boolean isSingleRouting = routingResult.isSingleRouting();
if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getLimit()) {
processLimit(parameters, (SelectStatement) sqlStatement, isSingleRouting);
......
......@@ -18,6 +18,9 @@
package io.shardingjdbc.core.util;
import com.google.common.base.CharMatcher;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.parsing.lexer.dialect.mysql.MySQLKeyword;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
......@@ -40,4 +43,24 @@ public class SQLUtil {
public static String getExactlyValue(final String value) {
return null == value ? null : CharMatcher.anyOf("[]`'\"").removeFrom(value);
}
/**
* Get original value for SQL expression.
*
* @param value SQL expression
* @param databaseType database type
* @return original SQL expression
*/
public static String getOriginalValue(final String value, final DatabaseType databaseType) {
if (DatabaseType.MySQL == databaseType) {
try {
DefaultKeyword.valueOf(value.toUpperCase());
MySQLKeyword.valueOf(value.toUpperCase());
return String.format("`%s`", value);
} catch (final IllegalArgumentException ex) {
return value;
}
}
return value;
}
}
......@@ -18,6 +18,7 @@
package io.shardingjdbc.core.rewrite;
import io.shardingjdbc.core.api.fixture.ShardingRuleMockBuilder;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.constant.OrderType;
import io.shardingjdbc.core.parsing.parser.context.OrderItem;
......@@ -63,7 +64,7 @@ public final class SQLRewriteEngineTest {
@Test
public void assertRewriteWithoutChange() {
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_y.id FROM table_y WHERE table_y.id=?", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_y.id FROM table_y WHERE table_y.id=?", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT table_y.id FROM table_y WHERE table_y.id=?"));
}
......@@ -72,7 +73,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(7, "table_x"));
selectStatement.getSqlTokens().add(new TableToken(31, "table_x"));
selectStatement.getSqlTokens().add(new TableToken(47, "table_x"));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT table_1.id, x.name FROM table_1 x WHERE table_1.id=? AND x.name=?"));
}
......@@ -82,7 +83,7 @@ public final class SQLRewriteEngineTest {
ItemsToken itemsToken = new ItemsToken(12);
itemsToken.getItems().addAll(Arrays.asList("x.id as ORDER_BY_DERIVED_0", "x.name as GROUP_BY_DERIVED_0"));
selectStatement.getSqlTokens().add(itemsToken);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.age FROM table_x x GROUP BY x.id ORDER BY x.name", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.age FROM table_x x GROUP BY x.id ORDER BY x.name", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT x.age, x.id as ORDER_BY_DERIVED_0, x.name as GROUP_BY_DERIVED_0 FROM table_1 x GROUP BY x.id ORDER BY x.name"));
}
......@@ -92,7 +93,7 @@ public final class SQLRewriteEngineTest {
ItemsToken itemsToken = new ItemsToken(17);
itemsToken.getItems().addAll(Arrays.asList("COUNT(x.age) as AVG_DERIVED_COUNT_0", "SUM(x.age) as AVG_DERIVED_SUM_0"));
selectStatement.getSqlTokens().add(itemsToken);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT AVG(x.age) FROM table_x x", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT AVG(x.age) FROM table_x x", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT AVG(x.age), COUNT(x.age) as AVG_DERIVED_COUNT_0, SUM(x.age) as AVG_DERIVED_SUM_0 FROM table_1 x"));
}
......@@ -104,7 +105,7 @@ public final class SQLRewriteEngineTest {
ItemsToken itemsToken2 = new ItemsToken(44);
itemsToken2.getItems().add("?");
selectStatement.getSqlTokens().addAll(Arrays.asList(itemsToken1, itemsToken2));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "INSERT INTO table_x (name, age) VALUES (?, ?)", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "INSERT INTO table_x (name, age) VALUES (?, ?)", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("INSERT INTO table_1 (name, age, id) VALUES (?, ?, ?)"));
}
......@@ -116,7 +117,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(17, "table_x"));
selectStatement.getSqlTokens().add(new OffsetToken(33, 2));
selectStatement.getSqlTokens().add(new RowCountToken(36, 2));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT x.id FROM table_1 x LIMIT 0, 4"));
}
......@@ -129,7 +130,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new OffsetToken(119, 2));
selectStatement.getSqlTokens().add(new RowCountToken(98, 4));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", selectStatement);
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>0"));
}
......@@ -142,7 +143,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new OffsetToken(123, 2));
selectStatement.getSqlTokens().add(new RowCountToken(26, 4));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", selectStatement);
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>0"));
}
......@@ -156,7 +157,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(17, "table_x"));
selectStatement.getSqlTokens().add(new OffsetToken(33, 2));
selectStatement.getSqlTokens().add(new RowCountToken(36, 2));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT x.id FROM table_1 x LIMIT 0, 2147483647"));
}
......@@ -171,7 +172,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getOrderByItems().add(new OrderItem("x", "id", OrderType.ASC, OrderType.ASC, Optional.<String>absent()));
selectStatement.getGroupByItems().add(new OrderItem("x", "id", OrderType.DESC, OrderType.ASC, Optional.<String>absent()));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", selectStatement);
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens),
is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=2147483647) t WHERE t.rownum_>0"));
}
......@@ -187,7 +188,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getOrderByItems().add(new OrderItem("x", "id", OrderType.ASC, OrderType.ASC, Optional.<String>absent()));
selectStatement.getGroupByItems().add(new OrderItem("x", "id", OrderType.DESC, OrderType.ASC, Optional.<String>absent()));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", selectStatement);
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens),
is("SELECT * FROM (SELECT TOP(2147483647) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>0"));
}
......@@ -200,7 +201,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(17, "table_x"));
selectStatement.getSqlTokens().add(new OffsetToken(33, 2));
selectStatement.getSqlTokens().add(new RowCountToken(36, 2));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(false).toSQL(tableTokens), is("SELECT x.id FROM table_1 x LIMIT 2, 2"));
}
......@@ -213,7 +214,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new OffsetToken(119, 2));
selectStatement.getSqlTokens().add(new RowCountToken(98, 4));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", selectStatement);
"SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(false).toSQL(tableTokens), is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>2"));
}
......@@ -226,7 +227,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new OffsetToken(123, 2));
selectStatement.getSqlTokens().add(new RowCountToken(26, 4));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule,
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", selectStatement);
"SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(false).toSQL(tableTokens),
is("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>2"));
}
......@@ -238,7 +239,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getOrderByItems().add(new OrderItem("x", "name", OrderType.DESC, OrderType.ASC, Optional.<String>absent()));
selectStatement.getSqlTokens().add(new TableToken(25, "table_x"));
selectStatement.getSqlTokens().add(new OrderByToken(61));
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id, x.name FROM table_x x GROUP BY x.id, x.name DESC", selectStatement);
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id, x.name FROM table_x x GROUP BY x.id, x.name DESC", DatabaseType.MySQL, selectStatement);
assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT x.id, x.name FROM table_1 x GROUP BY x.id, x.name DESC ORDER BY id ASC,name DESC "));
}
......@@ -249,7 +250,8 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(58, "table_x"));
selectStatement.getTables().add(new Table("table_x", Optional.of("x")));
selectStatement.getTables().add(new Table("table_y", Optional.of("y")));
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?", selectStatement);
SQLRewriteEngine sqlRewriteEngine =
new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?", DatabaseType.MySQL, selectStatement);
SQLBuilder sqlBuilder = sqlRewriteEngine.rewrite(true);
assertThat(sqlRewriteEngine.generateSQL(new TableUnit("db0", "table_x", "table_x"), sqlBuilder), is("SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?"));
}
......@@ -259,7 +261,7 @@ public final class SQLRewriteEngineTest {
selectStatement.getSqlTokens().add(new TableToken(7, "table_x"));
selectStatement.getSqlTokens().add(new TableToken(31, "table_x"));
selectStatement.getSqlTokens().add(new TableToken(47, "table_x"));
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", selectStatement);
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", DatabaseType.MySQL, selectStatement);
SQLBuilder sqlBuilder = sqlRewriteEngine.rewrite(true);
CartesianTableReference cartesianTableReference = new CartesianTableReference(Collections.singletonList(new TableUnit("db0", "table_x", "table_x")));
assertThat(sqlRewriteEngine.generateSQL(cartesianTableReference, sqlBuilder), is("SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?"));
......
......@@ -53,4 +53,9 @@
<data parameter="0" />
</sharding-rule>
</sql>
<sql id="assertSelectGroupByWithAliasIsKeyword">
<sharding-rule>
<data expected="select_group_by/SelectGroupByWithAliasIsKeyword.xml" />
</sharding-rule>
</sql>
</sqls>
<dataset>
<t_order orders_sum="2001" key="10" />
<t_order orders_sum="2201" key="11" />
<t_order orders_sum="2401" key="12" />
<t_order orders_sum="2601" key="13" />
<t_order orders_sum="2801" key="14" />
<t_order orders_sum="3001" key="15" />
<t_order orders_sum="3201" key="16" />
<t_order orders_sum="3401" key="17" />
<t_order orders_sum="3601" key="18" />
<t_order orders_sum="3801" key="19" />
<t_order orders_sum="4001" key="20" />
<t_order orders_sum="4201" key="21" />
<t_order orders_sum="4401" key="22" />
<t_order orders_sum="4601" key="23" />
<t_order orders_sum="4801" key="24" />
<t_order orders_sum="5001" key="25" />
<t_order orders_sum="5201" key="26" />
<t_order orders_sum="5401" key="27" />
<t_order orders_sum="5601" key="28" />
<t_order orders_sum="5801" key="29" />
</dataset>
<dataset>
<t_order orders_sum="2001" key="10" />
<t_order orders_sum="2201" key="11" />
<t_order orders_sum="2401" key="12" />
<t_order orders_sum="2601" key="13" />
<t_order orders_sum="2801" key="14" />
<t_order orders_sum="3001" key="15" />
<t_order orders_sum="3201" key="16" />
<t_order orders_sum="3401" key="17" />
<t_order orders_sum="3601" key="18" />
<t_order orders_sum="3801" key="19" />
<t_order orders_sum="4001" key="20" />
<t_order orders_sum="4201" key="21" />
<t_order orders_sum="4401" key="22" />
<t_order orders_sum="4601" key="23" />
<t_order orders_sum="4801" key="24" />
<t_order orders_sum="5001" key="25" />
<t_order orders_sum="5201" key="26" />
<t_order orders_sum="5401" key="27" />
<t_order orders_sum="5601" key="28" />
<t_order orders_sum="5801" key="29" />
</dataset>
<dataset>
<t_order orders_sum="10045" key="10" />
<t_order orders_sum="11045" key="11" />
<t_order orders_sum="12045" key="12" />
<t_order orders_sum="13045" key="13" />
<t_order orders_sum="14045" key="14" />
<t_order orders_sum="15045" key="15" />
<t_order orders_sum="16045" key="16" />
<t_order orders_sum="17045" key="17" />
<t_order orders_sum="18045" key="18" />
<t_order orders_sum="19045" key="19" />
</dataset>
<dataset>
<t_order orders_sum="10045" key="10" />
<t_order orders_sum="11045" key="11" />
<t_order orders_sum="12045" key="12" />
<t_order orders_sum="13045" key="13" />
<t_order orders_sum="14045" key="14" />
<t_order orders_sum="15045" key="15" />
<t_order orders_sum="16045" key="16" />
<t_order orders_sum="17045" key="17" />
<t_order orders_sum="18045" key="18" />
<t_order orders_sum="19045" key="19" />
</dataset>
<dataset>
<t_order orders_sum="10045" key="10" />
<t_order orders_sum="11045" key="11" />
</dataset>
......@@ -241,4 +241,22 @@
</order-by-columns>
<limit row-count-index="0" row-count="5" />
</assert>
<assert id="assertSelectGroupByWithAliasIsKeyword">
<tables>
<table name="t_order" />
</tables>
<table-tokens>
<table-token begin-position="58" original-literals="t_order" />
</table-tokens>
<order-by-token begin-position-of-statement="80" begin-position-of-prepared-statement="80"/>
<aggregation-select-items>
<aggregation-select-item inner-expression="(order_id)" aggregation-type="SUM" alias="orders_sum" />
</aggregation-select-items>
<group-by-columns>
<group-by-column name="key" alias="key" order-by-type="ASC" />
</group-by-columns>
<order-by-columns>
<order-by-column name="key" alias="key" order-by-type="ASC" />
</order-by-columns>
</assert>
</asserts>
......@@ -11,4 +11,5 @@
<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" />
<sql id="assertSelectWithGroupByAndLimit" value="SELECT user_id FROM t_order GROUP BY user_id LIMIT %s" type="H2,MySQL,PostgreSQL" />
<sql id="assertSelectWithGroupByAndOrderByAndLimit" value="SELECT user_id, SUM(order_id) FROM t_order GROUP BY user_id ORDER BY SUM(order_id) LIMIT %s" type="H2,MySQL,PostgreSQL" />
<sql id="assertSelectGroupByWithAliasIsKeyword" value="SELECT SUM(order_id) AS orders_sum, user_id as `key` FROM t_order GROUP BY `key`" type="MySQL" />
</sqls>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册