未验证 提交 124dfc7f 编写于 作者: J Juan Pan(Trista) 提交者: GitHub

test sql with sub query table (#4801)

* test sql with sub query table

* for check style
上级 7f3b318c
......@@ -21,7 +21,7 @@
<!-- <sql-case id="select_sub_query_with_multiple_tables" value="SELECT t.* FROM (SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id and o.order_id IN (?, ?)) t ORDER BY t.item_id" db-types="SQLServer,Oracle" />-->
<!-- <sql-case id="select_sub_query_with_order_by" value="SELECT COUNT(1) as orders_count FROM (SELECT * FROM t_order ORDER BY order_id desc) t" db-types="H2,MySQL,PostgreSQL,Oracle" />-->
<!-- <sql-case id="select_sub_query_with_group_by" value="SELECT COUNT(1) as order_items_count FROM (SELECT order_id FROM t_order_item GROUP BY order_id) t" db-types="H2,MySQL,PostgreSQL,Oracle" />-->
<!-- <sql-case id="select_sub_query_with_table" value="SELECT t.* FROM (SELECT * FROM t_order o WHERE o.order_id IN (?, ?)) t ORDER BY t.item_id" />-->
<sql-case id="select_sub_query_with_table" value="SELECT t.* FROM (SELECT * FROM t_order WHERE order_id IN (?, ?)) t" />
<sql-case id="select_with_equal_subquery" value="SELECT * FROM t_order WHERE user_id = (SELECT user_id FROM t_order_item WHERE id = 10)" db-types="MySQL" />
<sql-case id="select_with_in_subquery" value="SELECT * FROM t_order WHERE user_id in (SELECT user_id FROM t_order_item WHERE id in (10, 11))" db-types="MySQL" />
<sql-case id="select_with_between_subquery" value="SELECT * FROM t_order WHERE user_id between (select user_id from t_order_item where order_id = 10) and ?" db-types="MySQL" />
......
......@@ -22,11 +22,16 @@ import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.integrate.asserts.SQLCaseAssertContext;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.SQLSegmentAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.schema.SchemaAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.statement.dml.impl.SelectStatementAssert;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedSimpleTable;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedSimpleTableOwner;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedSubqueryTable;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedTables;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.SchemaSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SubqueryTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableSegment;
import java.util.Collection;
import java.util.List;
......@@ -42,6 +47,19 @@ import static org.junit.Assert.assertTrue;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TableAssert {
/**
* Assert actual table segments is correct with expected tables.
*
* @param assertContext assert context
* @param actual actual tables
* @param expected expected tables
*/
public static void assertIs(final SQLCaseAssertContext assertContext, final Collection<TableSegment> actual, final ExpectedTables expected) {
assertThat(assertContext.getText("Tables size assertion error: "), actual.size(), is(expected.getSimpleTables().size() + expected.getSubqueryTables().size()));
assertSimpleTableSegment(assertContext, actual, expected);
assertSubqueryTableSegment(assertContext, actual, expected);
}
/**
* Assert actual table segments is correct with expected tables.
*
......@@ -81,6 +99,20 @@ public final class TableAssert {
SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
/**
* Assert subquery expression.
*
* @param assertContext assert context
* @param actual actual subquery segment
* @param expected expected subquery expression
*/
public static void assertIs(final SQLCaseAssertContext assertContext, final SubqueryTableSegment actual, final ExpectedSubqueryTable expected) {
SelectStatementAssert.assertIs(assertContext, actual.getSubquery().getSelect(), expected.getSubquery().getSelectTestCases());
assertThat(assertContext.getText("Table alias assertion error: "), actual.getAlias().orElse(null), is(expected.getAlias()));
// TODO assert start index, stop index and sub select statement.
// SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
/**
* Assert actual table segment is correct with expected table owner.
*
......@@ -95,4 +127,24 @@ public final class TableAssert {
assertThat(assertContext.getText("Owner name end delimiter assertion error: "), actual.getTableName().getIdentifier().getQuoteCharacter().getEndDelimiter(), is(expected.getEndDelimiter()));
SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
private static void assertSimpleTableSegment(final SQLCaseAssertContext assertContext, final Collection<TableSegment> actual, final ExpectedTables expected) {
int count = 0;
for (TableSegment each : actual) {
if (each instanceof SimpleTableSegment) {
assertIs(assertContext, (SimpleTableSegment) each, expected.getSimpleTables().get(count));
}
count++;
}
}
private static void assertSubqueryTableSegment(final SQLCaseAssertContext assertContext, final Collection<TableSegment> actual, final ExpectedTables expected) {
int count = 0;
for (TableSegment each : actual) {
if (each instanceof SubqueryTableSegment) {
assertIs(assertContext, (SubqueryTableSegment) each, expected.getSubqueryTables().get(count));
}
count++;
}
}
}
......@@ -22,8 +22,8 @@ import lombok.Setter;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.AbstractExpectedDelimiterSQLSegment;
import javax.xml.bind.annotation.XmlElement;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
/**
* Expected tables.
......@@ -33,8 +33,8 @@ import java.util.LinkedList;
public final class ExpectedTables extends AbstractExpectedDelimiterSQLSegment {
@XmlElement(name = "simple-table")
private final Collection<ExpectedSimpleTable> simpleTables = new LinkedList<>();
private final List<ExpectedSimpleTable> simpleTables = new LinkedList<>();
@XmlElement(name = "subquery-table")
private final Collection<ExpectedSubqueryTable> subqueryTables = new LinkedList<>();
private final List<ExpectedSubqueryTable> subqueryTables = new LinkedList<>();
}
......@@ -47,15 +47,38 @@
</select>
-->
<!-- <select sql-case-id="select_sub_query_with_table" parameters="1, 2">-->
<!-- <simple-table name="t_order" alias="o" start-index="33" stop-index="39" />-->
<!-- <conditions>-->
<!-- <condition column-name="order_id" table-name="t_order" operator="IN">-->
<!-- <value index="0" literal="1" type="int" />-->
<!-- <value index="1" literal="2" type="int" />-->
<!-- </condition>-->
<!-- </conditions>-->
<!-- </select>-->
<select sql-case-id="select_sub_query_with_table" parameters="3, 4">
<tables>
<subquery-table start-index="17" stop-index="62" alias="t">
<select>
<tables>
<simple-table name="t_order" start-index="31" stop-index="37" />
</tables>
<projections start-index="24" stop-index="24">
<shorthand-projection start-index="24" stop-index="24" />
</projections>
<where start-index="39" stop-index="62" literal-stop-index="62">
<and-predicate>
<predicate start-index="45" stop-index="62" literal-stop-index="62">
<column-left-value name="order_id" start-index="45" stop-index="52" />
<in-right-value>
<parameter-marker-expression value="1" />
<parameter-marker-expression value="2" />
<literal-expression value="3" />
<literal-expression value="4" />
</in-right-value>
</predicate>
</and-predicate>
</where>
</select>
</subquery-table>
</tables>
<projections start-index="7" stop-index="9">
<shorthand-projection start-index="7" stop-index="9" >
<owner name="t" start-index="7" stop-index="7" />
</shorthand-projection>
</projections>
</select>
<select sql-case-id="select_with_equal_subquery">
<tables>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册