This is an automated email from the ASF dual-hosted git repository.

cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new 546fb15  DRILL-7947: Unable to aggregate or filter nullable decimals 
in large record sets (#2255)
546fb15 is described below

commit 546fb15ee8b0444d6da91bcc47116084fd6e27b5
Author: Volodymyr Vysotskyi <[email protected]>
AuthorDate: Fri Jun 11 00:49:08 2021 +0300

    DRILL-7947: Unable to aggregate or filter nullable decimals in large record 
sets (#2255)
---
 .../drill/exec/store/avro/AvroColumnConverterFactory.java |  7 ++++---
 .../exec/store/parquet/ParquetTableMetadataUtils.java     | 15 ++++++++++-----
 .../java/org/apache/drill/exec/util/DecimalUtility.java   |  6 +++---
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroColumnConverterFactory.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroColumnConverterFactory.java
index cfd7d50..152d4bd 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroColumnConverterFactory.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroColumnConverterFactory.java
@@ -91,14 +91,15 @@ public class AvroColumnConverterFactory extends 
ColumnConverterFactory {
         });
       case VARDECIMAL:
         return new ColumnConverter.ScalarColumnConverter(value -> {
-          BigInteger bigInteger;
+          byte[] bytes;
           if (value instanceof ByteBuffer) {
             ByteBuffer decBuf = (ByteBuffer) value;
-            bigInteger = new BigInteger(decBuf.array());
+            bytes = decBuf.array();
           } else {
             GenericFixed genericFixed = (GenericFixed) value;
-            bigInteger = new BigInteger(genericFixed.bytes());
+            bytes = genericFixed.bytes();
           }
+          BigInteger bigInteger = bytes.length == 0 ? BigInteger.ZERO : new 
BigInteger(bytes);
           BigDecimal decimalValue = new BigDecimal(bigInteger, 
readerSchema.scale());
           writer.setDecimal(decimalValue);
         });
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetTableMetadataUtils.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetTableMetadataUtils.java
index 074709d..67a1232 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetTableMetadataUtils.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetTableMetadataUtils.java
@@ -360,7 +360,8 @@ public class ParquetTableMetadataUtils {
         case BINARY:
         case FIXED_LEN_BYTE_ARRAY:
           if (originalType == OriginalType.DECIMAL) {
-            return new BigInteger(getBytes(value));
+            byte[] bytes = getBytes(value);
+            return bytes.length == 0 ? BigInteger.ZERO : new BigInteger(bytes);
           } else if (originalType == OriginalType.INTERVAL) {
             return getBytes(value);
           } else {
@@ -402,9 +403,11 @@ public class ParquetTableMetadataUtils {
     } else if (value instanceof String) {
       return Integer.parseInt(value.toString());
     } else if (value instanceof byte[]) {
-      return new BigInteger((byte[]) value).intValue();
+      byte[] bytes = (byte[]) value;
+      return bytes.length == 0 ? 0 : new BigInteger(bytes).intValue();
     } else if (value instanceof Binary) {
-      return new BigInteger(((Binary) value).getBytes()).intValue();
+      byte[] bytes = ((Binary) value).getBytes();
+      return bytes.length == 0 ? 0 : new BigInteger(bytes).intValue();
     }
     throw new UnsupportedOperationException(String.format("Cannot obtain 
Integer using value %s", value));
   }
@@ -415,9 +418,11 @@ public class ParquetTableMetadataUtils {
     } else if (value instanceof String) {
       return Long.parseLong(value.toString());
     } else if (value instanceof byte[]) {
-      return new BigInteger((byte[]) value).longValue();
+      byte[] bytes = (byte[]) value;
+      return bytes.length == 0 ? 0L : new BigInteger(bytes).longValue();
     } else if (value instanceof Binary) {
-      return new BigInteger(((Binary) value).getBytes()).longValue();
+      byte[] bytes = ((Binary) value).getBytes();
+      return bytes.length == 0 ? 0L : new BigInteger(bytes).longValue();
     }
     throw new UnsupportedOperationException(String.format("Cannot obtain 
Integer using value %s", value));
   }
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/util/DecimalUtility.java 
b/exec/vector/src/main/java/org/apache/drill/exec/util/DecimalUtility.java
index ce12bf1..de388cb 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/util/DecimalUtility.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/util/DecimalUtility.java
@@ -67,7 +67,7 @@ public class DecimalUtility {
   public static BigDecimal getBigDecimalFromDrillBuf(DrillBuf bytebuf, int 
start, int length, int scale) {
     byte[] value = new byte[length];
     bytebuf.getBytes(start, value, 0, length);
-    BigInteger unscaledValue = new BigInteger(value);
+    BigInteger unscaledValue = length == 0 ? BigInteger.ZERO : new 
BigInteger(value);
     return new BigDecimal(unscaledValue, scale);
   }
 
@@ -337,9 +337,9 @@ public class DecimalUtility {
    * @return 1 if left > right, 0 if left = right, -1 if left < right.  two 
values that are numerically equal, but with different
    * scales (e.g., 2.00 and 2), are considered equal.
    */
-  public static int compareVarLenBytes(DrillBuf left, int leftStart, int 
leftEnd, int leftScale, byte right[], int rightScale, boolean absCompare) {
+  public static int compareVarLenBytes(DrillBuf left, int leftStart, int 
leftEnd, int leftScale, byte[] right, int rightScale, boolean absCompare) {
     java.math.BigDecimal bdLeft = getBigDecimalFromDrillBuf(left, leftStart, 
leftEnd - leftStart, leftScale);
-    java.math.BigDecimal bdRight = new BigDecimal(new BigInteger(right), 
rightScale);
+    java.math.BigDecimal bdRight = new BigDecimal(right.length == 0 ? 
BigInteger.ZERO : new BigInteger(right), rightScale);
     if (absCompare) {
       bdLeft = bdLeft.abs();
       bdRight = bdRight.abs();

Reply via email to