提交 ad9bf4d1 authored 作者: sylvain-ilm's avatar sylvain-ilm

duplicate _testDropTable() into 3 methods, as requested

上级 761c70e8
......@@ -279,57 +279,67 @@ public class TestCases extends TestBase {
}
private void testDropTable() throws SQLException {
for (final boolean stdDropTableRestrict : new boolean[] { true, false }) {
_testDropTable(stdDropTableRestrict);
trace("testDropTable");
final boolean[] booleans = new boolean[] { true, false };
for (final boolean stdDropTableRestrict : booleans) {
for (final boolean restrict : booleans) {
testDropTableNoReference(stdDropTableRestrict, restrict);
testDropTableViewReference(stdDropTableRestrict, restrict);
testDropTableForeignKeyReference(stdDropTableRestrict, restrict);
}
}
}
private static enum DropDependent {
NONE, VIEW, FOREIGN_KEY;
private Statement createTable(final boolean stdDropTableRestrict) throws SQLException {
deleteDb("cases");
Connection conn = getConnection("cases", stdDropTableRestrict);
Statement stat = conn.createStatement();
stat.execute("create table test(id int)");
return stat;
}
private void _testDropTable(final boolean stdDropTableRestrict) throws SQLException {
trace("testDrop");
private void dropTable(final boolean restrict, Statement stat, final boolean expectedDropSuccess)
throws SQLException {
assertThrows(expectedDropSuccess ? 0 : ErrorCode.CANNOT_DROP_2, stat)
.execute("drop table test " + (restrict ? "restrict" : "cascade"));
assertThrows(expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from test");
}
for (final boolean restrict : new boolean[] { true, false }) {
for (final DropDependent dropDep : DropDependent.values()) {
deleteDb("cases");
Connection conn = getConnection("cases", stdDropTableRestrict);
Statement stat = conn.createStatement();
stat.execute("create table test(id int)");
if (dropDep == DropDependent.VIEW) {
stat.execute("create view abc as select * from test");
} else if (dropDep == DropDependent.FOREIGN_KEY) {
stat.execute("create table ref(id int, id_test int, foreign key (id_test) references test (id)) ");
// test table is empty so the foreign key forces ref table to be also empty
assertThrows(ErrorCode.REFERENTIAL_INTEGRITY_VIOLATED_PARENT_MISSING_1, stat).execute("insert into ref values(1,2)");
}
private void testDropTableNoReference(final boolean stdDropTableRestrict, final boolean restrict)
throws SQLException {
Statement stat = createTable(stdDropTableRestrict);
// always succeed as there's no reference to the table
dropTable(restrict, stat, true);
stat.getConnection().close();
}
// drop allowed if no references or cascade
final boolean expectedDropSuccess = dropDep == DropDependent.NONE
|| (!stdDropTableRestrict && dropDep == DropDependent.FOREIGN_KEY) || !restrict;
assertThrows(expectedDropSuccess ? 0 : ErrorCode.CANNOT_DROP_2, stat).execute("drop table test " + (restrict ? "restrict" : "cascade"));
assertThrows(expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from test");
// missing view if it was never created or if the drop succeeded
assertThrows(dropDep != DropDependent.VIEW || expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from abc");
final int refError;
if (dropDep != DropDependent.FOREIGN_KEY) {
// never created
refError = ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1;
} else if (expectedDropSuccess) {
// foreign key dropped
refError = 0;
} else {
// foreign key not dropped
refError = ErrorCode.REFERENTIAL_INTEGRITY_VIOLATED_PARENT_MISSING_1;
}
assertThrows(refError, stat).execute("insert into ref values(1,2)");
private void testDropTableViewReference(final boolean stdDropTableRestrict, final boolean restrict)
throws SQLException {
Statement stat = createTable(stdDropTableRestrict);
stat.execute("create view abc as select * from test");
// drop allowed only if cascade
final boolean expectedDropSuccess = !restrict;
dropTable(restrict, stat, expectedDropSuccess);
// missing view if the drop succeeded
assertThrows(expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from abc");
stat.getConnection().close();
}
conn.close();
}
}
private void testDropTableForeignKeyReference(final boolean stdDropTableRestrict, final boolean restrict)
throws SQLException {
Statement stat = createTable(stdDropTableRestrict);
stat.execute("create table ref(id int, id_test int, foreign key (id_test) references test (id)) ");
// test table is empty, so the foreign key forces ref table to be also
// empty
assertThrows(ErrorCode.REFERENTIAL_INTEGRITY_VIOLATED_PARENT_MISSING_1, stat)
.execute("insert into ref values(1,2)");
// drop allowed if cascade or old style
final boolean expectedDropSuccess = !stdDropTableRestrict || !restrict;
dropTable(restrict, stat, expectedDropSuccess);
// insertion succeeds if the foreign key was dropped
assertThrows(expectedDropSuccess ? 0 : ErrorCode.REFERENTIAL_INTEGRITY_VIOLATED_PARENT_MISSING_1, stat)
.execute("insert into ref values(1,2)");
stat.getConnection().close();
}
private void testConvertType() throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论