[#5082] Add support for ALTER TABLE .. RENAME COLUMN .. TO ..

This commit is contained in:
lukaseder 2016-02-14 18:11:57 +01:00
parent c5818111ce
commit 48189bbe92
3 changed files with 112 additions and 5 deletions

View File

@ -91,6 +91,27 @@ public interface AlterTableStep {
@Support
AlterTableFinalStep renameTo(String newName);
/**
* Add a <code>RENAME COLUMN</code> clause to the <code>ALTER TABLE</code>
* statement.
*/
@Support
AlterTableRenameColumnToStep renameColumn(Field<?> oldName);
/**
* Add a <code>RENAME COLUMN</code> clause to the <code>ALTER TABLE</code>
* statement.
*/
@Support
AlterTableRenameColumnToStep renameColumn(Name oldName);
/**
* Add a <code>RENAME COLUMN</code> clause to the <code>ALTER TABLE</code>
* statement.
*/
@Support
AlterTableRenameColumnToStep renameColumn(String oldName);
/**
* Add an <code>ALTER COLUMN</code> clause to the <code>ALTER TABLE</code>
* statement.

View File

@ -969,7 +969,21 @@ public enum Clause {
* <li>the new table name</li>
* </ul>
*/
ALTER_TABLE_RENAME_TO,
ALTER_TABLE_RENAME,
/**
* A <code>RENAME COLUMN</code> clause within an {@link #ALTER_TABLE}
* statement.
* <p>
* This clause surrounds
* <ul>
* <li>the <code>RENAME COLUMN</code> keywords</li>
* <li>the old column name</li>
* <li>the <code>TO</code> keyword</li>
* <li>the new column name</li>
* </ul>
*/
ALTER_TABLE_RENAME_COLUMN,
/**
* A <code>ADD</code> clause within an {@link #ALTER_TABLE} statement.

View File

@ -46,7 +46,8 @@ import static org.jooq.Clause.ALTER_TABLE_ADD;
import static org.jooq.Clause.ALTER_TABLE_ALTER;
import static org.jooq.Clause.ALTER_TABLE_ALTER_DEFAULT;
import static org.jooq.Clause.ALTER_TABLE_DROP;
import static org.jooq.Clause.ALTER_TABLE_RENAME_TO;
import static org.jooq.Clause.ALTER_TABLE_RENAME;
import static org.jooq.Clause.ALTER_TABLE_RENAME_COLUMN;
import static org.jooq.Clause.ALTER_TABLE_TABLE;
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
@ -62,6 +63,7 @@ import static org.jooq.impl.Utils.DataKey.DATA_DROP_CONSTRAINT;
import org.jooq.AlterTableAlterStep;
import org.jooq.AlterTableDropStep;
import org.jooq.AlterTableFinalStep;
import org.jooq.AlterTableRenameColumnToStep;
import org.jooq.AlterTableStep;
import org.jooq.Clause;
import org.jooq.Configuration;
@ -83,7 +85,8 @@ final class AlterTableImpl extends AbstractQuery implements
// Cascading interface implementations for ALTER TABLE behaviour
AlterTableStep,
AlterTableDropStep,
AlterTableAlterStep {
AlterTableAlterStep,
AlterTableRenameColumnToStep {
/**
* Generated UID
@ -93,6 +96,8 @@ final class AlterTableImpl extends AbstractQuery implements
private final Table<?> table;
private Table<?> renameTo;
private Field<?> renameColumn;
private Field<?> renameColumnTo;
private Field<?> addColumn;
private DataType<?> addColumnType;
private Constraint addConstraint;
@ -129,6 +134,42 @@ final class AlterTableImpl extends AbstractQuery implements
return renameTo(name(newName));
}
@Override
public final AlterTableImpl renameColumn(Field<?> oldName) {
renameColumn = oldName;
return this;
}
@Override
public final AlterTableImpl renameColumn(Name oldName) {
return renameColumn(field(oldName));
}
@Override
public final AlterTableImpl renameColumn(String oldName) {
return renameColumn(name(oldName));
}
@Override
public final AlterTableImpl to(Field<?> newName) {
if (renameColumn != null)
renameColumnTo = newName;
else
throw new IllegalStateException();
return this;
}
@Override
public final AlterTableImpl to(Name newName) {
return to(field(newName));
}
@Override
public final AlterTableImpl to(String newName) {
return to(name(newName));
}
@Override
public final <T> AlterTableImpl add(Field<T> field, DataType<T> type) {
return addColumn(field, type);
@ -304,10 +345,41 @@ final class AlterTableImpl extends AbstractQuery implements
.formatSeparator();
if (renameTo != null) {
ctx.start(ALTER_TABLE_RENAME_TO)
boolean qualify = ctx.qualify();
ctx.start(ALTER_TABLE_RENAME)
.qualify(false)
.keyword("rename to").sql(' ')
.visit(renameTo)
.end(ALTER_TABLE_RENAME_TO);
.qualify(qualify)
.end(ALTER_TABLE_RENAME);
}
else if (renameColumn != null) {
boolean qualify = ctx.qualify();
ctx.start(ALTER_TABLE_RENAME_COLUMN)
.qualify(false);
switch (ctx.family()) {
case H2:
ctx.keyword("alter column").sql(' ')
.visit(renameColumn)
.formatSeparator()
.keyword("rename to").sql(' ')
.visit(renameColumnTo);
break;
default:
ctx.keyword("rename column").sql(' ')
.visit(renameColumn)
.formatSeparator()
.keyword("to").sql(' ')
.visit(renameColumnTo);
break;
}
ctx.qualify(qualify)
.end(ALTER_TABLE_RENAME_COLUMN);
}
else if (addColumn != null) {
ctx.start(ALTER_TABLE_ADD)