From 84ad560d09d2d12e45453cbcbc0d2ee17a91e7ac Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 25 Jun 2024 08:50:19 +0200 Subject: [PATCH] [jOOQ/jOOQ#16853] MySQL error "BLOB, TEXT, GEOMETRY or JSON column can't have a default value" when running DDL from generated code --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 26 +++++++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 156a9f0077..c149367a22 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -27270,6 +27270,32 @@ public class DSL { + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 3372a689f8..7e52f9a7bc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -1210,6 +1210,7 @@ final class Tools { static final Set NO_SUPPORT_TIMESTAMP_PRECISION = SQLDialect.supportedBy(DERBY); static final Set DEFAULT_TIMESTAMP_NOT_NULL = SQLDialect.supportedBy(MARIADB); static final Set REQUIRES_PARENTHESISED_DEFAULT = SQLDialect.supportedBy(SQLITE); + static final Set REQUIRES_PARENTHESISED_DEFAULT_FOR_LOBS = SQLDialect.supportedBy(MYSQL); static final Set NO_SUPPORT_DEFAULT_DATETIME_LITERAL_PREFIX = SQLDialect.supportedBy(MARIADB, MYSQL); @@ -5961,6 +5962,10 @@ final class Tools { if (REQUIRES_PARENTHESISED_DEFAULT.contains(ctx.dialect())) ctx.sql('(').visit(v).sql(')'); + // [#16853] MySQL LOB types can't have defaults. Except if we parenthesise them, then they can o_O + else if (REQUIRES_PARENTHESISED_DEFAULT_FOR_LOBS.contains(ctx.dialect()) && (type.isLob() || type.isJSON() || type.isSpatial())) + ctx.sql('(').visit(v).sql(')'); + // [#16498] Special cases where the standard datetime literal prefix needs to be omitted // See: https://bugs.mysql.com/bug.php?id=114450 else if (NO_SUPPORT_DEFAULT_DATETIME_LITERAL_PREFIX.contains(ctx.dialect()) && type.isDateTime())