From 9c5980a7df0fea97580977dd7d871030ffbd0bee Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Tue, 30 Jul 2019 13:04:10 +0200 Subject: [PATCH] [jOOQ/jOOQ#8964] Fix bulk INSERT of DECIMAL with scale values SQL Server has a bug when it comes to bulk inserting DECIMAL with scale values (see https://github.com/microsoft/mssql-jdbc/issues/1021 for details). As a workaround jOOQ will in this scenario explicitly cast the first column value in the bulk set. --- .../org/jooq/impl/AbstractStoreQuery.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java index 8150f4a254..4bf3405793 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java @@ -37,7 +37,11 @@ */ package org.jooq.impl; +// ... + +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.jooq.Configuration; import org.jooq.Context; @@ -59,6 +63,11 @@ abstract class AbstractStoreQuery extends AbstractDMLQuery */ private static final long serialVersionUID = 6864591335823160569L; + + + + + AbstractStoreQuery(Configuration configuration, WithImpl with, Table table) { super(configuration, with, table); } @@ -85,22 +94,50 @@ abstract class AbstractStoreQuery extends AbstractDMLQuery final void addValue(Field field, int index, T value) { if (field == null) - if (index >= 0) - addValue(new UnknownField(index), value); - else - addValue(new UnknownField(getValues().size()), value); + addUnknownValue(index, value); else - getValues().put(field, Tools.field(value, field)); + addKnownValue(field, value); + } + + private final void addUnknownValue(int index, T value) { + if (index >= 0) + addValue(new UnknownField(index), value); + else + addValue(new UnknownField(getValues().size()), value); + } + + private final void addKnownValue(Field field, T value) { + addKnownValue(field, Tools.field(value, field)); } final void addValue(Field field, int index, Field value) { if (field == null) - if (index >= 0) - addValue(new UnknownField(index), value); - else - addValue(new UnknownField(getValues().size()), value); + addUnknownValue(index, value); else - getValues().put(field, Tools.field(value, field)); + addKnownValue(field, value); + } + + private final void addUnknownValue(int index, Field value) { + if (index >= 0) + addValue(new UnknownField(index), value); + else + addValue(new UnknownField(getValues().size()), value); + } + + private final void addKnownValue(Field field, Field value) { + + + + + + + + + + + + + getValues().put(field, value); } static class UnknownField extends AbstractField {