@Test
public void testDecimalSubtraction() throws Exception {
LiteralExpression op1, op2, op3;
List<Expression> children;
ImmutableBytesWritable ptr;
DecimalSubtractExpression e;
boolean evaluated;
op1 = LiteralExpression.newConstant(new BigDecimal("1234567890123456789012345678901"), PDataType.DECIMAL, 31, 0);
op2 = LiteralExpression.newConstant(new BigDecimal("12345"), PDataType.DECIMAL, 5, 0);
children = Arrays.<Expression>asList(op1, op2);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
evaluated = e.evaluate(null, ptr);
assertTrue(evaluated);
assertEqualValue(PDataType.DECIMAL, new BigDecimal("1234567890123456789012345666556"), ptr);
op1 = LiteralExpression.newConstant(new BigDecimal("12345"), PDataType.DECIMAL, 5, 0);
op2 = LiteralExpression.newConstant(new BigDecimal("123.45"), PDataType.DECIMAL, 5, 2);
children = Arrays.<Expression>asList(op1, op2);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
evaluated = e.evaluate(null, ptr);
assertTrue(evaluated);
assertEqualValue(PDataType.DECIMAL, new BigDecimal("12221.55"), ptr);
// Excceds precision
op1 = LiteralExpression.newConstant(new BigDecimal("99999999999999999999999999999999999999"), PDataType.DECIMAL, 38, 0);
op2 = LiteralExpression.newConstant(new BigDecimal("-123"), PDataType.DECIMAL, 3, 0);
children = Arrays.<Expression>asList(op1, op2);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
try {
evaluated = e.evaluate(null, ptr);
fail("Evaluation should have failed");
} catch (ValueTypeIncompatibleException ex) {
}
// Pass since we roll up precision and scale imposing.
op1 = LiteralExpression.newConstant(new BigDecimal("99999999999999999999999999999999999999"), PDataType.DECIMAL, 38, 0);
op2 = LiteralExpression.newConstant(new BigDecimal("-123"), PDataType.DECIMAL, 3, 0);
op3 = LiteralExpression.newConstant(new BigDecimal("123"), PDataType.DECIMAL, 3, 0);
children = Arrays.<Expression>asList(op1, op2, op3);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
evaluated = e.evaluate(null, ptr);
assertTrue(evaluated);
assertEqualValue(PDataType.DECIMAL, new BigDecimal("99999999999999999999999999999999999999"), ptr);
// Exceeds scale.
op1 = LiteralExpression.newConstant(new BigDecimal("12345678901234567890123456789012345678"), PDataType.DECIMAL, 38, 0);
op2 = LiteralExpression.newConstant(new BigDecimal("123.45"), PDataType.DECIMAL, 5, 2);
children = Arrays.<Expression>asList(op1, op2);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
try {
evaluated = e.evaluate(null, ptr);
fail("Evaluation should have failed");
} catch (ValueTypeIncompatibleException ex) {
}
// Decimal with no precision and scale.
op1 = LiteralExpression.newConstant(new BigDecimal("1111.1"), PDataType.DECIMAL);
op2 = LiteralExpression.newConstant(new BigDecimal("1.1111"), PDataType.DECIMAL, 5, 4);
children = Arrays.<Expression>asList(op1, op2);
e = new DecimalSubtractExpression(children);
ptr = new ImmutableBytesWritable();
evaluated = e.evaluate(null, ptr);
assertTrue(evaluated);
assertEqualValue(PDataType.DECIMAL, new BigDecimal("1109.9889"), ptr);
}