未验证 提交 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 @@ ...@@ -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_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_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_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_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_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" /> <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; ...@@ -22,11 +22,16 @@ import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.integrate.asserts.SQLCaseAssertContext; 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.SQLSegmentAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.schema.SchemaAssert; 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.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.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.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.SchemaSegment; 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.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.Collection;
import java.util.List; import java.util.List;
...@@ -42,6 +47,19 @@ import static org.junit.Assert.assertTrue; ...@@ -42,6 +47,19 @@ import static org.junit.Assert.assertTrue;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TableAssert { 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. * Assert actual table segments is correct with expected tables.
* *
...@@ -81,6 +99,20 @@ public final class TableAssert { ...@@ -81,6 +99,20 @@ public final class TableAssert {
SQLSegmentAssert.assertIs(assertContext, actual, expected); 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. * Assert actual table segment is correct with expected table owner.
* *
...@@ -95,4 +127,24 @@ public final class TableAssert { ...@@ -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())); assertThat(assertContext.getText("Owner name end delimiter assertion error: "), actual.getTableName().getIdentifier().getQuoteCharacter().getEndDelimiter(), is(expected.getEndDelimiter()));
SQLSegmentAssert.assertIs(assertContext, actual, expected); 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; ...@@ -22,8 +22,8 @@ import lombok.Setter;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.AbstractExpectedDelimiterSQLSegment; import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.AbstractExpectedDelimiterSQLSegment;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
/** /**
* Expected tables. * Expected tables.
...@@ -33,8 +33,8 @@ import java.util.LinkedList; ...@@ -33,8 +33,8 @@ import java.util.LinkedList;
public final class ExpectedTables extends AbstractExpectedDelimiterSQLSegment { public final class ExpectedTables extends AbstractExpectedDelimiterSQLSegment {
@XmlElement(name = "simple-table") @XmlElement(name = "simple-table")
private final Collection<ExpectedSimpleTable> simpleTables = new LinkedList<>(); private final List<ExpectedSimpleTable> simpleTables = new LinkedList<>();
@XmlElement(name = "subquery-table") @XmlElement(name = "subquery-table")
private final Collection<ExpectedSubqueryTable> subqueryTables = new LinkedList<>(); private final List<ExpectedSubqueryTable> subqueryTables = new LinkedList<>();
} }
...@@ -47,15 +47,38 @@ ...@@ -47,15 +47,38 @@
</select> </select>
--> -->
<!-- <select sql-case-id="select_sub_query_with_table" parameters="1, 2">--> <select sql-case-id="select_sub_query_with_table" parameters="3, 4">
<!-- <simple-table name="t_order" alias="o" start-index="33" stop-index="39" />--> <tables>
<!-- <conditions>--> <subquery-table start-index="17" stop-index="62" alias="t">
<!-- <condition column-name="order_id" table-name="t_order" operator="IN">--> <select>
<!-- <value index="0" literal="1" type="int" />--> <tables>
<!-- <value index="1" literal="2" type="int" />--> <simple-table name="t_order" start-index="31" stop-index="37" />
<!-- </condition>--> </tables>
<!-- </conditions>--> <projections start-index="24" stop-index="24">
<!-- </select>--> <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"> <select sql-case-id="select_with_equal_subquery">
<tables> <tables>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册