From a51eec3222a779b38923aa26f5c74c5a9f826df7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 16 Aug 2024 09:29:13 +0200 Subject: [PATCH] [jOOQ/jOOQ#10880] [jOOQ/jOOQ#11706] Better handle DECFLOAT NaN and Infinity --- .../java/org/jooq/impl/DefaultBinding.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 1014fd52e6..deb7201113 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -148,6 +148,7 @@ import static org.jooq.impl.SQLDataType.BLOB; import static org.jooq.impl.SQLDataType.BOOLEAN; import static org.jooq.impl.SQLDataType.CHAR; import static org.jooq.impl.SQLDataType.DATE; +import static org.jooq.impl.SQLDataType.DECFLOAT; import static org.jooq.impl.SQLDataType.DECIMAL_INTEGER; import static org.jooq.impl.SQLDataType.DOUBLE; import static org.jooq.impl.SQLDataType.INTEGER; @@ -1990,6 +1991,23 @@ public class DefaultBinding implements Binding { super(dataType, converter); } + @Override + final void sqlInline0(org.jooq.BindingSQLContext ctx, Decfloat value) throws SQLException { + + // [#5249] [#6912] [#8063] [#11701] [#11076] Special inlining of special floating point values + if (value.isNaN()) + ctx.render().visit(nan(ctx, DECFLOAT)); + else if (value.isPositiveInfinity()) + ctx.render().visit(infinity(ctx, DECFLOAT, false)); + else if (value.isNegativeInfinity()) + ctx.render().visit(infinity(ctx, DECFLOAT, true)); + else if (REQUIRES_LITERAL_CAST.contains(ctx.dialect())) + ctx.render().visit(field(ctx.render().floatFormat().format(value)).cast(DECFLOAT)); + else + ctx.render().sql(value.data()); + + } + @Override final void set0(BindingSetStatementContext ctx, Decfloat value) throws SQLException { ctx.statement().setString(ctx.index(), value.data()); @@ -2976,7 +2994,7 @@ public class DefaultBinding implements Binding { @Override final void sqlInline0(BindingSQLContext ctx, Double value) { - // [#5249] [#6912] [#8063] [#11701] Special inlining of special floating point values + // [#5249] [#6912] [#8063] [#11701] [#11076] Special inlining of special floating point values if (value.isNaN()) ctx.render().visit(nan(ctx, DOUBLE)); else if (value == Double.POSITIVE_INFINITY) @@ -3173,12 +3191,12 @@ public class DefaultBinding implements Binding { @Override final void sqlInline0(BindingSQLContext ctx, Float value) { - // [#5249] [#6912] [#8063] [#11701] Special inlining of special floating point values + // [#5249] [#6912] [#8063] [#11701] [#11076] Special inlining of special floating point values if (value.isNaN()) ctx.render().visit(nan(ctx, REAL)); - else if (value == Double.POSITIVE_INFINITY) + else if (value == Float.POSITIVE_INFINITY) ctx.render().visit(infinity(ctx, REAL, false)); - else if (value == Double.NEGATIVE_INFINITY) + else if (value == Float.NEGATIVE_INFINITY) ctx.render().visit(infinity(ctx, REAL, true)); else if (REQUIRES_LITERAL_CAST.contains(ctx.dialect())) ctx.render().visit(field(ctx.render().floatFormat().format(value)).cast(REAL));