diff --git a/jOOQ/src/main/java/org/jooq/impl/DateAdd.java b/jOOQ/src/main/java/org/jooq/impl/DateAdd.java index af0c7436ae..58160f62af 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateAdd.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateAdd.java @@ -44,6 +44,8 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.keyword; +import java.sql.Date; + import org.jooq.Configuration; import org.jooq.DatePart; import org.jooq.Field; @@ -148,7 +150,12 @@ class DateAdd extends AbstractFunction { default: throwUnsupported(); } - return date.add(field("({0} || {1})::interval", interval, inline(keyword))); + // [#3824] Ensure that the output for DATE arithmetic will also + // be of type DATE, not TIMESTAMP + if (getDataType().getType() == Date.class) + return field("({0} + ({1} || {2})::interval)::date", getDataType(), date, interval, inline(keyword)); + else + return field("({0} + ({1} || {2})::interval)", getDataType(), date, interval, inline(keyword)); } case SQLITE: { diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 4d99a20c7a..0d1d373a42 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -570,10 +570,10 @@ class Expression extends AbstractFunction { // with incompatible data types and timezones // ? + CAST (? || ' days' as interval) if (operator == ADD) { - return lhs.add(rhsAsNumber().concat(" day").cast(DayToSecond.class)); + return new DateAdd(lhs, rhsAsNumber(), DatePart.DAY); } else { - return lhs.sub(rhsAsNumber().concat(" day").cast(DayToSecond.class)); + return new DateAdd(lhs, rhsAsNumber().neg(), DatePart.DAY); } }