From ebce61b0fcbacd04e087a7ca5132cd61e6f315d0 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sat, 18 May 2019 16:47:48 +0200 Subject: [PATCH] [#8649] Add support for MySQL's ALTER TABLE .. DROP FOREIGN KEY syntax --- .../main/java/org/jooq/AlterTableStep.java | 43 +++++++++++++++++-- .../java/org/jooq/impl/AlterTableImpl.java | 42 +++++++++++++++--- .../java/org/jooq/impl/InsertQueryImpl.java | 32 ++++++++------ .../main/java/org/jooq/impl/ParserImpl.java | 7 +-- 4 files changed, 99 insertions(+), 25 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/AlterTableStep.java b/jOOQ/src/main/java/org/jooq/AlterTableStep.java index 007583107c..c07c80f91a 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableStep.java @@ -555,7 +555,7 @@ public interface AlterTableStep { * Add a DROP CONSTRAINT clause to the ALTER TABLE * 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 DROP CONSTRAINT clause to the ALTER TABLE + * statement. + * + * @see DSL#constraint(String) + */ + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) AlterTableFinalStep dropConstraint(Name constraint); + + /** + * Add a DROP CONSTRAINT clause to the ALTER TABLE + * statement. + * + * @see DSL#constraint(String) + */ + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) + AlterTableFinalStep dropConstraint(String constraint); + /** * Add a DROP CONSTRAINT clause to the ALTER TABLE * 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 DROP CONSTRAINT clause to the ALTER TABLE + * statement. + * + * @see DSL#constraint(String) + */ + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + AlterTableFinalStep dropForeignKey(Name constraint); + + /** + * Add a DROP CONSTRAINT clause to the ALTER TABLE + * statement. + * + * @see DSL#constraint(String) + */ + @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + AlterTableFinalStep dropForeignKey(String constraint); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index 92d90f5ccb..08b1c63b53 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -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 SUPPORT_RENAME_TABLE = EnumSet.of(DERBY); private static final EnumSet NO_SUPPORT_RENAME_QUALIFIED_TABLE = EnumSet.of(POSTGRES); private static final EnumSet NO_SUPPORT_ALTER_TYPE_AND_NULL = EnumSet.of(POSTGRES); + private static final EnumSet NO_SUPPORT_DROP_CONSTRAINT = EnumSet.of(MYSQL); private static final EnumSet REQUIRE_REPEAT_ADD_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL, POSTGRES); private static final EnumSet REQUIRE_REPEAT_DROP_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL, POSTGRES); @@ -228,6 +231,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements private QueryPartList> 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); diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index b3a87974c3..6de3993aa2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -176,6 +176,24 @@ final class InsertQueryImpl extends AbstractStoreQuery impl @Override public final void onConflictOnConstraint(Constraint constraint) { + onConflictOnConstraint0(constraint); + } + + @Override + public void onConflictOnConstraint(UniqueKey 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 extends AbstractStoreQuery impl } } - @Override - public void onConflictOnConstraint(UniqueKey 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; diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 6f02d09196..d297dfcc88 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -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")) {