From e137636a9e76bdd819df4043282a3fb74f5297c2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 4 Dec 2020 17:55:01 +0100 Subject: [PATCH] [jOOQ/jOOQ#11061] [jOOQ/jOOQ#11070] [jOOQ/jOOQ#11091] SUBSTRING --- .../src/main/java/org/jooq/impl/Coalesce.java | 3 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 12 ++--- jOOQ/src/main/java/org/jooq/impl/Left.java | 3 +- jOOQ/src/main/java/org/jooq/impl/Nvl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Nvl2.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Repeat.java | 3 +- jOOQ/src/main/java/org/jooq/impl/Right.java | 3 +- .../main/java/org/jooq/impl/Substring.java | 28 ++++++---- jOOQ/src/main/java/org/jooq/impl/Tools.java | 52 +++++++++++-------- 9 files changed, 66 insertions(+), 42 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Coalesce.java b/jOOQ/src/main/java/org/jooq/impl/Coalesce.java index 9d8fcc9eb7..d7791b7f2e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Coalesce.java +++ b/jOOQ/src/main/java/org/jooq/impl/Coalesce.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_COALESCE; +import static org.jooq.impl.SQLDataType.OTHER; import static org.jooq.impl.Tools.anyNotNull; import org.jooq.Context; @@ -57,7 +58,7 @@ final class Coalesce extends AbstractField { @SuppressWarnings({ "unchecked", "rawtypes" }) Coalesce(Field[] fields) { - super(N_COALESCE, (DataType) anyNotNull(fields)); + super(N_COALESCE, anyNotNull((DataType) OTHER, fields[0], fields)); this.fields = (Field[]) fields; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 6175997c31..41a160f498 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -15732,7 +15732,7 @@ public class DSL { @NotNull @Support public static Field substring(Field field, int startingPosition) { - return substring(Tools.nullSafe(field), Tools.field(startingPosition)); + return substring(field, Tools.field(startingPosition)); } /** @@ -15745,7 +15745,7 @@ public class DSL { @NotNull @Support public static Field substring(Field field, Field startingPosition) { - return new Substring(Tools.nullSafe(field), Tools.nullSafe(startingPosition)); + return new Substring(field, startingPosition); } /** @@ -15756,7 +15756,7 @@ public class DSL { @NotNull @Support public static Field substring(Field field, int startingPosition, int length) { - return substring(Tools.nullSafe(field), Tools.field(startingPosition), Tools.field(length)); + return substring(field, Tools.field(startingPosition), Tools.field(length)); } /** @@ -15769,7 +15769,7 @@ public class DSL { @NotNull @Support public static Field substring(Field field, Field startingPosition, Field length) { - return new Substring(Tools.nullSafe(field), Tools.nullSafe(startingPosition), Tools.nullSafe(length)); + return new Substring(field, startingPosition, Tools.nullSafe(length)); } /** @@ -15780,7 +15780,7 @@ public class DSL { @NotNull @Support public static Field mid(Field field, int startingPosition, int length) { - return substring(Tools.nullSafe(field), Tools.field(startingPosition), Tools.field(length)); + return substring(field, Tools.field(startingPosition), Tools.field(length)); } /** @@ -15793,7 +15793,7 @@ public class DSL { @NotNull @Support public static Field mid(Field field, Field startingPosition, Field length) { - return substring(Tools.nullSafe(field), Tools.nullSafe(startingPosition), Tools.nullSafe(length)); + return substring(field, startingPosition, length); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Left.java b/jOOQ/src/main/java/org/jooq/impl/Left.java index 9c2e38ad7e..8e2807b229 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Left.java +++ b/jOOQ/src/main/java/org/jooq/impl/Left.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.Names.N_LEFT; +import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.allNotNull; import org.jooq.Context; @@ -58,7 +59,7 @@ final class Left extends AbstractField { private Field length; Left(Field field, Field length) { - super(N_LEFT, allNotNull(field, length)); + super(N_LEFT, allNotNull(VARCHAR, field, length)); this.field = field; this.length = length; diff --git a/jOOQ/src/main/java/org/jooq/impl/Nvl.java b/jOOQ/src/main/java/org/jooq/impl/Nvl.java index 957457d809..99a90982fa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Nvl.java +++ b/jOOQ/src/main/java/org/jooq/impl/Nvl.java @@ -60,7 +60,7 @@ final class Nvl extends AbstractField { private final Field arg2; Nvl(Field arg1, Field arg2) { - super(N_NVL, Tools.anyNotNull(arg1, arg2)); + super(N_NVL, Tools.anyNotNull(arg1.getDataType(), arg1, arg2)); this.arg1 = arg1; this.arg2 = arg2; diff --git a/jOOQ/src/main/java/org/jooq/impl/Nvl2.java b/jOOQ/src/main/java/org/jooq/impl/Nvl2.java index aa822f6efa..67530c7864 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Nvl2.java +++ b/jOOQ/src/main/java/org/jooq/impl/Nvl2.java @@ -58,7 +58,7 @@ final class Nvl2 extends AbstractField { private final Field arg3; Nvl2(Field arg1, Field arg2, Field arg3) { - super(N_NVL2, !arg1.getDataType().nullable() ? arg2.getDataType() : Tools.allNotNull(arg2, arg3)); + super(N_NVL2, !arg1.getDataType().nullable() ? arg2.getDataType() : Tools.allNotNull(arg2.getDataType(), arg2, arg3)); this.arg1 = arg1; this.arg2 = arg2; diff --git a/jOOQ/src/main/java/org/jooq/impl/Repeat.java b/jOOQ/src/main/java/org/jooq/impl/Repeat.java index 4a9ff27bf8..a39e8df702 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Repeat.java +++ b/jOOQ/src/main/java/org/jooq/impl/Repeat.java @@ -43,6 +43,7 @@ import static org.jooq.impl.Names.N_REPEAT; import static org.jooq.impl.Names.N_REPLACE; import static org.jooq.impl.Names.N_REPLICATE; import static org.jooq.impl.Names.N_ZEROBLOB; +import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.allNotNull; import org.jooq.Context; @@ -62,7 +63,7 @@ final class Repeat extends AbstractField { private final Field count; Repeat(Field string, Field count) { - super(N_REPEAT, allNotNull(string, count)); + super(N_REPEAT, allNotNull(VARCHAR, string, count)); this.string = string; this.count = count; diff --git a/jOOQ/src/main/java/org/jooq/impl/Right.java b/jOOQ/src/main/java/org/jooq/impl/Right.java index 620a67249b..e677c48f0b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Right.java +++ b/jOOQ/src/main/java/org/jooq/impl/Right.java @@ -41,6 +41,7 @@ import static org.jooq.impl.DSL.one; import static org.jooq.impl.Internal.iadd; import static org.jooq.impl.Internal.isub; import static org.jooq.impl.Names.N_RIGHT; +import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.allNotNull; import org.jooq.Context; @@ -60,7 +61,7 @@ final class Right extends AbstractField { private Field length; Right(Field field, Field length) { - super(N_RIGHT, allNotNull(field, length)); + super(N_RIGHT, allNotNull(VARCHAR, field, length)); this.field = field; this.length = length; diff --git a/jOOQ/src/main/java/org/jooq/impl/Substring.java b/jOOQ/src/main/java/org/jooq/impl/Substring.java index 4fdceb0eb4..04591a4f74 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Substring.java +++ b/jOOQ/src/main/java/org/jooq/impl/Substring.java @@ -43,9 +43,15 @@ import static org.jooq.impl.Keywords.K_FROM; import static org.jooq.impl.Names.N_MID; import static org.jooq.impl.Names.N_SUBSTR; import static org.jooq.impl.Names.N_SUBSTRING; +import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.impl.SQLDataType.VARCHAR; +import static org.jooq.impl.Tools.allNotNull; +import static org.jooq.impl.Tools.convertVal; +import static org.jooq.impl.Tools.nullSafe; +import static org.jooq.impl.Tools.nullableIf; import org.jooq.Context; +import org.jooq.DataType; import org.jooq.Field; import org.jooq.Name; @@ -57,22 +63,26 @@ final class Substring extends AbstractField { /** * Generated UID */ - private static final long serialVersionUID = -7273879239726265322L; + private static final long serialVersionUID = -7273879239726265322L; - private final Field field; - private final Field startingPosition; - private final Field length; + private final Field field; + private final Field startingPosition; + private final Field length; Substring(Field field, Field startingPosition) { - this(field, startingPosition, null); + super(N_SUBSTRING, allNotNull(VARCHAR, field, startingPosition)); + + this.field = nullableIf(false, nullSafe(field, VARCHAR)); + this.startingPosition = nullableIf(false, nullSafe(startingPosition, INTEGER)); + this.length = null; } Substring(Field field, Field startingPosition, Field length) { - super(N_SUBSTRING, VARCHAR); + super(N_SUBSTRING, allNotNull(VARCHAR, field, startingPosition, length)); - this.field = field; - this.startingPosition = startingPosition; - this.length = length; + this.field = nullableIf(false, nullSafe(field, VARCHAR)); + this.startingPosition = nullableIf(false, nullSafe(startingPosition, INTEGER)); + this.length = nullableIf(false, nullSafe(length, INTEGER)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 74db57b05a..2278e1476c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -301,6 +301,8 @@ import org.jooq.types.UInteger; import org.jooq.types.ULong; import org.jooq.types.UShort; +import org.jetbrains.annotations.NotNull; + /** * General internal jOOQ utilities * @@ -5897,54 +5899,57 @@ final class Tools { return result; } - static final DataType allNotNull(Field f1, Field f2) { - DataType result = f1.getDataType(); + static final DataType dataType(Field field) { + return field == null ? OTHER : field.getDataType(); + } + static final DataType allNotNull(DataType defaultType, Field f1, Field f2) { + if (f1 == null) + return defaultType.null_(); + + DataType result = f1.getDataType(); if (result.nullable()) return result; - else if (f2.getDataType().nullable()) + else if (dataType(f2).nullable()) return result.null_(); else return result; } - @SuppressWarnings({ "unchecked", "rawtypes" }) - static final DataType allNotNull(Field... fields) { - if (fields == null || fields.length == 0) - return OTHER; + static final DataType allNotNull(DataType defaultType, Field f1, Field... fields) { + if (f1 == null) + return defaultType.null_(); - DataType result = fields[0].getDataType(); + DataType result = f1.getDataType(); if (result.nullable()) return result; - for (int i = 1; i < fields.length; i++) - if (fields[i].getDataType().nullable()) + for (int i = 0; i < fields.length; i++) + if (dataType(fields[i]).nullable()) return result.null_(); return result; } - static final DataType anyNotNull(Field f1, Field f2) { - DataType result = f1.getDataType(); + static final DataType anyNotNull(DataType defaultType, Field f1, Field f2) { + DataType result = f1 == null ? defaultType : f1.getDataType(); if (!result.nullable()) return result; - else if (!f2.getDataType().nullable()) + else if (!dataType(f2).nullable()) return result.notNull(); else return result; } - static final DataType anyNotNull(Field... fields) { - if (fields == null || fields.length == 0) - return OTHER; + static final DataType anyNotNull(DataType defaultType, Field f1, Field... fields) { + DataType result = f1 == null ? defaultType : f1.getDataType(); - DataType result = fields[0].getDataType(); if (!result.nullable()) return result; - for (int i = 1; i < fields.length; i++) - if (!fields[i].getDataType().nullable()) + for (int i = 0; i < fields.length; i++) + if (!dataType(fields[i]).nullable()) return result.notNull(); return result; @@ -5958,8 +5963,13 @@ final class Tools { static final Field nullSafe(Field field, DataType type) { return field == null ? (Field) DSL.val((T) null, type) - : field instanceof Val - ? (Field) ((Val) field).convertTo(type) + : convertVal(field, type); + } + + @SuppressWarnings("unchecked") + static final Field convertVal(Field field, DataType type) { + return isVal(field) + ? (Field) extractVal(field).convertTo(type) : field; }