From f1233381bfb4ed9077f601bee8e1e44ded3a0687 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 13 Feb 2023 15:37:31 +0100 Subject: [PATCH] [jOOQ/jOOQ#14628] Missing default information on DOMAIN types that get an overridden DEFAULT by CREATE TABLE --- .../java/org/jooq/codegen/JavaGenerator.java | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 9c6ab73397..c2382d0fa6 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -9677,10 +9677,11 @@ public class JavaGenerator extends AbstractGenerator { sb.append(")"); } else if (db.getDomain(schema, u) != null) { - sb.append(getStrategy().getFullJavaIdentifier(db.getDomain(schema, u))); - sb.append(".getDataType()"); + final String sqlDataTypeRef = getStrategy().getFullJavaIdentifier(db.getDomain(schema, u)) + ".getDataType()"; + sb.append(sqlDataTypeRef); - appendTypeReferenceNullability(sb, n); + appendTypeReferenceNullability(db, out, sb, n); + appendTypeReferenceDefault(db, out, sb, d, sqlDataTypeRef); } else if (db.getUDT(schema, u) != null) { sb.append(getStrategy().getFullJavaIdentifier(db.getUDT(schema, u))); @@ -9775,7 +9776,7 @@ public class JavaGenerator extends AbstractGenerator { sb.append(sqlDataTypeRef); } - appendTypeReferenceNullability(sb, n); + appendTypeReferenceNullability(db, out, sb, n); if (dataType.identity()) sb.append(".identity(true)"); @@ -9804,47 +9805,52 @@ public class JavaGenerator extends AbstractGenerator { // [#5291] Some dialects report valid SQL expresions (e.g. PostgreSQL), others // report actual values (e.g. MySQL). - if (dataType.defaulted()) { - sb.append(".defaultValue("); + if (dataType.defaulted()) + appendTypeReferenceDefault(db, out, sb, d, sqlDataTypeRef); + } - if (asList(MYSQL).contains(db.getDialect().family())) + return sb.toString(); + } - // [#5574] While MySQL usually reports actual values, it does report - // a CURRENT_TIMESTAMP expression, inconsistently - if (d != null && d.toLowerCase(getStrategy().getTargetLocale()).startsWith("current_timestamp")) - sb.append(out.ref(DSL.class)) - .append(".field(") - .append(out.ref(DSL.class)) - .append(".raw(\"") - .append(escapeString(d)) - .append("\")"); - else - sb.append(out.ref(DSL.class)) - .append(".inline(\"") - .append(escapeString(d)) - .append("\""); - else + private final void appendTypeReferenceNullability(Database db, JavaWriter out, StringBuilder sb, boolean n) { + if (!n) + sb.append(".nullable(false)"); + } + + private final void appendTypeReferenceDefault(Database db, JavaWriter out, StringBuilder sb, String d, String sqlDataTypeRef) { + if (d != null) { + sb.append(".defaultValue("); + + if (asList(MYSQL).contains(db.getDialect().family())) + + // [#5574] While MySQL usually reports actual values, it does report + // a CURRENT_TIMESTAMP expression, inconsistently + if (d != null && d.toLowerCase(getStrategy().getTargetLocale()).startsWith("current_timestamp")) sb.append(out.ref(DSL.class)) .append(".field(") .append(out.ref(DSL.class)) .append(".raw(\"") .append(escapeString(d)) .append("\")"); + else + sb.append(out.ref(DSL.class)) + .append(".inline(\"") + .append(escapeString(d)) + .append("\""); + else + sb.append(out.ref(DSL.class)) + .append(".field(") + .append(out.ref(DSL.class)) + .append(".raw(\"") + .append(escapeString(d)) + .append("\")"); - sb.append(", ") - .append(sqlDataTypeRef) - .append(")") - .append(kotlin && dataType.getType() == Object.class ? " as Any?" : "") - .append(")"); - } + sb.append(", ") + .append(sqlDataTypeRef) + .append(")") + .append(kotlin && sqlDataTypeRef.contains(".OTHER") ? " as Any?" : "") + .append(")"); } - - return sb.toString(); - } - - private final void appendTypeReferenceNullability(StringBuilder sb, boolean n) { - if (!n) - sb.append(".nullable(false)"); } private DataType mapTypes(DataType dataType) {