From 0e63ae8064f881638273af2fbcb92d704624bab7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 19 Aug 2019 11:40:55 +0200 Subject: [PATCH] [jOOQ/jOOQ#9059] DSLContext.ddl(Catalog) does not correctly create cross schema foreign key constraints. --- jOOQ/src/main/java/org/jooq/impl/DDL.java | 63 +++++++++++---------- jOOQ/src/main/java/org/jooq/impl/Tools.java | 1 + 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DDL.java b/jOOQ/src/main/java/org/jooq/impl/DDL.java index 374b3ca222..f1087f4c5f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDL.java @@ -46,7 +46,6 @@ import static org.jooq.DDLFlag.UNIQUE; import static org.jooq.impl.DSL.constraint; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -175,55 +174,57 @@ final class DDL { return result; } - final Queries queries(Schema schema) { + final Queries queries(Schema... schemas) { List queries = new ArrayList<>(); - if (configuration.flags().contains(SCHEMA) && !StringUtils.isBlank(schema.getName())) - if (configuration.createSchemaIfNotExists()) - queries.add(ctx.createSchemaIfNotExists(schema.getName())); - else - queries.add(ctx.createSchema(schema.getName())); + for (Schema schema : schemas) + if (configuration.flags().contains(SCHEMA) && !StringUtils.isBlank(schema.getName())) + if (configuration.createSchemaIfNotExists()) + queries.add(ctx.createSchemaIfNotExists(schema.getName())); + else + queries.add(ctx.createSchema(schema.getName())); if (configuration.flags().contains(TABLE)) { - for (Table table : schema.getTables()) { - List constraints = new ArrayList<>(); + for (Schema schema : schemas) { + for (Table table : schema.getTables()) { + List constraints = new ArrayList<>(); - constraints.addAll(primaryKeys(table)); - constraints.addAll(uniqueKeys(table)); + constraints.addAll(primaryKeys(table)); + constraints.addAll(uniqueKeys(table)); - queries.add(createTable(table, constraints)); + queries.add(createTable(table, constraints)); + } } } else { - if (configuration.flags().contains(PRIMARY_KEY)) - for (Table table : schema.getTables()) - for (Constraint constraint : primaryKeys(table)) - queries.add(ctx.alterTable(table).add(constraint)); + for (Schema schema : schemas) { + if (configuration.flags().contains(PRIMARY_KEY)) + for (Table table : schema.getTables()) + for (Constraint constraint : primaryKeys(table)) + queries.add(ctx.alterTable(table).add(constraint)); - if (configuration.flags().contains(UNIQUE)) - for (Table table : schema.getTables()) - for (Constraint constraint : uniqueKeys(table)) - queries.add(ctx.alterTable(table).add(constraint)); + if (configuration.flags().contains(UNIQUE)) + for (Table table : schema.getTables()) + for (Constraint constraint : uniqueKeys(table)) + queries.add(ctx.alterTable(table).add(constraint)); + } } if (configuration.flags().contains(FOREIGN_KEY)) - for (Table table : schema.getTables()) - for (Constraint constraint : foreignKeys(table)) - queries.add(ctx.alterTable(table).add(constraint)); + for (Schema schema : schemas) + for (Table table : schema.getTables()) + for (Constraint constraint : foreignKeys(table)) + queries.add(ctx.alterTable(table).add(constraint)); if (configuration.flags().contains(COMMENT)) - for (Table table : schema.getTables()) - queries.addAll(commentOn(table)); + for (Schema schema : schemas) + for (Table table : schema.getTables()) + queries.addAll(commentOn(table)); return ctx.queries(queries); } final Queries queries(Catalog catalog) { - List queries = new ArrayList<>(); - - for (Schema schema : catalog.getSchemas()) - queries.addAll(Arrays.asList(queries(schema).queries())); - - return ctx.queries(queries); + return queries(catalog.getSchemas().toArray(Tools.EMPTY_SCHEMA)); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 3eb64fde96..47e6f7a4ee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -296,6 +296,7 @@ final class Tools { static final QueryPart[] EMPTY_QUERYPART = {}; static final Record[] EMPTY_RECORD = {}; static final RowN[] EMPTY_ROWN = {}; + static final Schema[] EMPTY_SCHEMA = {}; static final SelectFieldOrAsterisk[] EMPTY_SELECT_FIELD_OR_ASTERISK = {}; static final SortField[] EMPTY_SORTFIELD = {}; static final String[] EMPTY_STRING = {};