From 72a0010df507127bfabb1b9393c64c076e8baac2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 18 Feb 2022 10:25:55 +0100 Subject: [PATCH] [jOOQ/jOOQ#13094] Throw an exception when calling ConvertedDataType.getArrayDataType() when the type has a custom Binding --- jOOQ/src/main/java/org/jooq/DataType.java | 23 ++++++++++++++++++- .../java/org/jooq/impl/ConvertedDataType.java | 7 +++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index 15a1ceedfd..64d68fd946 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -77,6 +77,7 @@ import java.util.List; import java.util.function.Function; import org.jooq.Converters.UnknownType; +import org.jooq.exception.DataAccessException; import org.jooq.exception.DataTypeException; import org.jooq.impl.DSL; import org.jooq.impl.QOM.GenerationOption; @@ -176,9 +177,29 @@ public interface DataType extends Named { /** * Retrieve the data type for an ARRAY of this data type. + *

+ * Built-in data types, as well as custom data types that have a custom + * {@link #getConverter()} can be translated to array data types using + * {@link Converter#forArrays()}. Data types with custom + * {@link #getBinding()} cannot be translated to an array data type. Use + * this idiom, instead: + *

+ *

+     * // Doesn't work
+     * DataType t1 =
+     *   SQLDataType.INTEGER.asConvertedDataType(binding).getArrayDataType();
+     *
+     * // Works
+     * DataType t2 =
+     *   SQLDataType.INTEGER.getArrayDataType().asConvertedDataType(arrayBinding);
+     * 
+ * + * @throws DataTypeException When this data type has a custom + * {@link #getBinding()}, which cannot be automatically + * translated to an array {@link Binding}. */ @NotNull - DataType getArrayDataType(); + DataType getArrayDataType() throws DataTypeException; /** * Retrieve the Java component type if this is an ARRAY type, or diff --git a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java index 27d36edc2c..dd50cca622 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java @@ -53,6 +53,8 @@ import org.jooq.Record; import org.jooq.Result; import org.jooq.Row; import org.jooq.SQLDialect; +import org.jooq.exception.DataTypeException; +import org.jooq.impl.DefaultBinding.InternalBinding; import org.jooq.impl.QOM.GenerationOption; import org.jetbrains.annotations.NotNull; @@ -136,7 +138,10 @@ final class ConvertedDataType extends AbstractDataTypeX { @Override public final DataType getArrayDataType() { - return delegate.getArrayDataType().asConvertedDataType(Converters.forArrays(binding.converter())); + if (getBinding() instanceof InternalBinding) + return delegate.getArrayDataType().asConvertedDataType(Converters.forArrays(binding.converter())); + else + throw new DataTypeException("Cannot create array data types from custom data types with custom bindings."); } @Override