DRILL-6020: Fix NullPointerException when querying JSON untyped path with Union 
setting on

closes #1068


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/b4ffa401
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/b4ffa401
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/b4ffa401

Branch: refs/heads/master
Commit: b4ffa40127c040d2f8d9ebe2fd4623dfac8c7724
Parents: ce80da8
Author: mitchel <mitchellabo...@hotmail.com>
Authored: Tue Dec 12 09:57:55 2017 -0500
Committer: Arina Ielchiieva <arina.yelchiy...@gmail.com>
Committed: Tue Jan 2 15:54:05 2018 +0200

----------------------------------------------------------------------
 .../drill/exec/vector/complex/FieldIdUtil.java  | 32 ++++++++++++--------
 .../vector/complex/writer/TestJsonReader.java   | 28 +++++++++++++++++
 2 files changed, 48 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/b4ffa401/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
index 2d3c13c..6e72b6e 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
@@ -31,21 +31,29 @@ public class FieldIdUtil {
   static final org.slf4j.Logger logger = 
org.slf4j.LoggerFactory.getLogger(FieldIdUtil.class);
 
   public static TypedFieldId getFieldIdIfMatchesUnion(UnionVector unionVector, 
TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    if (seg.isNamed()) {
-      ValueVector v = unionVector.getMap();
-      if (v != null) {
-        return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
-      } else {
-        return null;
+    if (seg != null) {
+      if (seg.isNamed()) {
+        ValueVector v = unionVector.getMap();
+        if (v != null) {
+          return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
+        } else {
+          return null;
+        }
+      } else if (seg.isArray()) {
+        ValueVector v = unionVector.getList();
+        if (v != null) {
+          return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
+        } else {
+          return null;
+        }
       }
-    } else if (seg.isArray()) {
-      ValueVector v = unionVector.getList();
-      if (v != null) {
-        return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
-      } else {
-        return null;
+    } else {
+      if (addToBreadCrumb) {
+        builder.intermediateType(unionVector.getField().getType());
       }
+      return builder.finalType(unionVector.getField().getType()).build();
     }
+
     return null;
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/b4ffa401/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
 
b/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
index 3e3580f..da1cddb 100644
--- 
a/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
+++ 
b/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
@@ -35,6 +35,8 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.zip.GZIPOutputStream;
 
+import org.apache.drill.exec.util.JsonStringHashMap;
+import org.apache.drill.exec.util.Text;
 import org.apache.drill.test.BaseTestQuery;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.util.DrillFileUtils;
@@ -720,4 +722,30 @@ public class TestJsonReader extends BaseTestQuery {
       .baselineValues("1", "2", "1", null, "a")
       .go();
   }
+
+  @Test // DRILL-6020
+  public void testUntypedPathWithUnion() throws Exception {
+    String fileName = "table.json";
+    try (BufferedWriter writer = new BufferedWriter(new FileWriter(new 
File(dirTestWatcher.getRootDir(), fileName)))) {
+      writer.write("{\"rk\": {\"a\": {\"b\": \"1\"}}}");
+      writer.write("{\"rk\": {\"a\": \"2\"}}");
+    }
+
+    JsonStringHashMap<String, Text> map = new JsonStringHashMap<>();
+    map.put("b", new Text("1"));
+
+    try {
+      testBuilder()
+        .sqlQuery("select t.rk.a as a from dfs.`%s` t", fileName)
+        .ordered()
+        .optionSettingQueriesForTestQuery("alter session set 
`exec.enable_union_type`=true")
+        .baselineColumns("a")
+        .baselineValues(map)
+        .baselineValues("2")
+        .go();
+
+    } finally {
+      testNoResult("alter session reset `exec.enable_union_type`");
+    }
+  }
 }

Reply via email to