From 0b7a5f3fc99a51e3f38d85bfcb7c4d005dcc641f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 14 Aug 2024 14:47:05 +0200 Subject: [PATCH] [jOOQ/jOOQ#10880] Add DECFLOAT support This includes: - Support casts - Support DDL - Support MULTISET usage - Support Db2's NAN (all uppercase) syntax --- jOOQ/src/main/java/org/jooq/Decfloat.java | 23 +++++++++---------- .../src/main/java/org/jooq/impl/Multiset.java | 11 +++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Decfloat.java b/jOOQ/src/main/java/org/jooq/Decfloat.java index b9c9eb4ff0..ecea6c9ac6 100644 --- a/jOOQ/src/main/java/org/jooq/Decfloat.java +++ b/jOOQ/src/main/java/org/jooq/Decfloat.java @@ -188,28 +188,27 @@ public final class Decfloat extends Number implements Data { if (coefficient != null || special != null) return; - switch (data) { - case "+NaN": - case "NaN": + String lc; + switch (lc = data.toLowerCase()) { + case "+nan": + case "nan": special = Special.NAN; break; - case "+Infinity": - case "Infinity": - case "+Inf": - case "Inf": + case "+infinity": + case "infinity": + case "+inf": + case "inf": special = Special.POSITIVE_INFINITY; break; - case "-Infinity": - case "-Inf": + case "-infinity": + case "-inf": special = Special.NEGATIVE_INFINITY; break; default: { - int i = data.indexOf("E"); - if (i == -1) - i = data.indexOf("e"); + int i = lc.indexOf("e"); try { if (i == -1) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 19a8121759..60a6ac6acb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -593,6 +593,17 @@ final class Multiset extends AbstractField> implemen @SuppressWarnings("unchecked") static final Field castForJSON(Context ctx, Field field) { + DataType t = field.getDataType(); + + // [#10880] Many dialects don't support NaN and other float values in JSON documents as numbers + if (t.isDecimal() && t.isFloat()) { + switch (ctx.family()) { + + case H2: + return field.cast(VARCHAR); + } + } +