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`"); + } + } }