Skip to content

Commit 2f35627

Browse files
authored
MINOR: Fix validation of decimals at their declared precision (#1342)
DecimalUtilityl#checkPrecisionAndScaleNoThrow used to reject value precision that was equal to the vector precision, it should not.
1 parent f745a59 commit 2f35627

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

‎vector/src/main/java/org/apache/arrow/vector/util/DecimalUtility.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public static boolean checkPrecisionAndScale(
118118
*/
119119
public static boolean checkPrecisionAndScaleNoThrow(
120120
BigDecimal value, int vectorPrecision, int vectorScale) {
121-
return value.scale() == vectorScale && value.precision() < vectorPrecision;
121+
return value.scale() == vectorScale && value.precision() <= vectorPrecision;
122122
}
123123

124124
/**
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.arrow.vector;
18+
19+
import static org.junit.jupiter.api.Assertions.assertThrows;
20+
21+
import java.math.BigDecimal;
22+
import org.apache.arrow.memory.BufferAllocator;
23+
import org.apache.arrow.memory.RootAllocator;
24+
import org.apache.arrow.vector.util.DecimalUtility;
25+
import org.apache.arrow.vector.validate.ValidateUtil.ValidateException;
26+
import org.junit.jupiter.params.ParameterizedTest;
27+
import org.junit.jupiter.params.provider.ValueSource;
28+
29+
public class TestDecimalPrecisionBoundary {
30+
@ParameterizedTest
31+
@ValueSource(ints = {128, 256})
32+
public void testValidateScalarsAtDeclaredPrecision(int bitWidth) {
33+
try (BufferAllocator allocator = new RootAllocator();
34+
BaseFixedWidthVector vector =
35+
bitWidth == 128
36+
? new DecimalVector("decimal", allocator, 5, 2)
37+
: new Decimal256Vector("decimal", allocator, 5, 2)) {
38+
vector.allocateNew(2);
39+
DecimalUtility.writeBigDecimalToArrowBuf(
40+
new BigDecimal("999.99"), vector.getDataBuffer(), 0, bitWidth / 8);
41+
DecimalUtility.writeBigDecimalToArrowBuf(
42+
new BigDecimal("-999.99"), vector.getDataBuffer(), 1, bitWidth / 8);
43+
vector.setIndexDefined(0);
44+
vector.setIndexDefined(1);
45+
vector.setValueCount(2);
46+
vector.validateScalars();
47+
// Values beyond the declared precision must still be rejected.
48+
DecimalUtility.writeBigDecimalToArrowBuf(
49+
new BigDecimal("1000.00"), vector.getDataBuffer(), 0, bitWidth / 8);
50+
assertThrows(ValidateException.class, vector::validateScalars);
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)