DRILL-482 : Return null value if cast function input is a null expression.

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

Branch: refs/heads/master
Commit: 817bea53995f7d003ffa30d67d2dbf237d430a3c
Parents: bc0bb4d
Author: Jinfeng Ni <[email protected]>
Authored: Fri Jun 13 13:27:31 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Mon Jun 16 07:58:26 2014 -0700

----------------------------------------------------------------------
 .../apache/drill/exec/expr/ExpressionTreeMaterializer.java   | 7 +++++--
 .../src/test/java/org/apache/drill/TestExampleQueries.java   | 8 +++++++-
 2 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/817bea53/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
index 9b80dc0..ef6e6dc 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
@@ -459,10 +459,13 @@ public class ExpressionTreeMaterializer {
 
       if(castEqual(e.getPosition(), newMajor, input.getMajorType())) return 
input; // don't do pointless cast.
 
-      if(newMinor == MinorType.LATE || newMinor == MinorType.NULL){
+      if(newMinor == MinorType.LATE){
         // if the type still isn't fully bound, leave as cast expression.
         return new CastExpression(input, e.getMajorType(), e.getPosition());
-      }else{
+      } else if (newMinor == MinorType.NULL) {
+        // if input is a NULL expression, remove cast expression and return a 
TypedNullConstant directly.  
+        return new 
TypedNullConstant(Types.optional(e.getMajorType().getMinorType()));
+      } else {
         // if the type is fully bound, convert to functioncall and materialze 
the function.
         MajorType type = e.getMajorType();
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/817bea53/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java 
b/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
index 2fcc4fb..783c562 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
@@ -23,7 +23,7 @@ import org.junit.Test;
 
 public class TestExampleQueries extends BaseTestQuery{
   static final org.slf4j.Logger logger = 
org.slf4j.LoggerFactory.getLogger(TestExampleQueries.class);
-
+  
   @Test // see DRILL-553
   public void testQueryWithNullValues() throws Exception {
     test("select count(*) from cp.`customer.json` limit 1");
@@ -188,5 +188,11 @@ public class TestExampleQueries extends BaseTestQuery{
   public void testUnionAll6() throws Exception {
     test("select n_nationkey, n_regionkey from cp.`tpch/nation.parquet` where 
n_regionkey = 1 union all select r_regionkey, r_regionkey from 
cp.`tpch/region.parquet` where r_regionkey = 2");
   }  
+
+  @Test
+  // cast non-exist column from json file. Should return null value. 
+  public void testDrill428() throws Exception {
+    test("select cast(NON_EXIST_COL as varchar(10)) from cp.`employee.json` 
limit 2; ");
+  }
   
 }

Reply via email to