提交 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 { ...@@ -279,57 +279,67 @@ public class TestCases extends TestBase {
} }
private void testDropTable() throws SQLException { private void testDropTable() throws SQLException {
for (final boolean stdDropTableRestrict : new boolean[] { true, false }) { trace("testDropTable");
_testDropTable(stdDropTableRestrict); 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 { private Statement createTable(final boolean stdDropTableRestrict) throws SQLException {
NONE, VIEW, FOREIGN_KEY; 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 { private void dropTable(final boolean restrict, Statement stat, final boolean expectedDropSuccess)
trace("testDrop"); 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 }) { private void testDropTableNoReference(final boolean stdDropTableRestrict, final boolean restrict)
for (final DropDependent dropDep : DropDependent.values()) { throws SQLException {
deleteDb("cases"); Statement stat = createTable(stdDropTableRestrict);
Connection conn = getConnection("cases", stdDropTableRestrict); // always succeed as there's no reference to the table
Statement stat = conn.createStatement(); dropTable(restrict, stat, true);
stat.execute("create table test(id int)"); stat.getConnection().close();
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)");
}
// drop allowed if no references or cascade private void testDropTableViewReference(final boolean stdDropTableRestrict, final boolean restrict)
final boolean expectedDropSuccess = dropDep == DropDependent.NONE throws SQLException {
|| (!stdDropTableRestrict && dropDep == DropDependent.FOREIGN_KEY) || !restrict; Statement stat = createTable(stdDropTableRestrict);
assertThrows(expectedDropSuccess ? 0 : ErrorCode.CANNOT_DROP_2, stat).execute("drop table test " + (restrict ? "restrict" : "cascade")); stat.execute("create view abc as select * from test");
assertThrows(expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from test"); // drop allowed only if cascade
final boolean expectedDropSuccess = !restrict;
// missing view if it was never created or if the drop succeeded dropTable(restrict, stat, expectedDropSuccess);
assertThrows(dropDep != DropDependent.VIEW || expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from abc"); // missing view if the drop succeeded
assertThrows(expectedDropSuccess ? ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1 : 0, stat).execute("select * from abc");
final int refError; stat.getConnection().close();
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)");
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 { private void testConvertType() throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论