This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 2d0133d move remaining sql node convert unit test to parameterized
unit test (#12991)
2d0133d is described below
commit 2d0133d304ad78edc2aa26280c44770bd1c8e845
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Oct 11 20:29:53 2021 +0800
move remaining sql node convert unit test to parameterized unit test
(#12991)
* move remaining sql node convert unit test to parameterized unit test
* refactor convert
---
.../impl/BinaryOperationExpressionConverter.java | 6 +
.../impl/ExpressionProjectionConverter.java | 7 +-
.../statement/SelectStatementConverter.java | 30 ++--
.../statement/SelectStatementConverterTest.java | 187 ---------------------
.../test/resources/converter/supported/select.xml | 20 ++-
5 files changed, 39 insertions(+), 211 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
index 41f72a2..7590bc4 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
@@ -41,11 +41,17 @@ public final class BinaryOperationExpressionConverter
implements SQLSegmentConve
static {
register(SqlStdOperatorTable.EQUALS);
+ register(SqlStdOperatorTable.NOT_EQUALS);
register(SqlStdOperatorTable.GREATER_THAN);
register(SqlStdOperatorTable.GREATER_THAN_OR_EQUAL);
register(SqlStdOperatorTable.LESS_THAN);
register(SqlStdOperatorTable.LESS_THAN_OR_EQUAL);
+ register(SqlStdOperatorTable.OR);
register(SqlStdOperatorTable.AND);
+ register(SqlStdOperatorTable.PLUS);
+ register(SqlStdOperatorTable.MINUS);
+ register(SqlStdOperatorTable.MULTIPLY);
+ register(SqlStdOperatorTable.DIVIDE);
}
private static void register(final SqlBinaryOperator sqlBinaryOperator) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
index 3c986ab..ddd768d 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/segment/projection/impl/ExpressionProjectionConverter.java
@@ -17,10 +17,9 @@
package
org.apache.shardingsphere.infra.optimize.converter.segment.projection.impl;
-import org.apache.calcite.sql.SqlCharStringLiteral;
import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.parser.SqlParserPos;
import
org.apache.shardingsphere.infra.optimize.converter.segment.SQLSegmentConverter;
+import
org.apache.shardingsphere.infra.optimize.converter.segment.expression.ExpressionConverter;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
import java.util.Optional;
@@ -32,8 +31,6 @@ public final class ExpressionProjectionConverter implements
SQLSegmentConverter<
@Override
public Optional<SqlNode> convert(final ExpressionProjectionSegment
segment) {
- // TODO expression has not been parsed now.
- String expression = segment.getText();
- return Optional.of(SqlCharStringLiteral.createCharString(expression,
SqlParserPos.ZERO));
+ return null == segment ? Optional.empty() : new
ExpressionConverter().convert(segment.getExpr());
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
index 51253d7..799974f 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverter.java
@@ -17,9 +17,9 @@
package org.apache.shardingsphere.infra.optimize.converter.statement;
-import com.google.common.base.Preconditions;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlOrderBy;
import org.apache.calcite.sql.SqlSelect;
import org.apache.calcite.sql.parser.SqlParserPos;
import
org.apache.shardingsphere.infra.optimize.converter.segment.from.TableConverter;
@@ -44,18 +44,22 @@ public final class SelectStatementConverter implements
SQLStatementConverter<Sel
@Override
public SqlNode convert(final SelectStatement selectStatement) {
- Optional<SqlNodeList> distinct = new
DistinctConverter().convert(selectStatement.getProjections());
- Optional<SqlNodeList> projections = new
ProjectionsConverter().convert(selectStatement.getProjections());
- Preconditions.checkState(projections.isPresent());
- Optional<SqlNode> from = new
TableConverter().convert(selectStatement.getFrom());
- Optional<SqlNode> where = new
WhereConverter().convert(selectStatement.getWhere().orElse(null));
- Optional<SqlNodeList> groupBy = new
GroupByConverter().convert(selectStatement.getGroupBy().orElse(null));
- Optional<SqlNode> having = new
HavingConverter().convert(selectStatement.getHaving().orElse(null));
- Optional<SqlNodeList> orderBy = new
OrderByConverter().convert(selectStatement.getOrderBy().orElse(null));
+ SqlNodeList distinct = new
DistinctConverter().convert(selectStatement.getProjections()).orElse(null);
+ SqlNodeList projection = new
ProjectionsConverter().convert(selectStatement.getProjections()).orElseThrow(IllegalStateException::new);
+ SqlNode from = new
TableConverter().convert(selectStatement.getFrom()).orElse(null);
+ SqlNode where = selectStatement.getWhere().flatMap(optional -> new
WhereConverter().convert(optional)).orElse(null);
+ SqlNodeList groupBy = selectStatement.getGroupBy().flatMap(optional ->
new GroupByConverter().convert(optional)).orElse(null);
+ SqlNode having = selectStatement.getHaving().flatMap(optional -> new
HavingConverter().convert(optional)).orElse(null);
+ SqlNodeList orderBy = selectStatement.getOrderBy().flatMap(optional ->
new OrderByConverter().convert(optional)).orElse(SqlNodeList.EMPTY);
Optional<LimitSegment> limit =
SelectStatementHandler.getLimitSegment(selectStatement);
- Optional<SqlNode> offset = new
OffsetConverter().convert(limit.orElse(null));
- Optional<SqlNode> rowCount = new
RowCountConverter().convert(limit.orElse(null));
- return new SqlSelect(SqlParserPos.ZERO, distinct.orElse(null),
projections.get(), from.orElse(null), where.orElse(null), groupBy.orElse(null),
- having.orElse(null), SqlNodeList.EMPTY, orderBy.orElse(null),
offset.orElse(null), rowCount.orElse(null), SqlNodeList.EMPTY);
+ SqlNode offset = limit.flatMap(optional -> new
OffsetConverter().convert(optional)).orElse(null);
+ SqlNode rowCount = limit.flatMap(optional -> new
RowCountConverter().convert(optional)).orElse(null);
+ SqlSelect sqlSelect = new SqlSelect(SqlParserPos.ZERO, distinct,
projection, from,
+ where, groupBy, having, SqlNodeList.EMPTY, null, null, null,
SqlNodeList.EMPTY);
+ return containsOrderBy(orderBy, offset, rowCount) ? new
SqlOrderBy(SqlParserPos.ZERO, sqlSelect, orderBy, offset, rowCount) : sqlSelect;
+ }
+
+ private boolean containsOrderBy(final SqlNodeList orderBy, final SqlNode
offset, final SqlNode rowCount) {
+ return (null != orderBy && !orderBy.isEmpty()) || null != offset ||
null != rowCount;
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
deleted file mode 100644
index 2f915a6..0000000
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/converter/statement/SelectStatementConverterTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.optimize.converter.statement;
-
-import lombok.SneakyThrows;
-import org.apache.calcite.config.Lex;
-import org.apache.calcite.sql.SqlJoin;
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.SqlSelect;
-import org.apache.calcite.sql.parser.SqlParseException;
-import org.apache.calcite.sql.parser.SqlParser;
-import org.apache.calcite.sql.parser.SqlParser.Config;
-import org.apache.calcite.sql.validate.SqlConformanceEnum;
-import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-import org.apache.shardingsphere.infra.optimize.converter.SQLNodeConvertEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-
-public final class SelectStatementConverterTest {
-
- private ShardingSphereSQLParserEngine sqlStatementParserEngine;
-
- @Before
- public void init() {
- sqlStatementParserEngine = new
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new
MySQLDatabaseType()), new ConfigurationProperties(new Properties()));
- }
-
- @Test
- public void assertConvertSimpleSelect() {
- String sql = "select order_id, user_id from t_order";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNull(sqlSelect.getWhere());
- assertNull(sqlSelect.getOffset());
- assertNull(sqlSelect.getFetch());
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertLimit() {
- String sql = "select order_id, user_id from t_order limit 1, 2";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNull(sqlSelect.getWhere());
- assertNotNull(sqlSelect.getOffset());
- assertNotNull(sqlSelect.getFetch());
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertLimitWithRowCountOnly() {
- String sql = "select order_id, user_id from t_order limit 2";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNull(sqlSelect.getWhere());
- assertNull(sqlSelect.getOffset());
- assertNotNull(sqlSelect.getFetch());
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertWhere() {
- String sql = "select order_id, user_id from t_order where order_id =
10";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNotNull(sqlSelect.getWhere());
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertWhereAndGroupBy() {
- String sql = "select order_id, user_id from t_order where order_id =
10 group by order_id";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNotNull(sqlSelect.getWhere());
- assertThat(sqlSelect.getGroup().size(), is(1));
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertWhereAndOrderBy() {
- String sql = "select order_id, user_id from t_order where user_id = 10
order by order_id desc";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getSelectList().size(), is(2));
- assertNotNull(sqlSelect.getWhere());
- assertThat(sqlSelect.getOrderList().size(), is(1));
- SqlNode calciteSqlNode = parse(sql, new MySQLDatabaseType());
- assertNotNull(calciteSqlNode);
- assertThat(sqlNode.toString(), is(calciteSqlNode.toString()));
- }
-
- @Test
- public void assertConvertInnerJoin() {
- String sql = "select 10 + 30, o1.order_id + 10, o1.order_id,
o1.user_id, o2.status from t_order o1 join t_order_item o2 on "
- + "o1.order_id = o2.order_id where o1.status='FINISHED' and
o2.order_item_id > 1024 and 1=1 order by "
- + "o1.order_id desc";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- assertThat(((JoinTableSegment) ((MySQLSelectStatement)
sqlStatement).getFrom()).getJoinType(), is("INNER"));
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) sqlNode;
- assertThat(sqlSelect.getFrom(), instanceOf(SqlJoin.class));
- assertThat(sqlSelect.getOrderList().size(), is(1));
- }
-
- @Test
- public void assertConvertLeftOuterJoin() {
- String sql = "select 10 + 30, o1.order_id + 10, o1.order_id,
o1.user_id, o2.status from t_order o1 left outer join t_order_item o2 on "
- + "o1.order_id = o2.order_id where o1.status='FINISHED' and
o2.order_item_id > 1024 and 1=1 order by "
- + "o1.order_id desc";
- SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- SqlNode sqlNode = SQLNodeConvertEngine.convert(sqlStatement);
- assertThat(sqlNode, instanceOf(SqlSelect.class));
- // TODO outer join is not supported by parser of ShardingSphere
- }
-
- @SneakyThrows(SqlParseException.class)
- private SqlNode parse(final String sql, final DatabaseType databaseType) {
- return SqlParser.create(sql,
Config.DEFAULT.withConformance(getSQLConformance(databaseType)).withLex(getLex(databaseType))).parseQuery();
- }
-
- private Lex getLex(final DatabaseType databaseType) {
- return databaseType instanceof MySQLDatabaseType ? Lex.MYSQL :
Lex.ORACLE;
- }
-
- private SqlConformanceEnum getSQLConformance(final DatabaseType
databaseType) {
- return databaseType instanceof MySQLDatabaseType ?
SqlConformanceEnum.MYSQL_5 : SqlConformanceEnum.DEFAULT;
- }
-}
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/converter/supported/select.xml
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/converter/supported/select.xml
index f7787ab..365fa25 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/converter/supported/select.xml
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/resources/converter/supported/select.xml
@@ -17,10 +17,18 @@
-->
<sql-cases>
- <sql-case id="select_with_join_table_subquery" value="SELECT
t_order_federate.order_id, t_order_federate.user_id, u.user_id FROM
t_order_federate, (SELECT * FROM t_user_info) as u WHERE
t_order_federate.user_id = u.user_id" db-types="MySQL"/>
- <sql-case id="select_with_projection_subquery" value="SELECT
t_order_federate.order_id, t_order_federate.user_id, (SELECT COUNT(*) FROM
t_user_info) FROM t_order_federate" db-types="MySQL"/>
- <sql-case id="select_with_in_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
user_id IN (SELECT * FROM t_user_info)" db-types="MySQL"/>
- <sql-case id="select_with_between_and_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
user_id BETWEEN (SELECT user_id FROM t_user_info WHERE information = 'before')
AND (SELECT user_id FROM t_user_info WHERE information = 'after')"
db-types="MySQL"/>
- <sql-case id="select_with_exist_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
EXISTS (SELECT * FROM t_user_info WHERE t_order_federate.user_id =
t_user_info.user_id)" db-types="MySQL"/>
- <sql-case id="select_with_not_exist_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
NOT EXISTS (SELECT * FROM t_user_info WHERE t_order_federate.user_id =
t_user_info.user_id)" db-types="MySQL"/>
+ <sql-case id="select_with_join_table_subquery" value="SELECT
t_order_federate.order_id, t_order_federate.user_id, u.user_id FROM
t_order_federate, (SELECT * FROM t_user_info) as u WHERE
t_order_federate.user_id = u.user_id" db-types="MySQL" />
+ <sql-case id="select_with_projection_subquery" value="SELECT
t_order_federate.order_id, t_order_federate.user_id, (SELECT COUNT(*) FROM
t_user_info) FROM t_order_federate" db-types="MySQL" />
+ <sql-case id="select_with_in_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
user_id IN (SELECT * FROM t_user_info)" db-types="MySQL" />
+ <sql-case id="select_with_between_and_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
user_id BETWEEN (SELECT user_id FROM t_user_info WHERE information = 'before')
AND (SELECT user_id FROM t_user_info WHERE information = 'after')"
db-types="MySQL" />
+ <sql-case id="select_with_exist_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
EXISTS (SELECT * FROM t_user_info WHERE t_order_federate.user_id =
t_user_info.user_id)" db-types="MySQL" />
+ <sql-case id="select_with_not_exist_subquery_condition" value="SELECT
t_order_federate.order_id, t_order_federate.user_id FROM t_order_federate WHERE
NOT EXISTS (SELECT * FROM t_user_info WHERE t_order_federate.user_id =
t_user_info.user_id)" db-types="MySQL" />
+ <sql-case id="select_with_simple_table" value="SELECT order_id, user_id
FROM t_order" db-types="MySQL" />
+ <sql-case id="select_with_limit_offset_and_row_count" value="SELECT
order_id, user_id FROM t_order LIMIT 1, 2" db-types="MySQL" />
+ <sql-case id="select_with_limit_row_count" value="SELECT order_id, user_id
FROM t_order LIMIT 2" db-types="MySQL" />
+ <sql-case id="select_with_where_condition" value="SELECT order_id, user_id
FROM t_order WHERE order_id = 10" db-types="MySQL" />
+ <sql-case id="select_with_where_condition_and_group_by" value="SELECT
order_id, user_id FROM t_order WHERE order_id = 10 GROUP BY order_id"
db-types="MySQL" />
+ <sql-case id="select_with_where_condition_and_order_by" value="SELECT
order_id, user_id FROM t_order WHERE user_id = 10 ORDER BY order_id DESC"
db-types="MySQL" />
+ <sql-case id="select_with_inner_join_and_order_by" value="SELECT 10 + 30,
o1.order_id + 10, o1.order_id, o1.user_id, o2.status FROM t_order o1 JOIN
t_order_item o2 ON o1.order_id = o2.order_id WHERE o1.status='FINISHED' AND
o2.order_item_id > 1024 AND 1=1 ORDER BY o1.order_id DESC" db-types="MySQL" />
+ <sql-case id="select_with_left_outer_join_and_order_by" value="SELECT 10 +
30, o1.order_id + 10, o1.order_id, o1.user_id, o2.status FROM t_order o1 LEFT
OUTER JOIN t_order_item o2 ON o1.order_id = o2.order_id WHERE
o1.status='FINISHED' AND o2.order_item_id > 1024 AND 1=1 ORDER BY o1.order_id
DESC" db-types="MySQL" />
</sql-cases>