package net.sourceforge.mayfly.acceptance.definition; import net.sourceforge.mayfly.acceptance.SqlTestCase; public class DropColumnTest extends SqlTestCase { public void testBasics() throws Exception { execute("create table foo(a integer, b integer)"); execute("insert into foo(a, b) values (5, 50)"); /* The SQL92 grammar seems to require CASCADE or RESTRICT after the column name, but ommitting that keyword seems common. */ String dropColumn = "alter table foo drop column a"; if (dialect.haveDropColumn()) { execute(dropColumn); expectExecuteFailure("insert into foo(a) values (6)", "no column a"); assertResultSet(new String[] { " 50 " }, query("select * from foo")); } else { expectExecuteFailure(dropColumn, "did not expect DROP"); assertResultSet(new String[] { " 5, 50 " }, query("select * from foo")); } } public void testNonexistent() throws Exception { if (!dialect.haveDropColumn()) { return; } execute("create table foo(a integer, b integer)"); expectExecuteFailure("alter table foo drop column c", "no column c"); } public void testNotNull() throws Exception { if (!dialect.haveDropColumn()) { return; } execute("create table foo(a integer, b integer not null)"); execute("alter table foo drop column b"); execute("insert into foo values (5)"); assertResultSet(new String[] { " 5 " }, query("select * from foo")); } public void testLastColumn() throws Exception { if (!dialect.haveDropColumn()) { return; } execute("create table foo(a integer)"); String dropLastColumn = "alter table foo drop column a"; String insertRow = "insert into foo values(5)"; if (dialect.canDropLastColumn()) { execute(dropLastColumn); expectExecuteFailure(insertRow, "no column a"); } else { expectExecuteFailure(dropLastColumn, "attempt to drop the last column: a"); execute(insertRow); assertResultSet(new String[] { " 5 " }, query("select * from foo")); } } public void testSingleColumnPrimaryKey() throws Exception { execute("create table foo(a integer, b integer, primary key(a) )"); String dropPrimaryKey = "alter table foo drop column a"; if (dialect.haveDropColumn() && dialect.canDropPrimaryKeyColumn()) { execute(dropPrimaryKey); } else { expectExecuteFailure(dropPrimaryKey, "cannot drop column a because it is referenced by a primary key"); } } public void testForeignKeyFromDroppedColumn() throws Exception { if (!dialect.haveDropColumn()) { return; } execute("create table bar(id integer primary key)"); execute("create table foo(a integer, " + "remaining_column integer, " + "foreign key(a) references bar(id) " + ")"); String dropColumnWithForeignKey = "alter table foo drop column a"; if (dialect.canDropColumnWithForeignKey()) { execute(dropColumnWithForeignKey); } else { expectExecuteFailure(dropColumnWithForeignKey, "column is referenced by a foreign key constraint"); } } // foreign key references column (i.e. ForeignKeyToDroppedColumn) // unique or primary key constraint // (multi-column) references column // CASCADE (means also drop foreign keys or views which reference the column) // index references column }