From 2203d53b5b26489752767783b8fd7c6871cbc545 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 8 Sep 2020 14:38:26 +0200 Subject: [PATCH] [jOOQ/jOOQ#10602] Missing NOT NULL constraint in generated DDL: MySQL --- .../java/org/jooq/impl/CreateTableImpl.java | 72 ++++++++++++------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index 10efa827dd..5b416f985a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -120,6 +120,7 @@ import org.jooq.EnumType; import org.jooq.Field; import org.jooq.Index; import org.jooq.Name; +import org.jooq.Nullability; // ... import org.jooq.QueryPart; import org.jooq.Record; @@ -141,35 +142,36 @@ final class CreateTableImpl extends AbstractRowCountQuery implements /** * Generated UID */ - private static final long serialVersionUID = 8904572826501186329L; - private static final Set NO_SUPPORT_IF_NOT_EXISTS = SQLDialect.supportedBy(DERBY, FIREBIRD); - private static final Set NO_SUPPORT_WITH_DATA = SQLDialect.supportedBy(H2, MARIADB, MYSQL, SQLITE); - private static final Set NO_SUPPORT_CTAS_COLUMN_NAMES = SQLDialect.supportedBy(H2); - private static final Set EMULATE_INDEXES_IN_BLOCK = SQLDialect.supportedBy(FIREBIRD, POSTGRES); - private static final Set EMULATE_SOME_ENUM_TYPES_AS_CHECK = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB, POSTGRES, SQLITE); - private static final Set EMULATE_STORED_ENUM_TYPES_AS_CHECK = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB, SQLITE); - private static final Set REQUIRES_WITH_DATA = SQLDialect.supportedBy(HSQLDB); - private static final Set WRAP_SELECT_IN_PARENS = SQLDialect.supportedBy(HSQLDB); - private static final Set SUPPORT_TEMPORARY = SQLDialect.supportedBy(MARIADB, MYSQL, POSTGRES); - private static final Set EMULATE_COMMENT_IN_BLOCK = SQLDialect.supportedBy(FIREBIRD, POSTGRES); - private static final Set REQUIRE_EXECUTE_IMMEDIATE = SQLDialect.supportedBy(FIREBIRD); + private static final long serialVersionUID = 8904572826501186329L; + private static final Set NO_SUPPORT_IF_NOT_EXISTS = SQLDialect.supportedBy(DERBY, FIREBIRD); + private static final Set NO_SUPPORT_WITH_DATA = SQLDialect.supportedBy(H2, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_CTAS_COLUMN_NAMES = SQLDialect.supportedBy(H2); + private static final Set EMULATE_INDEXES_IN_BLOCK = SQLDialect.supportedBy(FIREBIRD, POSTGRES); + private static final Set EMULATE_SOME_ENUM_TYPES_AS_CHECK = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB, POSTGRES, SQLITE); + private static final Set EMULATE_STORED_ENUM_TYPES_AS_CHECK = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB, SQLITE); + private static final Set REQUIRES_WITH_DATA = SQLDialect.supportedBy(HSQLDB); + private static final Set WRAP_SELECT_IN_PARENS = SQLDialect.supportedBy(HSQLDB); + private static final Set SUPPORT_TEMPORARY = SQLDialect.supportedBy(MARIADB, MYSQL, POSTGRES); + private static final Set EMULATE_COMMENT_IN_BLOCK = SQLDialect.supportedBy(FIREBIRD, POSTGRES); + private static final Set REQUIRE_EXECUTE_IMMEDIATE = SQLDialect.supportedBy(FIREBIRD); + private static final Set NO_SUPPORT_NULLABLE_PRIMARY_KEY = SQLDialect.supportedBy(MYSQL); - private final Table table; - private Select select; - private Boolean withData; - private final List> columnFields; - private final List> columnTypes; - private final List constraints; - private final List indexes; - private final boolean temporary; - private final boolean ifNotExists; - private OnCommit onCommit; - private Comment comment; - private SQL storage; + private final Table table; + private Select select; + private Boolean withData; + private final List> columnFields; + private final List> columnTypes; + private final List constraints; + private final List indexes; + private final boolean temporary; + private final boolean ifNotExists; + private OnCommit onCommit; + private Comment comment; + private SQL storage; CreateTableImpl(Configuration configuration, Table table, boolean temporary, boolean ifNotExists) { super(configuration); @@ -469,7 +471,7 @@ final class CreateTableImpl extends AbstractRowCountQuery implements ctx.qualify(false); for (int i = 0; i < columnFields.size(); i++) { - DataType type = columnTypes.get(i); + DataType type = columnType(ctx, i); if (identity == null && type.identity()) identity = columnFields.get(i); @@ -549,6 +551,26 @@ final class CreateTableImpl extends AbstractRowCountQuery implements } } + private final DataType columnType(Context ctx, int i) { + DataType type = columnTypes.get(i); + + if (NO_SUPPORT_NULLABLE_PRIMARY_KEY.contains(ctx.dialect()) && type.nullability() == Nullability.DEFAULT && isPrimaryKey(i)) + type = type.nullable(false); + + return type; + } + + private final boolean isPrimaryKey(int i) { + for (Constraint constraint : constraints) + if (constraint instanceof ConstraintImpl) + if (((ConstraintImpl) constraint).$primaryKey() != null) + for (Field field : ((ConstraintImpl) constraint).$primaryKey()) + if (field.equals(columnFields.get(i))) + return true; + + return false; + } + private final boolean matchingPrimaryKey(Constraint constraint, Field identity) { if (constraint instanceof ConstraintImpl) return ((ConstraintImpl) constraint).matchingPrimaryKey(identity);