From 0b21120fb24576dcc2609fc6ca625840dea7a41b Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 3 Apr 2020 17:32:16 +0200 Subject: [PATCH] [jOOQ/jOOQ#10034] Stop casting bind values in UPDATE .. SET --- .../main/java/org/jooq/impl/FieldMapForUpdate.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index 7747130fa9..0241d06533 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -55,6 +55,7 @@ import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Context; import org.jooq.Field; +import org.jooq.RenderContext.CastMode; import org.jooq.SQLDialect; import org.jooq.Table; @@ -68,6 +69,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { * Generated UID */ private static final long serialVersionUID = -6139709404698673799L; + private static final Set CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES); private static final Set NO_SUPPORT_QUALIFY = SQLDialect.supportedBy(POSTGRES, SQLITE); private final Table table; @@ -93,6 +95,12 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { boolean restoreQualify = ctx.qualify(); boolean supportsQualify = NO_SUPPORT_QUALIFY.contains(ctx.family()) ? false : restoreQualify; + // [#2823] [#10034] Few dialects need bind value casts for UPDATE .. SET + // Some regressions have been observed e.g. in PostgreSQL with JSON types, so let's be careful. + CastMode previous = ctx.castMode(); + if (!CASTS_NEEDED.contains(ctx.dialect())) + ctx.castMode(CastMode.NEVER); + for (Entry, Field> entry : flattenEntrySet(entrySet())) { if (!"".equals(separator)) ctx.sql(separator) @@ -115,6 +123,9 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { separator = ","; } + + if (!CASTS_NEEDED.contains(ctx.dialect())) + ctx.castMode(previous); } else { ctx.sql("[ no fields are updated ]");