From f7e2229f53d063ddb3e2377de6ff18f64f75b212 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 9 Dec 2019 12:20:52 +0100 Subject: [PATCH] [jOOQ/jOOQ#9382] Added DDL interpretation support --- .../java/org/jooq/impl/DDLInterpreter.java | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java index c0cf1e3161..e78a5e9e26 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java @@ -551,15 +551,37 @@ final class DDLInterpreter { dropColumns(existing, fields, query.$dropCascade()); } - else if (query.$dropConstraint() != null) { + else if (query.$dropConstraint() != null) dropConstraint: { ConstraintImpl impl = (ConstraintImpl) query.$dropConstraint(); - removal: { + if (impl.getUnqualifiedName().empty()) { + if (impl.$foreignKey() != null) { + throw new DataDefinitionException("Cannot drop unnamed foreign key"); + } + else if (impl.$check() != null) { + throw new DataDefinitionException("Cannot drop unnamed check constraint"); + } + else if (impl.$unique() != null) { + Iterator uks = existing.uniqueKeys.iterator(); + + while (uks.hasNext()) { + MutableUniqueKey key = uks.next(); + + if (key.fieldsEquals(impl.$unique())) { + cascade(key, null, query.$dropCascade()); + uks.remove(); + break dropConstraint; + } + } + } + } + + else { Iterator fks = existing.foreignKeys.iterator(); while (fks.hasNext()) { if (fks.next().nameEquals((UnqualifiedName) impl.getUnqualifiedName())) { fks.remove(); - break removal; + break dropConstraint; } } @@ -572,7 +594,7 @@ final class DDLInterpreter { if (key.nameEquals((UnqualifiedName) impl.getUnqualifiedName())) { cascade(key, null, query.$dropCascade()); uks.remove(); - break removal; + break dropConstraint; } } @@ -583,7 +605,7 @@ final class DDLInterpreter { if (check.nameEquals((UnqualifiedName) impl.getUnqualifiedName())) { chks.remove(); - break removal; + break dropConstraint; } } @@ -591,14 +613,14 @@ final class DDLInterpreter { if (existing.primaryKey.nameEquals((UnqualifiedName) impl.getUnqualifiedName())) { cascade(existing.primaryKey, null, query.$dropCascade()); existing.primaryKey = null; - break removal; + break dropConstraint; } } } - - if (!query.$ifExistsConstraint()) - throw constraintNotExists(query.$dropConstraint()); } + + if (!query.$ifExistsConstraint()) + throw constraintNotExists(query.$dropConstraint()); } else if (query.$dropConstraintType() == PRIMARY_KEY) { if (existing.primaryKey != null) @@ -1676,6 +1698,17 @@ final class DDLInterpreter { final MutableNamed parent() { return keyTable; } + + final boolean fieldsEquals(Field[] fields) { + if (keyFields.size() != fields.length) + return false; + + for (int i = 0; i < keyFields.size(); i++) + if (!keyFields.get(i).nameEquals((UnqualifiedName) fields[i].getUnqualifiedName())) + return false; + + return true; + } } private final class MutableCheck extends MutableNamed {