From 90eccecf5618d03fbfeddb21d62026c5d936224a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 3 Jul 2025 09:03:46 +0200 Subject: [PATCH] [jOOQ/jOOQ#18707] MetaDataFieldProvider debug logs warnings about Nullable(xyz) types not being supported for ClickHouse --- .../java/org/jooq/impl/DefaultDataType.java | 19 +++++++++++++++++-- .../main/java/org/jooq/impl/SQLDataTypes.java | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index db6375a914..ee00033177 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -165,6 +165,11 @@ public class DefaultDataType extends AbstractDataTypeX { */ private static final Pattern P_NORMALISE = Pattern.compile("\"|\\.|\\s|\\(\\w+(\\s*,\\s*\\w+)*\\)|(NOT\\s*NULL)?"); + /** + * A pattern for data type name normalisation. + */ + private static final Pattern P_NULLABLE = Pattern.compile("^Nullable\\((.*)\\)$"); + /** * A pattern to be used to replace all precision, scale, and length * information. @@ -412,7 +417,7 @@ public class DefaultDataType extends AbstractDataTypeX { // [#3225] Avoid normalisation if not necessary if (!TYPES_BY_NAME[ordinal].containsKey(typeName.toUpperCase())) - TYPES_BY_NAME[ordinal].putIfAbsent(DefaultDataType.normalise(typeName), this); + TYPES_BY_NAME[ordinal].putIfAbsent(DefaultDataType.normalise(dialect, typeName), this); TYPES_BY_TYPE[ordinal].putIfAbsent(type, this); if (sqlDataType != null) @@ -708,7 +713,7 @@ public class DefaultDataType extends AbstractDataTypeX { // [#3225] Normalise only if necessary if (result == null) { - result = TYPES_BY_NAME[ordinal].get(normalised = DefaultDataType.normalise(typeName)); + result = TYPES_BY_NAME[ordinal].get(normalised = DefaultDataType.normalise(dialect, typeName)); // UDT data types and built-in array data types are registered using DEFAULT if (result == null) { @@ -1052,6 +1057,16 @@ public class DefaultDataType extends AbstractDataTypeX { return P_NORMALISE.matcher(typeName.toUpperCase()).replaceAll(""); } + /** + * @return The type name without all special characters and white spaces + */ + static final String normalise(SQLDialect dialect, String typeName) { + if (dialect != null && dialect.family() == CLICKHOUSE && typeName.startsWith("Nullable(")) + typeName = P_NULLABLE.matcher(typeName).replaceFirst(r -> r.group(1)); + + return normalise(typeName); + } + /** * Convert a type name (using precision and scale) into a Java class */ diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLDataTypes.java b/jOOQ/src/main/java/org/jooq/impl/SQLDataTypes.java index 9791a1f36e..830d53b295 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLDataTypes.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLDataTypes.java @@ -191,6 +191,12 @@ final class SQLDataTypes { static final DataType UINT32 = new BuiltInDataType<>(FAMILY, SQLDataType.INTEGERUNSIGNED, "UInt32"); static final DataType UINT64 = new BuiltInDataType<>(FAMILY, SQLDataType.BIGINTUNSIGNED, "UInt64"); + // ------------------------------------------------------------------------- + // Dialect-specific data types and synonyms thereof + // ------------------------------------------------------------------------- + + static final DataType NOTHING = new BuiltInDataType<>(FAMILY, SQLDataType.OTHER, "Nothing"); + // ------------------------------------------------------------------------- // Compatibility types for supported SQLDialect.CLICKHOUSE, SQLDataTypes // -------------------------------------------------------------------------