From aafbf062c9fff7efbc420c6829bf5b040c9863b6 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 28 Jul 2020 11:22:52 +0200 Subject: [PATCH] [jOOQ/jOOQ#10448] Firebird arithmetic exception, numeric overflow, or string truncation; numeric value is out of range, when using Field.add(DayToSecond) with large millisecond numbers --- jOOQ/src/main/java/org/jooq/impl/Expression.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 86c847807f..e026438a72 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -83,6 +83,7 @@ import static org.jooq.impl.Keywords.K_DAY_TO_SECOND; import static org.jooq.impl.Keywords.K_INTERVAL; import static org.jooq.impl.Keywords.K_MILLISECOND; import static org.jooq.impl.Keywords.K_MONTH; +import static org.jooq.impl.Keywords.K_SECOND; import static org.jooq.impl.Keywords.K_YEAR_MONTH; import static org.jooq.impl.Keywords.K_YEAR_TO_MONTH; import static org.jooq.impl.Names.N_ADD_DAYS; @@ -388,8 +389,14 @@ final class Expression extends AbstractField { case FIREBIRD: { if (rhs.getType() == YearToMonth.class) ctx.visit(N_DATEADD).sql('(').visit(K_MONTH).sql(", ").visit(p(sign * rhsAsYTM().intValue())).sql(", ").visit(lhs).sql(')'); + + // [#10448] Firebird only supports adding integers + else if (rhsAsDTS().getMilli() > 0) + ctx.visit(N_DATEADD).sql('(').visit(K_MILLISECOND).sql(", ").visit(p(sign * (long) rhsAsDTS().getMilli())).sql(", ") + .visit(N_DATEADD).sql('(').visit(K_SECOND).sql(", ").visit(p(sign * (long) rhsAsDTS().getTotalSeconds())).sql(", ").visit(lhs).sql(')') + .sql(')'); else - ctx.visit(N_DATEADD).sql('(').visit(K_MILLISECOND).sql(", ").visit(p(sign * (long) rhsAsDTS().getTotalMilli())).sql(", ").visit(lhs).sql(')'); + ctx.visit(N_DATEADD).sql('(').visit(K_SECOND).sql(", ").visit(p(sign * (long) rhsAsDTS().getTotalSeconds())).sql(", ").visit(lhs).sql(')'); break; }