From 65e58d756b5bb6c41ee6987f46c77522a390bf4c Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 19 Nov 2019 15:40:53 +0100 Subject: [PATCH] [jOOQ/jOOQ#8528] Interpret multi constraint ADD --- .../java/org/jooq/impl/DDLInterpreter.java | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java index dfa9ab8cb5..830856696c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java @@ -389,20 +389,19 @@ final class DDLInterpreter { throw objectNotTable(table); if (query.$add() != null) { - // TODO: FIRST, BEFORE, AFTER + for (FieldOrConstraint fc : query.$add()) + if (fc instanceof Field && existing.field((Field) fc) != null) + throw fieldAlreadyExists((Field) fc); + else if (fc instanceof Constraint && existing.constraint((Constraint) fc) != null) + throw constraintAlreadyExists((Constraint) fc); for (FieldOrConstraint fc : query.$add()) if (fc instanceof Field) - if (existing.field((Field) fc) != null) - throw fieldAlreadyExists((Field) fc); - for (FieldOrConstraint fc : query.$add()) - if (fc instanceof Field) + // TODO: FIRST, BEFORE, AFTER existing.fields.add(new MutableField((UnqualifiedName) fc.getUnqualifiedName(), existing, ((Field) fc).getDataType())); - - // TODO: Implement this -// else if (fc instanceof Constraint) -// ; + else if (fc instanceof Constraint) + addConstraint(query, (ConstraintImpl) fc, schema, existing); else throw unsupportedQuery(query); } @@ -423,25 +422,7 @@ final class DDLInterpreter { existing.fields.add(new MutableField((UnqualifiedName) query.$addColumn().getUnqualifiedName(), existing, query.$addColumnType())); } else if (query.$addConstraint() != null) { - ConstraintImpl impl = (ConstraintImpl) query.$addConstraint(); - - if (existing.constraint(impl) != null) - throw constraintAlreadyExists(impl); - else if (impl.$primaryKey() != null) - - // TODO: More nuanced error messages would be good, in general. - if (existing.primaryKey != null) - throw constraintAlreadyExists(impl); - else - existing.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$primaryKey(), true)); - else if (impl.$unique() != null) - existing.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$unique(), true))); - else if (impl.$foreignKey() != null) - addForeignKey(schema, existing, impl); - else if (impl.$check() != null) - existing.checks.add(new MutableCheck((UnqualifiedName) impl.getUnqualifiedName(), existing, impl.$check())); - else - throw unsupportedQuery(query); + addConstraint(query, (ConstraintImpl) query.$addConstraint(), schema, existing); } else if (query.$alterColumn() != null) { MutableField existingField = existing.field(query.$alterColumn()); @@ -553,6 +534,26 @@ final class DDLInterpreter { throw unsupportedQuery(query); } + private final void addConstraint(Query query, ConstraintImpl impl, MutableSchema schema, MutableTable existing) { + if (existing.constraint(impl) != null) + throw constraintAlreadyExists(impl); + else if (impl.$primaryKey() != null) + + // TODO: More nuanced error messages would be good, in general. + if (existing.primaryKey != null) + throw constraintAlreadyExists(impl); + else + existing.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$primaryKey(), true)); + else if (impl.$unique() != null) + existing.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$unique(), true))); + else if (impl.$foreignKey() != null) + addForeignKey(schema, existing, impl); + else if (impl.$check() != null) + existing.checks.add(new MutableCheck((UnqualifiedName) impl.getUnqualifiedName(), existing, impl.$check())); + else + throw unsupportedQuery(query); + } + private final int indexOrFail(MutableTable existing, Field field) { int result = -1;