From dbb1aba8822b5acfc114cc87df0e3b13fe736982 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Fri, 13 Sep 2019 15:42:26 +0200 Subject: [PATCH] [jOOQ/jOOQ#9201] Corrects DefaultDayToSecondBinding for Postgres In the case of Postgres the interval literal syntax requires each component to have its own sign. This in contrast to the SQL standard, where the leading sign applies to all components in the interval. `DefaultDayToSecondBinding` now overrides `sqlInline0()` and implements this Postgres-specific formatting when rendering interval literals. --- .../java/org/jooq/impl/DefaultBinding.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 7d6d9ae393..80392d05a1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -2118,6 +2118,29 @@ public class DefaultBinding implements Binding { super(converter, isLob); } + @Override + void sqlInline0(BindingSQLContext ctx, DayToSecond value) throws SQLException { + // [#566] Interval data types are best bound as Strings + if ( ctx.family() == POSTGRES) { + int sign = value.getSign(); + int days = sign * value.getDays(); + ctx.render().sql('\'') + .sql(days >= 0 ? '+' : '-') + .sql(Math.abs(days)) + .sql(' ') + .sql(sign * value.getHours()) + .sql(':') + .sql(sign * value.getMinutes()) + .sql(':') + .sql(sign * value.getSeconds()) + .sql('.') + .sql(StringUtils.leftPad(Integer.toString(value.getNano()), 9, '0')) + .sql('\''); + } + else + ctx.render().sql('\'').sql(value.toString()).sql('\''); + } + @Override final void set0(BindingSetStatementContext ctx, DayToSecond value) throws SQLException {