diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index f4dc40dd29..f94bad1f93 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -270,21 +270,25 @@ final class AlterTableImpl extends AbstractRowCountQuery implements this.ifExists = ifExists; } - final Table $table() { return table; } - final boolean $ifExists() { return ifExists; } - final boolean $ifExistsColumn() { return ifExistsColumn; } - final boolean $ifNotExistsColumn() { return ifNotExistsColumn; } - final Field $addColumn() { return addColumn; } - final DataType $addColumnType() { return addColumnType; } - final boolean $addFirst() { return addFirst; } - final Field $addBefore() { return addBefore; } - final Field $addAfter() { return addAfter; } - final Table $renameTo() { return renameTo; } - final Field $renameColumn() { return renameColumn; } - final Field $renameColumnTo() { return renameColumnTo; } - final List> $dropColumns() { return dropColumns; }; - final Constraint $dropConstraint() { return dropConstraint; } - final ConstraintType $dropConstraintType() { return dropConstraintType; } + final Table $table() { return table; } + final boolean $ifExists() { return ifExists; } + final boolean $ifExistsColumn() { return ifExistsColumn; } + final boolean $ifNotExistsColumn() { return ifNotExistsColumn; } + final Field $addColumn() { return addColumn; } + final DataType $addColumnType() { return addColumnType; } + final boolean $addFirst() { return addFirst; } + final Field $addBefore() { return addBefore; } + final Field $addAfter() { return addAfter; } + final Field $alterColumn() { return alterColumn; } + final Nullability $alterColumnNullability() { return alterColumnNullability; } + final DataType $alterColumnType() { return alterColumnType; } + final Field $alterColumnDefault() { return alterColumnDefault; } + final Table $renameTo() { return renameTo; } + final Field $renameColumn() { return renameColumn; } + final Field $renameColumnTo() { return renameColumnTo; } + final List> $dropColumns() { return dropColumns; }; + final Constraint $dropConstraint() { return dropConstraint; } + final ConstraintType $dropConstraintType() { return dropConstraintType; } // ------------------------------------------------------------------------ // XXX: DSL API diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java index 34d8f04ff3..1931f706b1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java @@ -58,6 +58,7 @@ import org.jooq.Meta; import org.jooq.Name; import org.jooq.Name.Quoted; import org.jooq.Named; +import org.jooq.Nullability; import org.jooq.Query; import org.jooq.Record; import org.jooq.Schema; @@ -245,6 +246,12 @@ final class DDLInterpreter { throw objectNotTable(table); Field addColumn = query.$addColumn(); + Field alterColumn = query.$alterColumn(); + Field alterColumnDefault = query.$alterColumnDefault(); + Nullability alterColumnNullability = query.$alterColumnNullability(); + DataType alterColumnType = query.$alterColumnType(); + boolean ifExistsColumn = query.$ifExistsColumn(); + boolean ifNotExistsColumn = query.$ifNotExistsColumn(); Table renameTo = query.$renameTo(); Field renameColumn = query.$renameColumn(); Field renameColumnTo = query.$renameColumnTo(); @@ -260,6 +267,21 @@ final class DDLInterpreter { else existing.fields.add(new MutableField((UnqualifiedName) addColumn.getUnqualifiedName(), existing, query.$addColumnType())); } + else if (alterColumn != null) { + MutableField existingField = existing.field(alterColumn); + + if (existingField == null) { + if (!ifExistsColumn) + throw columnNotExists(alterColumn); + + return; + } + + if (alterColumnNullability != null) + existingField.type = existingField.type.nullability(alterColumnNullability); + else + throw unsupportedQuery(query); + } else if (renameTo != null && checkNotExists(schema, renameTo)) { existing.name = (UnqualifiedName) renameTo.getUnqualifiedName(); } @@ -430,7 +452,18 @@ final class DDLInterpreter { } private final void accept0(DropSequenceImpl query) { + Sequence sequence = query.$sequence(); + MutableSchema schema = getSchema(sequence.getSchema()); + MutableSequence existing = schema.sequence(sequence); + if (existing == null) { + if (!query.$ifExists()) + throw sequenceNotExists(sequence); + + return; + } + + schema.sequences.remove(existing); } private final void accept0(CommentOnImpl query) { @@ -489,6 +522,14 @@ final class DDLInterpreter { return new DataDefinitionException("View already exists: " + view.getQualifiedName()); } + private static final DataDefinitionException columnNotExists(Field field) { + return new DataDefinitionException("Column does not exist: " + field.getQualifiedName()); + } + + private static final DataDefinitionException columnAlreadyExists(Field field) { + return new DataDefinitionException("Column already exists: " + field.getQualifiedName()); + } + private static final DataDefinitionException sequenceNotExists(Sequence sequence) { return new DataDefinitionException("Sequence does not exist: " + sequence.getQualifiedName()); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java index a81e500199..319ed95942 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java @@ -92,6 +92,9 @@ final class DropSequenceImpl extends AbstractRowCountQuery implements this.ifExists = ifExists; } + final Sequence $sequence() { return sequence; } + final boolean $ifExists() { return ifExists; } + // ------------------------------------------------------------------------ // XXX: QueryPart API // ------------------------------------------------------------------------