Drill 1416: convert_from() on JSON fails - regression

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

Branch: refs/heads/master
Commit: e22803a1d80fd47a39066c525c5598e7501db73a
Parents: 130e24a
Author: Jason Altekruse <altekruseja...@gmail.com>
Authored: Mon Sep 15 16:49:06 2014 -0700
Committer: Steven Phillips <sphill...@maprtech.com>
Committed: Mon Sep 29 18:21:44 2014 -0700

----------------------------------------------------------------------
 .../src/main/codegen/templates/NullReader.java  | 14 ++++++-
 .../drill/exec/expr/EvaluationVisitor.java      | 10 ++++-
 .../physical/impl/TestConvertFunctions.java     |  7 ++++
 .../src/test/resources/store/json/input2.json   | 39 ++++++++++++++++++++
 .../json_project_null_object_from_list.json     | 10 +++++
 5 files changed, 78 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/main/codegen/templates/NullReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/NullReader.java 
b/exec/java-exec/src/main/codegen/templates/NullReader.java
index b246e36..a0e5f50 100644
--- a/exec/java-exec/src/main/codegen/templates/NullReader.java
+++ b/exec/java-exec/src/main/codegen/templates/NullReader.java
@@ -26,18 +26,30 @@ package org.apache.drill.exec.vector.complex.impl;
 
 <#include "/@includes/vv_imports.ftl" />
 
+import org.apache.drill.common.types.TypeProtos;
+
+
 @SuppressWarnings("unused")
 public class NullReader extends AbstractBaseReader implements FieldReader{
   
   public static final NullReader INSTANCE = new NullReader();
+  public static final NullReader EMPTY_LIST_INSTANCE = new 
NullReader(Types.repeated(TypeProtos.MinorType.NULL));
+  public static final NullReader EMPTY_MAP_INSTANCE = new 
NullReader(Types.required(TypeProtos.MinorType.MAP));
+  private MajorType type;
   
   private NullReader(){
     super();
+    type = Types.NULL;
+  }
+
+  private NullReader(MajorType type){
+    super();
+    this.type = type;
   }
 
   @Override
   public MajorType getType() {
-    return Types.NULL;
+    return type;
   }
   
   public void copyAsValue(MapWriter writer) {}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
index 6280c40..d1e10ae 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
@@ -442,7 +442,15 @@ public class EvaluationVisitor {
             JConditional jc = 
generator.getEvalBlock()._if(isNull.eq(JExpr.lit(0)));
 
             JClass nrClass = 
generator.getModel().ref(org.apache.drill.exec.vector.complex.impl.NullReader.class);
-            JExpression nullReader = nrClass.staticRef("INSTANCE");
+            JExpression nullReader;
+            if (complex) {
+              nullReader = nrClass.staticRef("EMPTY_MAP_INSTANCE");
+            } else if (repeated) {
+              nullReader = nrClass.staticRef("EMPTY_LIST_INSTANCE");
+            } else {
+              nullReader = nrClass.staticRef("INSTANCE");
+            }
+
 
             jc._then().assign(complexReader, expr);
             jc._else().assign(complexReader, nullReader);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java
 
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java
index c64c7a3..2c03b69 100644
--- 
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java
+++ 
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java
@@ -64,6 +64,13 @@ public class TestConvertFunctions extends BaseTestQuery {
   String textFileContent;
 
   @Test
+  public void test_JSON_convertTo_empty_list_drill_1416() throws Exception {
+    test("select cast(convert_to(rl[1], 'JSON') as varchar(100)) from 
cp.`/store/json/input2.json`");
+    test("select convert_from(convert_to(rl[1], 'JSON'), 'JSON') from 
cp.`/store/json/input2.json`");
+    test("select convert_from(convert_to(rl[1], 'JSON'), 'JSON') from 
cp.`/store/json/json_project_null_object_from_list.json`");
+  }
+
+  @Test
   public void testDateTime1() throws Throwable {
     verifyPhysicalPlan("(convert_from(binary_string('" + DATE_TIME_BE + "'), 
'TIME_EPOCH_BE'))", time);
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/resources/store/json/input2.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/store/json/input2.json 
b/exec/java-exec/src/test/resources/store/json/input2.json
new file mode 100644
index 0000000..587732c
--- /dev/null
+++ b/exec/java-exec/src/test/resources/store/json/input2.json
@@ -0,0 +1,39 @@
+{ "integer" : 2010,
+"float" : 17.4,
+"x":
+{ "y": "kevin", "z": "paul" }
+,
+"z": [
+{"orange" : "yellow" , "pink": "red"}
+,
+{"pink" : "purple" }
+],
+"l": [4,2],
+"rl": [ [2,1], [4,6] ]
+}
+
+{ "integer" : -2002, "float" : -1.2 }
+
+{ "integer" : 2001,
+"float" : 1.2,
+"x":
+{ "y": "bill", "z": "peter" }
+,
+"z": [
+{"pink" : "lilac" }
+],
+"l": [4,2],
+"rl": [ [2,1], [4,6] ]
+}
+
+{ "integer" : 6005,
+"float" : 1.2,
+"x":
+{ "y": "mike", "z": "mary" }
+,
+"z": [
+{"orange" : "stucco" }
+],
+"l": [4,2],
+"rl": [ [2,1], [4,6] ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json
 
b/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json
new file mode 100644
index 0000000..f09c366
--- /dev/null
+++ 
b/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json
@@ -0,0 +1,10 @@
+{
+"rl": [ { "f1" : 2, "f2" : 1}, { "f1" : 4, "f2" : 6} ]
+}
+{}
+{
+"rl": [ { "f1" : 4, "f2" : 7}, { "f1" : 11} ]
+}
+{
+"rl": [ { "f1" : 2, "f2" : 1}, { "f1" : 4, "f2" : 6} ]
+}
\ No newline at end of file

Reply via email to