You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by cg...@apache.org on 2023/02/12 03:03:23 UTC

[drill] branch master updated: DRILL-8399: MS Access Reader Misinterprets Data Types (#2755)

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 8a0b984544 DRILL-8399: MS Access Reader Misinterprets Data Types (#2755)
8a0b984544 is described below

commit 8a0b984544172ded74fffb4aaa9801850ab88439
Author: Charles S. Givre <cg...@apache.org>
AuthorDate: Sat Feb 11 22:03:17 2023 -0500

    DRILL-8399: MS Access Reader Misinterprets Data Types (#2755)
---
 .../exec/store/msaccess/MSAccessBatchReader.java   | 25 ++++++++++++++++-----
 .../exec/store/msaccess/TestMSAccessReader.java    | 26 ++++++++++++++++++++++
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/contrib/format-access/src/main/java/org/apache/drill/exec/store/msaccess/MSAccessBatchReader.java b/contrib/format-access/src/main/java/org/apache/drill/exec/store/msaccess/MSAccessBatchReader.java
index 370cbd290b..735c2cc71f 100644
--- a/contrib/format-access/src/main/java/org/apache/drill/exec/store/msaccess/MSAccessBatchReader.java
+++ b/contrib/format-access/src/main/java/org/apache/drill/exec/store/msaccess/MSAccessBatchReader.java
@@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
 import java.time.LocalDateTime;
@@ -155,6 +156,9 @@ public class MSAccessBatchReader implements ManagedReader {
           drillDataType = MinorType.BIT;
           break;
         case BYTE:
+          builder.addNullable(columnName, MinorType.TINYINT);
+          drillDataType = MinorType.TINYINT;
+          break;
         case INT:
           builder.addNullable(columnName, MinorType.SMALLINT);
           drillDataType = MinorType.SMALLINT;
@@ -172,6 +176,10 @@ public class MSAccessBatchReader implements ManagedReader {
           builder.addNullable(columnName, MinorType.FLOAT4);
           drillDataType = MinorType.FLOAT4;
           break;
+        case DOUBLE:
+          builder.addNullable(columnName, MinorType.FLOAT8);
+          drillDataType = MinorType.FLOAT8;
+          break;
         case MEMO:
         case TEXT:
         case GUID:
@@ -179,10 +187,9 @@ public class MSAccessBatchReader implements ManagedReader {
           drillDataType = MinorType.VARCHAR;
           break;
         case MONEY:
-        case DOUBLE:
         case NUMERIC:
-          builder.addNullable(columnName, MinorType.FLOAT8);
-          drillDataType = MinorType.FLOAT8;
+          builder.addNullable(columnName, MinorType.VARDECIMAL);
+          drillDataType = MinorType.VARDECIMAL;
           break;
         case OLE:
         case BINARY:
@@ -292,6 +299,10 @@ public class MSAccessBatchReader implements ManagedReader {
           Short shortValue = next.getShort(col.columnName);
           rowWriter.scalar(col.columnName).setInt(shortValue);
           break;
+        case TINYINT:
+          Byte byteValue = next.getByte(col.columnName);
+          rowWriter.scalar(col.columnName).setInt(byteValue);
+          break;
         case BIGINT:
         case INT:
           Integer intValue = next.getInt(col.columnName);
@@ -309,6 +320,10 @@ public class MSAccessBatchReader implements ManagedReader {
           Double doubleValue = next.getDouble(col.columnName);
           rowWriter.scalar(col.columnName).setDouble(doubleValue);
           break;
+        case VARDECIMAL:
+          BigDecimal bigDecimal = next.getBigDecimal(col.columnName);
+          rowWriter.scalar(col.columnName).setDecimal(bigDecimal);
+          break;
         case VARCHAR:
           String stringValue = next.getString(col.columnName);
           if (StringUtils.isNotEmpty(stringValue)) {
@@ -322,8 +337,8 @@ public class MSAccessBatchReader implements ManagedReader {
           }
           break;
         case VARBINARY:
-          byte[] byteValue = next.getBytes(col.columnName);
-          rowWriter.scalar(col.columnName).setBytes(byteValue, byteValue.length);
+          byte[] byteValueArray = next.getBytes(col.columnName);
+          rowWriter.scalar(col.columnName).setBytes(byteValueArray, byteValueArray.length);
           break;
       }
     }
diff --git a/contrib/format-access/src/test/java/org/apache/drill/exec/store/msaccess/TestMSAccessReader.java b/contrib/format-access/src/test/java/org/apache/drill/exec/store/msaccess/TestMSAccessReader.java
index b170df8710..e05e57f814 100644
--- a/contrib/format-access/src/test/java/org/apache/drill/exec/store/msaccess/TestMSAccessReader.java
+++ b/contrib/format-access/src/test/java/org/apache/drill/exec/store/msaccess/TestMSAccessReader.java
@@ -95,6 +95,32 @@ public class TestMSAccessReader extends ClusterTest {
     new RowSetComparison(expected).verifyAndClearAll(results);
   }
 
+  @Test
+  public void testStarQueryWithDataTypes() throws Exception {
+    String sql = "SELECT * " +
+        "FROM table(cp.`data/V2010/testV2010.accdb` (type=> 'msaccess', tableName => 'Table1')) LIMIT 5";
+    RowSet results = client.queryBuilder().sql(sql).rowSet();
+
+    TupleMetadata expectedSchema = new SchemaBuilder()
+        .addNullable("A", MinorType.VARCHAR)
+        .addNullable("B", MinorType.VARCHAR)
+        .addNullable("C", MinorType.TINYINT)
+        .addNullable("D", MinorType.SMALLINT)
+        .addNullable("E", MinorType.INT)
+        .addNullable("F", MinorType.FLOAT8)
+        .addNullable("G", MinorType.TIMESTAMP)
+        .addNullable("H", MinorType.VARDECIMAL)
+        .addNullable("I", MinorType.BIT)
+        .buildSchema();
+
+    RowSet expected = new RowSetBuilder(client.allocator(), expectedSchema)
+        .addRow("a", "b", 0, 0, 0, 0.0, QueryTestUtil.ConvertDateToLong("1981-12-12T00:00:00Z"), 0, false)
+        .addRow("abcdefg", "hijklmnop", 2, 222, 333333333, 444.555, QueryTestUtil.ConvertDateToLong("1974-09-21T00:00:00Z"), 4, true)
+        .build();
+
+    new RowSetComparison(expected).verifyAndClearAll(results);
+  }
+
   @Test
   public void testMetadataStarQuery() throws Exception {
     String sql = "SELECT * FROM cp.`data/V2019/extDateTestV2019.accdb`";