A recent query object model refactoring (where Mul, Div, Add, Sub were
extracted) created a regression in the expression data type calculation
for interval data types.
This commit is contained in:
Lukas Eder 2021-11-01 16:40:27 +01:00
parent 27d911dede
commit c13afc0941
6 changed files with 44 additions and 9 deletions

View File

@ -953,7 +953,10 @@ abstract class AbstractField<T> extends AbstractTypedNamed<T> implements Field<T
@SuppressWarnings("unchecked")
@Override
public final Field<T> mul(Field<? extends Number> value) {
return new Mul<T>(this, (Field<T>) (getDataType().isTemporal() ? nullSafe(value) : nullSafe(value, getDataType())));
return new Mul<T>(this, (Field<T>) (getDataType().isTemporal() || nullSafe(value).getDataType().isTemporal()
? nullSafe(value)
: nullSafe(value, getDataType())
));
}
@Override
@ -964,7 +967,10 @@ abstract class AbstractField<T> extends AbstractTypedNamed<T> implements Field<T
@SuppressWarnings("unchecked")
@Override
public final Field<T> div(Field<? extends Number> value) {
return new Div<T>(this, (Field<T>) (getDataType().isTemporal() ? nullSafe(value) : nullSafe(value, getDataType())));
return new Div<T>(this, (Field<T>) (getDataType().isTemporal() || nullSafe(value).getDataType().isTemporal()
? nullSafe(value)
: nullSafe(value, getDataType())
));
}
// ------------------------------------------------------------------------

View File

@ -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);
}

View File

@ -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);
}

View File

@ -130,13 +130,7 @@ final class Expression<T> extends AbstractTransformable<T> 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<T> extends AbstractTransformable<T> 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();

View File

@ -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);
}

View File

@ -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);
}