From 7b659728fabbcdf29b5c3b8997c49df9594a4415 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 8 Dec 2020 16:57:05 +0100 Subject: [PATCH] [jOOQ/jOOQ#11061] [jOOQ/jOOQ#11070] [jOOQ/jOOQ#11091] Fix regression There needs to be a mechanism to identify the data type of a function based on its default type and/or arguments. So far, there's a weak correlation of the behaviour and whether we're calling Tools::anyNotNull or Tools::allNotNull. Further refactorings will probably invalidate this correlation --- jOOQ/src/main/java/org/jooq/impl/Nvl.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/Tools.java | 22 ++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Nvl.java b/jOOQ/src/main/java/org/jooq/impl/Nvl.java index 99a90982fa..2ff3a6ebce 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Nvl.java +++ b/jOOQ/src/main/java/org/jooq/impl/Nvl.java @@ -42,6 +42,7 @@ import static org.jooq.impl.Keywords.K_IS_NULL; import static org.jooq.impl.Names.N_IFNULL; import static org.jooq.impl.Names.N_IIF; import static org.jooq.impl.Names.N_NVL; +import static org.jooq.impl.Tools.anyNotNull; import org.jooq.Context; import org.jooq.Field; @@ -60,7 +61,7 @@ final class Nvl extends AbstractField { private final Field arg2; Nvl(Field arg1, Field arg2) { - super(N_NVL, Tools.anyNotNull(arg1.getDataType(), arg1, arg2)); + super(N_NVL, anyNotNull(arg1.getDataType(), arg1, arg2)); this.arg1 = arg1; this.arg2 = arg2; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 2f36ec80f8..b85f66b190 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5900,24 +5900,24 @@ final class Tools { } private static final DataType dataType(Field field) { - return dataType(OTHER, field); + return dataType(OTHER, field, false); } @SuppressWarnings("unchecked") - private static final DataType dataType(DataType defaultType, Field field) { + private static final DataType dataType(DataType defaultType, Field field, boolean preferDefault) { return field == null ? defaultType - : field.getType() != defaultType.getType() + : preferDefault && field.getType() != defaultType.getType() ? defaultType.nullable(field.getDataType().nullable()) : (DataType) field.getDataType(); } static final DataType allNotNull(DataType defaultType, Field f1) { - return dataType(defaultType, f1); + return dataType(defaultType, f1, true); } static final DataType allNotNull(DataType defaultType, Field f1, Field f2) { - DataType result = dataType(defaultType, f1); + DataType result = dataType(defaultType, f1, true); if (result.nullable()) return result; @@ -5928,7 +5928,7 @@ final class Tools { } static final DataType allNotNull(DataType defaultType, Field f1, Field f2, Field f3) { - DataType result = dataType(defaultType, f1); + DataType result = dataType(defaultType, f1, true); if (result.nullable()) return result; @@ -5941,7 +5941,7 @@ final class Tools { } static final DataType allNotNull(DataType defaultType, Field... fields) { - DataType result = dataType(defaultType, isEmpty(fields) ? null : fields[0]); + DataType result = dataType(defaultType, isEmpty(fields) ? null : fields[0], true); if (result.nullable()) return result; @@ -5954,11 +5954,11 @@ final class Tools { } static final DataType anyNotNull(DataType defaultType, Field f1) { - return dataType(defaultType, f1); + return dataType(defaultType, f1, false); } static final DataType anyNotNull(DataType defaultType, Field f1, Field f2) { - DataType result = dataType(defaultType, f1); + DataType result = dataType(defaultType, f1, false); if (!result.nullable()) return result; @@ -5969,7 +5969,7 @@ final class Tools { } static final DataType anyNotNull(DataType defaultType, Field f1, Field f2, Field f3) { - DataType result = dataType(defaultType, f1); + DataType result = dataType(defaultType, f1, false); if (!result.nullable()) return result; @@ -5982,7 +5982,7 @@ final class Tools { } static final DataType anyNotNull(DataType defaultType, Field... fields) { - DataType result = dataType(defaultType, isEmpty(fields) ? null : fields[0]); + DataType result = dataType(defaultType, isEmpty(fields) ? null : fields[0], false); if (!result.nullable()) return result;