diff --git a/jOOQ/src/main/java/org/jooq/AlterTableAlterConstraintStep.java b/jOOQ/src/main/java/org/jooq/AlterTableAlterConstraintStep.java index 0587f62daf..530d9b6b15 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableAlterConstraintStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableAlterConstraintStep.java @@ -40,52 +40,46 @@ package org.jooq; import org.jetbrains.annotations.*; +import static org.jooq.SQLDialect.*; +/** + * The step in the ALTER TABLE DSL used to ALTER + * constraints. + *

+ *

Referencing XYZ*Step types directly from client code

+ *

+ * It is usually not recommended to reference any XYZ*Step types + * directly from client code, or assign them to local variables. When writing + * dynamic SQL, creating a statement's components dynamically, and passing them + * to the DSL API statically is usually a better choice. See the manual's + * section about dynamic SQL for details: https://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql. + *

+ * Drawbacks of referencing the XYZ*Step types directly: + *

+ * + * @author Lukas Eder + */ +public interface AlterTableAlterConstraintStep { + /** + * Add the ENFORCED clause to the constraint. + */ + @NotNull + @Support({ MYSQL }) + AlterTableFinalStep enforced(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /** + * Add the NOT ENFORCED clause to the constraint. + */ + @NotNull + @Support({ MYSQL }) + AlterTableFinalStep notEnforced(); +} diff --git a/jOOQ/src/main/java/org/jooq/AlterTableStep.java b/jOOQ/src/main/java/org/jooq/AlterTableStep.java index 6872dedb03..c0a63e45c4 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableStep.java @@ -55,6 +55,7 @@ import static org.jooq.SQLDialect.MARIADB; // ... import static org.jooq.SQLDialect.MYSQL; // ... +// ... import static org.jooq.SQLDialect.POSTGRES; // ... // ... @@ -214,20 +215,15 @@ public interface AlterTableStep { @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) AlterTableRenameConstraintToStep renameConstraint(String oldName); - - - - - - - - - - - - - - + /** + * Add an ALTER CONSTRAINT clause to the ALTER TABLE + * statement. + *

+ * This is an alias for {@link #alterConstraint(Constraint)}. + */ + @NotNull + @Support({ MYSQL }) + AlterTableAlterConstraintStep alter(Constraint constraint); /** * Add an ALTER COLUMN clause to the ALTER TABLE @@ -283,36 +279,29 @@ public interface AlterTableStep { @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) AlterTableAlterStep alterColumn(String field); + /** + * Add an ALTER CONSTRAINT clause to the ALTER TABLE + * statement. + */ + @NotNull + @Support({ MYSQL }) + AlterTableAlterConstraintStep alterConstraint(Constraint constraint); + /** + * Add an ALTER CONSTRAINT clause to the ALTER TABLE + * statement. + */ + @NotNull + @Support({ MYSQL }) + AlterTableAlterConstraintStep alterConstraint(Name constraint); - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /** + * Add an ALTER CONSTRAINT clause to the ALTER TABLE + * statement. + */ + @NotNull + @Support({ MYSQL }) + AlterTableAlterConstraintStep alterConstraint(String constraint); /** * Add an ADD COLUMN clause to the ALTER TABLE diff --git a/jOOQ/src/main/java/org/jooq/ConstraintEnforcementStep.java b/jOOQ/src/main/java/org/jooq/ConstraintEnforcementStep.java index 6384d5aeec..2f46f09585 100644 --- a/jOOQ/src/main/java/org/jooq/ConstraintEnforcementStep.java +++ b/jOOQ/src/main/java/org/jooq/ConstraintEnforcementStep.java @@ -37,12 +37,12 @@ */ package org.jooq; -import org.jetbrains.annotations.*; - - // ... +import static org.jooq.SQLDialect.MYSQL; // ... +import org.jetbrains.annotations.NotNull; + /** * The step in the {@link Constraint} construction DSL API that allows for * adding ENFORCED and NOT ENFORCED clauses. @@ -70,23 +70,17 @@ import org.jetbrains.annotations.*; */ public interface ConstraintEnforcementStep extends ConstraintFinalStep { + /** + * Add the ENFORCED clause to the constraint. + */ + @NotNull + @Support({ MYSQL }) + ConstraintFinalStep enforced(); - - - - - - - - - - - - - - - - - - + /** + * Add the NOT ENFORCED clause to the constraint. + */ + @NotNull + @Support({ MYSQL }) + ConstraintFinalStep notEnforced(); } diff --git a/jOOQ/src/main/java/org/jooq/ConstraintTypeStep.java b/jOOQ/src/main/java/org/jooq/ConstraintTypeStep.java index 835535e0eb..a10b3d24fe 100644 --- a/jOOQ/src/main/java/org/jooq/ConstraintTypeStep.java +++ b/jOOQ/src/main/java/org/jooq/ConstraintTypeStep.java @@ -54,6 +54,7 @@ import static org.jooq.SQLDialect.HSQLDB; // ... // ... import static org.jooq.SQLDialect.MARIADB; +import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; @@ -621,6 +622,6 @@ public interface ConstraintTypeStep extends ConstraintFinalStep { * Create a CHECK constraint. */ @NotNull - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES, SQLITE }) + @Support ConstraintEnforcementStep check(Condition condition); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractKey.java b/jOOQ/src/main/java/org/jooq/impl/AbstractKey.java index 471387a25f..fccc3d5b95 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractKey.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractKey.java @@ -110,12 +110,7 @@ abstract class AbstractKey extends AbstractNamed implements Ke } private final Constraint enforced(ConstraintEnforcementStep key) { - - - - - - return key; + return enforced() ? key : key.notEnforced(); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index ce0a555717..c6beb0b1f0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -165,7 +165,7 @@ import java.util.List; import java.util.Set; import org.jooq.AlterTableAddStep; -// ... +import org.jooq.AlterTableAlterConstraintStep; import org.jooq.AlterTableAlterStep; import org.jooq.AlterTableDropStep; import org.jooq.AlterTableFinalStep; @@ -205,9 +205,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements AlterTableAddStep, AlterTableDropStep, AlterTableAlterStep, - - - + AlterTableAlterConstraintStep, AlterTableUsingIndexStep, AlterTableRenameColumnToStep, AlterTableRenameIndexToStep, @@ -266,10 +264,8 @@ final class AlterTableImpl extends AbstractRowCountQuery implements - - - - + private Constraint alterConstraint; + private boolean alterConstraintEnforced; private Field alterColumn; private Nullability alterColumnNullability; private DataType alterColumnType; @@ -308,12 +304,8 @@ final class AlterTableImpl extends AbstractRowCountQuery implements final DataType $alterColumnType() { return alterColumnType; } final Field $alterColumnDefault() { return alterColumnDefault; } final boolean $alterColumnDropDefault() { return alterColumnDropDefault; } - - - - - - + final Constraint $alterConstraint() { return alterConstraint; } + final boolean $alterConstraintEnforced() { return alterConstraintEnforced; } final Table $renameTo() { return renameTo; } final Field $renameColumn() { return renameColumn; } final Field $renameColumnTo() { return renameColumnTo; } @@ -652,42 +644,38 @@ final class AlterTableImpl extends AbstractRowCountQuery implements return this; } + @Override + public final AlterTableImpl alter(Constraint constraint) { + return alterConstraint(constraint); + } + @Override + public final AlterTableImpl alterConstraint(Name constraint) { + return alterConstraint(constraint(constraint)); + } + @Override + public final AlterTableImpl alterConstraint(String constraint) { + return alterConstraint(constraint(constraint)); + } + @Override + public final AlterTableImpl alterConstraint(Constraint constraint) { + alterConstraint = constraint; + return this; + } + @Override + public final AlterTableImpl enforced() { + alterConstraintEnforced = true; + return this; + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @Override + public final AlterTableImpl notEnforced() { + alterConstraintEnforced = false; + return this; + } @Override public final AlterTableImpl set(DataType type) { @@ -1397,28 +1385,28 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.end(ALTER_TABLE_ADD); } + else if (alterConstraint != null) { + ctx.start(ALTER_TABLE_ALTER); + ctx.data(DATA_CONSTRAINT_REFERENCE, true); + + switch (family) { + default: + ctx.visit(K_ALTER); + break; + } + ctx.sql(' ').visit(K_CONSTRAINT).sql(' ').visit(alterConstraint); + ConstraintImpl.acceptEnforced(ctx, alterConstraintEnforced); - - - - - - - - - - - - - - + ctx.data().remove(DATA_CONSTRAINT_REFERENCE); + ctx.end(ALTER_TABLE_ALTER); + } else if (alterColumn != null) { ctx.start(ALTER_TABLE_ALTER); diff --git a/jOOQ/src/main/java/org/jooq/impl/CheckImpl.java b/jOOQ/src/main/java/org/jooq/impl/CheckImpl.java index a7011a5118..0185ca76f8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CheckImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CheckImpl.java @@ -88,12 +88,7 @@ final class CheckImpl extends AbstractNamed implements Check ctx, boolean enforced) { + switch (ctx.family()) { @@ -325,16 +319,16 @@ implements + case MYSQL: + default: + if (enforced) + ctx.sql(' ').visit(K_ENFORCED); + else + ctx.sql(' ').visit(K_NOT).sql(' ').visit(K_ENFORCED); - - - - - - - - - + break; + } + } // ------------------------------------------------------------------------ // XXX: Constraint API @@ -1150,21 +1144,17 @@ implements + @Override + public final ConstraintImpl enforced() { + this.enforced = true; + return this; + } - - - - - - - - - - - - - - + @Override + public final ConstraintImpl notEnforced() { + this.enforced = false; + return this; + } enum Action { NO_ACTION("no action"), diff --git a/jOOQ/src/main/java/org/jooq/impl/DDL.java b/jOOQ/src/main/java/org/jooq/impl/DDL.java index 7b7ffecfd3..3435c11536 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDL.java @@ -446,11 +446,6 @@ final class DDL { } private final Constraint enforced(ConstraintEnforcementStep check, boolean enforced) { - - - - - - return check; + return enforced ? check : check.notEnforced(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index a3b827a395..6151c9caaa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -7059,7 +7059,7 @@ public class DSL { * Create an unnamed (system named) CHECK constraint. */ @NotNull - @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE }) + @Support public static ConstraintEnforcementStep check(Condition condition) { return constraint().check(condition); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java index 47db496780..1d42400d68 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java @@ -384,9 +384,8 @@ final class Interpreter { if (mu == null) throw primaryKeyNotExists(impl.$referencesTable()); - boolean enforced = true ; mt.foreignKeys.add(new MutableForeignKey( - (UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, impl.$onDelete(), impl.$onUpdate(), enforced + (UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, impl.$onDelete(), impl.$onUpdate(), impl.$enforced() )); } @@ -592,11 +591,9 @@ final class Interpreter { else mc.name((UnqualifiedName) query.$renameConstraintTo().getUnqualifiedName()); } - - - - - + else if (query.$alterConstraint() != null) { + existing.constraint(query.$alterConstraint(), true).enforced = query.$alterConstraintEnforced(); + } else if (query.$dropColumns() != null) { List fields = existing.fields(query.$dropColumns().toArray(EMPTY_FIELD), false); @@ -746,18 +743,17 @@ final class Interpreter { if (!impl.getUnqualifiedName().empty() && existing.constraint(impl) != null) throw alreadyExists(impl); - boolean enforced = true ; if (impl.$primaryKey() != null) if (existing.primaryKey != null) throw alreadyExists(impl); else - existing.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$primaryKey(), true), enforced); + existing.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$primaryKey(), true), impl.$enforced()); else if (impl.$unique() != null) - existing.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$unique(), true), enforced)); + existing.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$unique(), true), impl.$enforced())); else if (impl.$foreignKey() != null) addForeignKey(existing, impl); else if (impl.$check() != null) - existing.checks.add(new MutableCheck((UnqualifiedName) impl.getUnqualifiedName(), existing, impl.$check(), enforced)); + existing.checks.add(new MutableCheck((UnqualifiedName) impl.getUnqualifiedName(), existing, impl.$check(), impl.$enforced())); else throw unsupportedQuery(query); } @@ -1985,7 +1981,7 @@ final class Interpreter { (UnqualifiedName) constraint.getUnqualifiedName(), null, ((ConstraintImpl) constraint).$check(), - true + ((ConstraintImpl) constraint).$enforced() ); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 4230898ee5..d7962b61b7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -4197,18 +4197,12 @@ final class ParserImpl implements Parser { if (!deferrable) parseConstraintDeferrableIf(ctx); - if ((parseKeywordIf(ctx, "ENABLE") || parseKeywordIf(ctx, "ENFORCED")) && ctx.requireProEdition()) - - - - ; - else if ((parseKeywordIf(ctx, "DISABLE") || parseKeywordIf(ctx, "NOT ENFORCED")) && ctx.requireProEdition()) - - - - ; - - return e; + if ((parseKeywordIf(ctx, "ENABLE") || parseKeywordIf(ctx, "ENFORCED"))) + return e.enforced(); + else if ((parseKeywordIf(ctx, "DISABLE") || parseKeywordIf(ctx, "NOT ENFORCED"))) + return e.notEnforced(); + else + return e; } private static final boolean parseConstraintDeferrableIf(ParserContext ctx) {