This is an automated email from the ASF dual-hosted git repository.
ravindra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 7417f37 ARROW-5900: [Java] Bounds check for decimal args.
7417f37 is described below
commit 7417f37bb02e440c19730db4f9d91052e4ccb260
Author: Praveen <[email protected]>
AuthorDate: Wed Jul 10 23:52:02 2019 +0530
ARROW-5900: [Java] Bounds check for decimal args.
Add bounds checks on decimal data types.
Author: Praveen <[email protected]>
Closes #4845 from praveenbingo/ARROW-5900 and squashes the following
commits:
ade411246 <Praveen> Fix check.
e8d6d0b67 <Praveen> ARROW-5900: Bounds check for decimal args.
---
.../arrow/gandiva/expression/ArrowTypeHelper.java | 4 +++
.../gandiva/evaluator/ProjectorDecimalTest.java | 42 ++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git
a/java/gandiva/src/main/java/org/apache/arrow/gandiva/expression/ArrowTypeHelper.java
b/java/gandiva/src/main/java/org/apache/arrow/gandiva/expression/ArrowTypeHelper.java
index 47d4eb7..c37a190 100644
---
a/java/gandiva/src/main/java/org/apache/arrow/gandiva/expression/ArrowTypeHelper.java
+++
b/java/gandiva/src/main/java/org/apache/arrow/gandiva/expression/ArrowTypeHelper.java
@@ -23,6 +23,7 @@ import org.apache.arrow.flatbuf.Type;
import org.apache.arrow.gandiva.exceptions.GandivaException;
import org.apache.arrow.gandiva.exceptions.UnsupportedTypeException;
import org.apache.arrow.gandiva.ipc.GandivaTypes;
+import org.apache.arrow.util.Preconditions;
import org.apache.arrow.vector.types.pojo.ArrowType;
import org.apache.arrow.vector.types.pojo.Field;
import org.apache.arrow.vector.types.pojo.Schema;
@@ -114,6 +115,9 @@ public class ArrowTypeHelper {
private static void initArrowTypeDecimal(ArrowType.Decimal decimalType,
GandivaTypes.ExtGandivaType.Builder
builder) {
+ Preconditions.checkArgument(decimalType.getPrecision() > 0 &&
+ decimalType.getPrecision() <= 38, "Gandiva only supports decimals
of upto 38 " +
+ "precision. Input precision : " + decimalType.getPrecision());
builder.setPrecision(decimalType.getPrecision());
builder.setScale(decimalType.getScale());
builder.setType(GandivaTypes.GandivaType.DECIMAL);
diff --git
a/java/gandiva/src/test/java/org/apache/arrow/gandiva/evaluator/ProjectorDecimalTest.java
b/java/gandiva/src/test/java/org/apache/arrow/gandiva/evaluator/ProjectorDecimalTest.java
index c5cb8f7..8b38edb 100644
---
a/java/gandiva/src/test/java/org/apache/arrow/gandiva/evaluator/ProjectorDecimalTest.java
+++
b/java/gandiva/src/test/java/org/apache/arrow/gandiva/evaluator/ProjectorDecimalTest.java
@@ -42,11 +42,15 @@ import org.apache.arrow.vector.types.pojo.ArrowType;
import org.apache.arrow.vector.types.pojo.ArrowType.Decimal;
import org.apache.arrow.vector.types.pojo.Field;
import org.apache.arrow.vector.types.pojo.Schema;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import com.google.common.collect.Lists;
public class ProjectorDecimalTest extends
org.apache.arrow.gandiva.evaluator.BaseEvaluatorTest {
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
@Test
public void test_add() throws GandivaException {
@@ -751,5 +755,43 @@ public class ProjectorDecimalTest extends
org.apache.arrow.gandiva.evaluator.Bas
eval.close();
}
}
+
+ @Test
+ public void testInvalidDecimal() throws GandivaException {
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage("Gandiva only supports decimals of upto 38
precision. Input precision" +
+ " : 0");
+ Decimal decimalType = new Decimal(0, 0);
+ Field int64f = Field.nullable("int64", int64);
+
+ Schema schema = new Schema(Lists.newArrayList(int64f));
+ Projector eval = Projector.make(schema,
+ Lists.newArrayList(
+ TreeBuilder.makeExpression("castDECIMAL",
+ Lists.newArrayList(int64f),
+ Field.nullable("invalid_dec", decimalType)
+ )
+ )
+ );
+ }
+
+ @Test
+ public void testInvalidDecimalGt38() throws GandivaException {
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage("Gandiva only supports decimals of upto 38
precision. Input precision" +
+ " : 42");
+ Decimal decimalType = new Decimal(42, 0);
+ Field int64f = Field.nullable("int64", int64);
+
+ Schema schema = new Schema(Lists.newArrayList(int64f));
+ Projector eval = Projector.make(schema,
+ Lists.newArrayList(
+ TreeBuilder.makeExpression("castDECIMAL",
+ Lists.newArrayList(int64f),
+ Field.nullable("invalid_dec", decimalType)
+ )
+ )
+ );
+ }
}