From e61471a22cd7140b93d2d0ab6fdf1a9e5410fbf2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 12 Mar 2020 11:21:20 +0100 Subject: [PATCH] [jOOQ/jOOQ#9933] Optimistic locking does not work when recordTimestamp column has precision less than TIMESTAMP(3) --- .../main/java/org/jooq/impl/TableRecordImpl.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java index 41342e9491..7547112fa8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java @@ -65,6 +65,7 @@ import java.util.Set; import org.jooq.Configuration; import org.jooq.Converter; import org.jooq.DSLContext; +import org.jooq.DataType; import org.jooq.Field; import org.jooq.ForeignKey; import org.jooq.Identity; @@ -331,12 +332,25 @@ public class TableRecordImpl> extends AbstractRecord im result = new Timestamp(configuration().clock().millis()); - addValue(store, timestamp, result); + + // [#9933] Truncate timestamp to column precision, if needed + addValue(store, timestamp, result = truncate(result, timestamp.getDataType())); } return result; } + private static final long[] TRUNCATE = { 1000L, 100L, 10L, 1L }; + + private static final Timestamp truncate(Timestamp ts, DataType type) { + if (type.isDate()) + return new Timestamp(ts.getYear(), ts.getMonth(), ts.getDate(), 0, 0, 0, 0); + else if (type.precision() >= 3) + return ts; + else + return new Timestamp((ts.getTime() / TRUNCATE[type.precision()]) * TRUNCATE[type.precision()]); + } + /** * Set an updated version value to a store query */