[#8649] Add support for MySQL's ALTER TABLE .. DROP FOREIGN KEY syntax

This commit is contained in:
Lukas Eder 2019-05-18 16:47:48 +02:00
parent a452eba624
commit ebce61b0fc
4 changed files with 99 additions and 25 deletions

View File

@ -555,7 +555,7 @@ public interface AlterTableStep {
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES })
AlterTableFinalStep drop(Constraint constraint);
/**
@ -564,8 +564,27 @@ public interface AlterTableStep {
*
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES })
AlterTableFinalStep dropConstraint(Constraint constraint);
/**
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
*
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES })
AlterTableFinalStep dropConstraint(Name constraint);
/**
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
*
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES })
AlterTableFinalStep dropConstraint(String constraint);
/**
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
@ -573,5 +592,23 @@ public interface AlterTableStep {
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
AlterTableFinalStep dropConstraint(String constraint);
AlterTableFinalStep dropForeignKey(Constraint constraint);
/**
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
*
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
AlterTableFinalStep dropForeignKey(Name constraint);
/**
* Add a <code>DROP CONSTRAINT</code> clause to the <code>ALTER TABLE</code>
* statement.
*
* @see DSL#constraint(String)
*/
@Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES })
AlterTableFinalStep dropForeignKey(String constraint);
}

View File

@ -70,6 +70,7 @@ import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
// ...
import static org.jooq.impl.ConstraintType.FOREIGN_KEY;
import static org.jooq.impl.DSL.commentOnTable;
import static org.jooq.impl.DSL.constraint;
import static org.jooq.impl.DSL.field;
@ -95,6 +96,7 @@ import static org.jooq.impl.Keywords.K_ELSE;
import static org.jooq.impl.Keywords.K_END_IF;
import static org.jooq.impl.Keywords.K_EXCEPTION;
import static org.jooq.impl.Keywords.K_EXEC;
import static org.jooq.impl.Keywords.K_FOREIGN_KEY;
import static org.jooq.impl.Keywords.K_IF;
import static org.jooq.impl.Keywords.K_IF_EXISTS;
import static org.jooq.impl.Keywords.K_IF_NOT_EXISTS;
@ -188,6 +190,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
private static final EnumSet<SQLDialect> SUPPORT_RENAME_TABLE = EnumSet.of(DERBY);
private static final EnumSet<SQLDialect> NO_SUPPORT_RENAME_QUALIFIED_TABLE = EnumSet.of(POSTGRES);
private static final EnumSet<SQLDialect> NO_SUPPORT_ALTER_TYPE_AND_NULL = EnumSet.of(POSTGRES);
private static final EnumSet<SQLDialect> NO_SUPPORT_DROP_CONSTRAINT = EnumSet.of(MYSQL);
private static final EnumSet<SQLDialect> REQUIRE_REPEAT_ADD_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL, POSTGRES);
private static final EnumSet<SQLDialect> REQUIRE_REPEAT_DROP_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL, POSTGRES);
@ -228,6 +231,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
private QueryPartList<Field<?>> dropColumns;
private boolean dropColumnCascade;
private Constraint dropConstraint;
private ConstraintType dropConstraintType;
AlterTableImpl(Configuration configuration, Table<?> table) {
this(configuration, table, false);
@ -663,17 +667,40 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
@Override
public final AlterTableImpl drop(Constraint constraint) {
dropConstraint = constraint;
dropConstraintType = null;
return this;
}
@Override
public final AlterTableImpl dropConstraint(Constraint constraint) {
return drop(constraint);
}
@Override
public final AlterTableImpl dropConstraint(Name constraint) {
return drop(DSL.constraint(constraint));
return dropConstraint(DSL.constraint(constraint));
}
@Override
public final AlterTableImpl dropConstraint(String constraint) {
return drop(DSL.constraint(constraint));
return dropConstraint(DSL.constraint(constraint));
}
@Override
public final AlterTableImpl dropForeignKey(Constraint constraint) {
dropConstraint = constraint;
dropConstraintType = FOREIGN_KEY;
return this;
}
@Override
public final AlterTableImpl dropForeignKey(Name constraint) {
return dropForeignKey(DSL.constraint(constraint));
}
@Override
public final AlterTableImpl dropForeignKey(String constraint) {
return dropForeignKey(DSL.constraint(constraint));
}
@Override
@ -1232,9 +1259,14 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
ctx.start(ALTER_TABLE_DROP);
ctx.data(DATA_CONSTRAINT_REFERENCE, true);
ctx.visit(K_DROP_CONSTRAINT)
.sql(' ')
.visit(dropConstraint);
if (dropConstraintType == FOREIGN_KEY && NO_SUPPORT_DROP_CONSTRAINT.contains(family))
ctx.visit(K_DROP).sql(' ').visit(K_FOREIGN_KEY)
.sql(' ')
.visit(dropConstraint);
else
ctx.visit(K_DROP_CONSTRAINT)
.sql(' ')
.visit(dropConstraint);
ctx.data().remove(DATA_CONSTRAINT_REFERENCE);
ctx.end(ALTER_TABLE_DROP);

View File

@ -176,6 +176,24 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
@Override
public final void onConflictOnConstraint(Constraint constraint) {
onConflictOnConstraint0(constraint);
}
@Override
public void onConflictOnConstraint(UniqueKey<R> constraint) {
if (StringUtils.isEmpty(constraint.getName()))
throw new IllegalArgumentException("UniqueKey's name is not specified");
this.onConstraintUniqueKey = constraint;
onConflictOnConstraint0(constraint(name(constraint.getName())));
}
@Override
public final void onConflictOnConstraint(Name constraint) {
onConflictOnConstraint0(constraint(constraint));
}
private void onConflictOnConstraint0(Constraint constraint) {
this.onConstraint = constraint;
if (onConstraintUniqueKey == null) {
@ -188,20 +206,6 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
}
}
@Override
public void onConflictOnConstraint(UniqueKey<R> constraint) {
if (StringUtils.isEmpty(constraint.getName()))
throw new IllegalArgumentException("UniqueKey's name is not specified");
this.onConstraintUniqueKey = constraint;
onConflictOnConstraint(name(constraint.getName()));
}
@Override
public final void onConflictOnConstraint(Name constraint) {
onConflictOnConstraint(constraint(constraint));
}
@Override
public final void onDuplicateKeyUpdate(boolean flag) {
this.onDuplicateKeyIgnore = false;

View File

@ -3609,9 +3609,10 @@ final class ParserImpl implements Parser {
case 'D':
if (parseKeywordIf(ctx, "DROP")) {
if (parseKeywordIf(ctx, "CONSTRAINT")) {
Name constraint = parseIdentifier(ctx);
return s1.dropConstraint(constraint);
return s1.dropConstraint(parseIdentifier(ctx));
}
else if (parseKeywordIf(ctx, "FOREIGN KEY")) {
return s1.dropForeignKey(parseIdentifier(ctx));
}
else if (parseKeywordIf(ctx, "INDEX")
|| parseKeywordIf(ctx, "KEY")) {