diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index bb3d2dab34..09511d9b4c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -953,7 +953,10 @@ abstract class AbstractField extends AbstractTypedNamed implements Field mul(Field value) { - return new Mul(this, (Field) (getDataType().isTemporal() ? nullSafe(value) : nullSafe(value, getDataType()))); + return new Mul(this, (Field) (getDataType().isTemporal() || nullSafe(value).getDataType().isTemporal() + ? nullSafe(value) + : nullSafe(value, getDataType()) + )); } @Override @@ -964,7 +967,10 @@ abstract class AbstractField extends AbstractTypedNamed implements Field div(Field value) { - return new Div(this, (Field) (getDataType().isTemporal() ? nullSafe(value) : nullSafe(value, getDataType()))); + return new Div(this, (Field) (getDataType().isTemporal() || nullSafe(value).getDataType().isTemporal() + ? nullSafe(value) + : nullSafe(value, getDataType()) + )); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/Add.java b/jOOQ/src/main/java/org/jooq/impl/Add.java index c2bc2ca51a..2d36b4cca9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Add.java +++ b/jOOQ/src/main/java/org/jooq/impl/Add.java @@ -118,6 +118,13 @@ implements return Expression.transform(this, arg1, ExpressionOperator.ADD, arg2, false, transform); } + @Override + final DataType getExpressionDataType() { + + // [#11959] Workaround for lack of proper data type information for interval based expressions + return Expression.getExpressionDataType((AbstractField) arg1, ExpressionOperator.ADD, (AbstractField) arg2); + } + diff --git a/jOOQ/src/main/java/org/jooq/impl/Div.java b/jOOQ/src/main/java/org/jooq/impl/Div.java index a6a1253cb3..e8247c2675 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Div.java +++ b/jOOQ/src/main/java/org/jooq/impl/Div.java @@ -111,6 +111,13 @@ implements return Expression.transform(this, arg1, ExpressionOperator.DIVIDE, arg2, false, transform); } + @Override + final DataType getExpressionDataType() { + + // [#11959] Workaround for lack of proper data type information for interval based expressions + return Expression.getExpressionDataType((AbstractField) arg1, ExpressionOperator.DIVIDE, (AbstractField) arg2); + } + diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index bb079d8be4..5e16d9358f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -130,13 +130,7 @@ final class Expression extends AbstractTransformable implements UOperator2 this.rhs = rhs; } - @Override - final DataType getExpressionDataType() { - - // [#11959] Workaround for lack of proper data type information for interval based expressions - AbstractField l = (AbstractField) lhs; - AbstractField r = (AbstractField) rhs; - + static final DataType getExpressionDataType(AbstractField l, ExpressionOperator operator, AbstractField r) { DataType lt = l.getExpressionDataType(); DataType rt = r.getExpressionDataType(); @@ -152,6 +146,13 @@ final class Expression extends AbstractTransformable implements UOperator2 return lt; } + @Override + final DataType getExpressionDataType() { + + // [#11959] Workaround for lack of proper data type information for interval based expressions + return getExpressionDataType((AbstractField) lhs, operator, (AbstractField) rhs); + } + @Override final void accept0(Context ctx) { SQLDialect family = ctx.family(); diff --git a/jOOQ/src/main/java/org/jooq/impl/Mul.java b/jOOQ/src/main/java/org/jooq/impl/Mul.java index 9463eb7bd9..f6b2143c41 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Mul.java +++ b/jOOQ/src/main/java/org/jooq/impl/Mul.java @@ -118,6 +118,13 @@ implements return Expression.transform(this, arg1, ExpressionOperator.MULTIPLY, arg2, false, transform); } + @Override + final DataType getExpressionDataType() { + + // [#11959] Workaround for lack of proper data type information for interval based expressions + return Expression.getExpressionDataType((AbstractField) arg1, ExpressionOperator.MULTIPLY, (AbstractField) arg2); + } + diff --git a/jOOQ/src/main/java/org/jooq/impl/Sub.java b/jOOQ/src/main/java/org/jooq/impl/Sub.java index 44776a2a5b..b03c7cbfbc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Sub.java +++ b/jOOQ/src/main/java/org/jooq/impl/Sub.java @@ -111,6 +111,13 @@ implements return Expression.transform(this, arg1, ExpressionOperator.SUBTRACT, arg2, false, transform); } + @Override + final DataType getExpressionDataType() { + + // [#11959] Workaround for lack of proper data type information for interval based expressions + return Expression.getExpressionDataType((AbstractField) arg1, ExpressionOperator.SUBTRACT, (AbstractField) arg2); + } +