From 58459f1a096969da4fdb4cc513a105157ad3fc66 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 20 Sep 2016 15:23:44 +0200 Subject: [PATCH] [#5540] Bad predicate generated for INSERT .. ON DUPLICATE KEY IGNORE emulation in PostgreSQL 9.3 dialect --- .../java/org/jooq/impl/AbstractField.java | 60 +++++++++---------- .../java/org/jooq/impl/BetweenCondition.java | 5 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 7 +++ 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 5acc3ebfff..f4b014c674 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -399,7 +399,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { */ @Override public Field add(Field value) { - return new Expression(ADD, this, nullSafe(value)); + return new Expression(ADD, this, nullSafe(value, getDataType())); } @Override @@ -409,7 +409,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Field sub(Field value) { - return new Expression(SUBTRACT, this, nullSafe(value)); + return new Expression(SUBTRACT, this, nullSafe(value, getDataType())); } @Override @@ -423,7 +423,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { */ @Override public Field mul(Field value) { - return new Expression(MULTIPLY, this, nullSafe(value)); + return new Expression(MULTIPLY, this, nullSafe(value, getDataType())); } @Override @@ -433,7 +433,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Field div(Field value) { - return new Expression(DIVIDE, this, nullSafe(value)); + return new Expression(DIVIDE, this, nullSafe(value, getDataType())); } @Override @@ -443,7 +443,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Field mod(Field value) { - return new Mod(this, nullSafe(value)); + return new Mod(this, nullSafe(value, getDataType())); } // ------------------------------------------------------------------------ @@ -728,12 +728,12 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition like(Field field) { - return new CompareCondition(this, nullSafe(field), LIKE); + return new CompareCondition(this, nullSafe(field, getDataType()), LIKE); } @Override public final Condition like(Field field, char escape) { - return new CompareCondition(this, nullSafe(field), LIKE, escape); + return new CompareCondition(this, nullSafe(field, getDataType()), LIKE, escape); } @Override @@ -748,12 +748,12 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition likeIgnoreCase(Field field) { - return new CompareCondition(this, nullSafe(field), LIKE_IGNORE_CASE); + return new CompareCondition(this, nullSafe(field, getDataType()), LIKE_IGNORE_CASE); } @Override public final Condition likeIgnoreCase(Field field, char escape) { - return new CompareCondition(this, nullSafe(field), LIKE_IGNORE_CASE, escape); + return new CompareCondition(this, nullSafe(field, getDataType()), LIKE_IGNORE_CASE, escape); } @Override @@ -763,7 +763,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition likeRegex(Field pattern) { - return new RegexpLike(this, nullSafe(pattern)); + return new RegexpLike(this, nullSafe(pattern, getDataType())); } @Override @@ -778,12 +778,12 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition notLike(Field field) { - return new CompareCondition(this, nullSafe(field), NOT_LIKE); + return new CompareCondition(this, nullSafe(field, getDataType()), NOT_LIKE); } @Override public final Condition notLike(Field field, char escape) { - return new CompareCondition(this, nullSafe(field), NOT_LIKE, escape); + return new CompareCondition(this, nullSafe(field, getDataType()), NOT_LIKE, escape); } @Override @@ -798,12 +798,12 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition notLikeIgnoreCase(Field field) { - return new CompareCondition(this, nullSafe(field), NOT_LIKE_IGNORE_CASE); + return new CompareCondition(this, nullSafe(field, getDataType()), NOT_LIKE_IGNORE_CASE); } @Override public final Condition notLikeIgnoreCase(Field field, char escape) { - return new CompareCondition(this, nullSafe(field), NOT_LIKE_IGNORE_CASE, escape); + return new CompareCondition(this, nullSafe(field, getDataType()), NOT_LIKE_IGNORE_CASE, escape); } @Override @@ -945,7 +945,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition between(Field minValue, Field maxValue) { - return between(nullSafe(minValue)).and(nullSafe(maxValue)); + return between(nullSafe(minValue, getDataType())).and(nullSafe(maxValue, getDataType())); } @Override @@ -955,7 +955,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition betweenSymmetric(Field minValue, Field maxValue) { - return betweenSymmetric(nullSafe(minValue)).and(nullSafe(maxValue)); + return betweenSymmetric(nullSafe(minValue, getDataType())).and(nullSafe(maxValue, getDataType())); } @Override @@ -965,7 +965,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition notBetween(Field minValue, Field maxValue) { - return notBetween(nullSafe(minValue)).and(nullSafe(maxValue)); + return notBetween(nullSafe(minValue, getDataType())).and(nullSafe(maxValue, getDataType())); } @Override @@ -975,7 +975,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition notBetweenSymmetric(Field minValue, Field maxValue) { - return notBetweenSymmetric(nullSafe(minValue)).and(nullSafe(maxValue)); + return notBetweenSymmetric(nullSafe(minValue, getDataType())).and(nullSafe(maxValue, getDataType())); } @Override @@ -985,7 +985,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final BetweenAndStep between(Field minValue) { - return new BetweenCondition(this, nullSafe(minValue), false, false); + return new BetweenCondition(this, nullSafe(minValue, getDataType()), false, false); } @Override @@ -995,7 +995,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final BetweenAndStep betweenSymmetric(Field minValue) { - return new BetweenCondition(this, nullSafe(minValue), false, true); + return new BetweenCondition(this, nullSafe(minValue, getDataType()), false, true); } @Override @@ -1005,7 +1005,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final BetweenAndStep notBetween(Field minValue) { - return new BetweenCondition(this, nullSafe(minValue), true, false); + return new BetweenCondition(this, nullSafe(minValue, getDataType()), true, false); } @Override @@ -1015,7 +1015,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final BetweenAndStep notBetweenSymmetric(Field minValue) { - return new BetweenCondition(this, nullSafe(minValue), true, true); + return new BetweenCondition(this, nullSafe(minValue, getDataType()), true, true); } @Override @@ -1145,7 +1145,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition equal(Field field) { - return compare(EQUALS, nullSafe(field)); + return compare(EQUALS, nullSafe(field, getDataType())); } @Override @@ -1175,7 +1175,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition notEqual(Field field) { - return compare(NOT_EQUALS, nullSafe(field)); + return compare(NOT_EQUALS, nullSafe(field, getDataType())); } @Override @@ -1205,7 +1205,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition lessThan(Field field) { - return compare(LESS, nullSafe(field)); + return compare(LESS, nullSafe(field, getDataType())); } @Override @@ -1225,7 +1225,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition lessOrEqual(Field field) { - return compare(LESS_OR_EQUAL, nullSafe(field)); + return compare(LESS_OR_EQUAL, nullSafe(field, getDataType())); } @Override @@ -1245,7 +1245,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition greaterThan(Field field) { - return compare(GREATER, nullSafe(field)); + return compare(GREATER, nullSafe(field, getDataType())); } @Override @@ -1265,7 +1265,7 @@ abstract class AbstractField extends AbstractQueryPart implements Field { @Override public final Condition greaterOrEqual(Field field) { - return compare(GREATER_OR_EQUAL, nullSafe(field)); + return compare(GREATER_OR_EQUAL, nullSafe(field, getDataType())); } @Override @@ -1288,10 +1288,10 @@ abstract class AbstractField extends AbstractQueryPart implements Field { switch (comparator) { case IS_DISTINCT_FROM: case IS_NOT_DISTINCT_FROM: - return new IsDistinctFrom(this, nullSafe(field), comparator); + return new IsDistinctFrom(this, nullSafe(field, getDataType()), comparator); default: - return new CompareCondition(this, nullSafe(field), comparator); + return new CompareCondition(this, nullSafe(field, getDataType()), comparator); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java index 67bf0001c6..4117835adc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java @@ -64,6 +64,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +import static org.jooq.impl.DSL.nullSafe; import static org.jooq.impl.DSL.val; import org.jooq.BetweenAndStep; @@ -100,14 +101,14 @@ final class BetweenCondition extends AbstractCondition implements BetweenAndS @Override public final Condition and(T value) { - return and(val(value)); + return and(val(value, field.getDataType())); } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public final Condition and(Field f) { if (maxValue == null) { - this.maxValue = f; + this.maxValue = nullSafe(f, field.getDataType()); return this; } else { diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 9cc2669a2a..35ec142345 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -18031,6 +18031,13 @@ public class DSL { return field == null ? val((T) null) : field; } + /** + * Null-safety of a field. + */ + protected static Field nullSafe(Field field, DataType type) { + return field == null ? (Field) val((T) null, type) : field; + } + /** * Null-safety of a field. */