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 e70a176  Drill-7813: Excel Reader Crashes on Formulae Which Return 
Strings
e70a176 is described below

commit e70a176739bb0e2711333ebdf806c1e12a9c6113
Author: Charles Givre <[email protected]>
AuthorDate: Tue Dec 1 14:08:30 2020 -0500

    Drill-7813: Excel Reader Crashes on Formulae Which Return Strings
---
 .../drill/exec/store/excel/ExcelBatchReader.java   |  10 ++++-
 .../drill/exec/store/excel/TestExcelFormat.java    |  41 +++++++++++++++++++++
 .../src/test/resources/excel/numeric-formula.xlsx  | Bin 0 -> 9208 bytes
 .../src/test/resources/excel/text-formula.xlsx     | Bin 0 -> 9260 bytes
 4 files changed, 50 insertions(+), 1 deletion(-)

diff --git 
a/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelBatchReader.java
 
b/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelBatchReader.java
index 1df4071..82901f1 100644
--- 
a/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelBatchReader.java
+++ 
b/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelBatchReader.java
@@ -459,7 +459,15 @@ public class ExcelBatchReader implements 
ManagedReader<FileSchemaNegotiator> {
     } else if (cellType == CellType.NUMERIC && 
DateUtil.isCellDateFormatted(cell)) {
       // Case if the column is a date or time
       addColumnToArray(rowWriter, excelFieldNames.get(colPosition), 
MinorType.TIMESTAMP, false);
-    } else if (cellType == CellType.NUMERIC || cellType == CellType.FORMULA || 
cellType == CellType.BLANK || cellType == CellType._NONE) {
+    } else if (cellType == CellType.FORMULA) {
+      // Cells with formulae can return either strings or numbers.
+      CellType formulaCellType = cell.getCachedFormulaResultType();
+      if (formulaCellType == CellType.STRING) {
+        addColumnToArray(rowWriter, excelFieldNames.get(colPosition), 
MinorType.VARCHAR, false);
+      } else {
+        addColumnToArray(rowWriter, excelFieldNames.get(colPosition), 
MinorType.FLOAT8, false);
+      }
+    } else if (cellType == CellType.NUMERIC || cellType == CellType.BLANK || 
cellType == CellType._NONE) {
       // Case if the column is numeric
       addColumnToArray(rowWriter, excelFieldNames.get(colPosition), 
MinorType.FLOAT8, false);
     } else {
diff --git 
a/contrib/format-excel/src/test/java/org/apache/drill/exec/store/excel/TestExcelFormat.java
 
b/contrib/format-excel/src/test/java/org/apache/drill/exec/store/excel/TestExcelFormat.java
index 934f78c..b79108b 100644
--- 
a/contrib/format-excel/src/test/java/org/apache/drill/exec/store/excel/TestExcelFormat.java
+++ 
b/contrib/format-excel/src/test/java/org/apache/drill/exec/store/excel/TestExcelFormat.java
@@ -423,6 +423,47 @@ public class TestExcelFormat extends ClusterTest {
   }
 
   @Test
+  public void testTextFormula() throws Exception {
+    String sql = "SELECT * FROM cp.`excel/text-formula.xlsx`";
+
+    RowSet results = client.queryBuilder().sql(sql).rowSet();
+
+    TupleMetadata expectedSchema = new SchemaBuilder()
+      .addNullable("Grade", MinorType.VARCHAR)
+      .addNullable("Gender", MinorType.VARCHAR)
+      .addNullable("Combined", MinorType.VARCHAR)
+      .buildSchema();
+
+    RowSet expected = new RowSetBuilder(client.allocator(), expectedSchema)
+      .addRow("Seventh Grade", "Girls", "Seventh Grade Girls")
+      .addRow("Sixth Grade", "Girls", "Sixth Grade Girls")
+      .addRow("Fourth Grade", "Girls", "Fourth Grade Girls")
+      .build();
+
+    new RowSetComparison(expected).verifyAndClearAll(results);
+  }
+
+  @Test
+  public void testNumericFormula() throws Exception {
+    String sql = "SELECT * FROM cp.`excel/numeric-formula.xlsx`";
+
+    RowSet results = client.queryBuilder().sql(sql).rowSet();
+    TupleMetadata expectedSchema = new SchemaBuilder()
+      .addNullable("col1", MinorType.FLOAT8)
+      .addNullable("col2", MinorType.FLOAT8)
+      .addNullable("calc", MinorType.FLOAT8)
+      .buildSchema();
+
+    RowSet expected = new RowSetBuilder(client.allocator(), expectedSchema)
+      .addRow(2.0, 8.0, 256.0)
+      .addRow(4.0, 6.0, 4096.0)
+      .addRow(6.0, 4.0, 1296.0)
+      .build();
+
+    new RowSetComparison(expected).verifyAndClearAll(results);
+  }
+
+  @Test
   public void testLimitPushdown() throws Exception {
     String sql = "SELECT id, first_name, order_count FROM 
cp.`excel/test_data.xlsx` LIMIT 5";
 
diff --git a/contrib/format-excel/src/test/resources/excel/numeric-formula.xlsx 
b/contrib/format-excel/src/test/resources/excel/numeric-formula.xlsx
new file mode 100644
index 0000000..6d65a55
Binary files /dev/null and 
b/contrib/format-excel/src/test/resources/excel/numeric-formula.xlsx differ
diff --git a/contrib/format-excel/src/test/resources/excel/text-formula.xlsx 
b/contrib/format-excel/src/test/resources/excel/text-formula.xlsx
new file mode 100644
index 0000000..9cce25e
Binary files /dev/null and 
b/contrib/format-excel/src/test/resources/excel/text-formula.xlsx differ

Reply via email to