DRILL-1054: Handle return statement in function templates

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

Branch: refs/heads/master
Commit: 80c6ebb64c50b5af7ff8805a1179137c7ec48b1d
Parents: 827e51f
Author: Mehant Baid <[email protected]>
Authored: Sat Jun 21 17:41:21 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Wed Jun 25 17:45:04 2014 -0700

----------------------------------------------------------------------
 .../exec/expr/fn/ModifiedUnparseVisitor.java    | 10 ++++-
 .../drill/exec/expr/fn/impl/MathFunctions.java  |  1 +
 .../drill/jdbc/test/TestFunctionsQuery.java     | 41 ++++++++++++++++++++
 3 files changed, 51 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/80c6ebb6/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/ModifiedUnparseVisitor.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/ModifiedUnparseVisitor.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/ModifiedUnparseVisitor.java
index da0e9d7..c80493c 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/ModifiedUnparseVisitor.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/ModifiedUnparseVisitor.java
@@ -77,6 +77,7 @@ import org.codehaus.janino.util.AutoIndentWriter;
 public class ModifiedUnparseVisitor implements ComprehensiveVisitor {
     protected final AutoIndentWriter aiw;
     protected final PrintWriter      pw;
+    private         String           returnLabel;
 
     /**
      * Testing of parsing/unparsing.
@@ -215,9 +216,15 @@ public class ModifiedUnparseVisitor implements 
ComprehensiveVisitor {
          } else
          {
          this.pw.println(' ');
+         // Add labels to handle return statements within function templates
+         String[] fQCN = md.getDeclaringType().getClassName().split("\\.");
+         returnLabel = fQCN[fQCN.length - 1] + "_" + md.name;
+
+         this.pw.println(returnLabel + ": {");
          this.pw.print(AutoIndentWriter.INDENT);
          this.unparseStatements(md.optionalStatements);
          this.pw.print(AutoIndentWriter.UNINDENT);
+         this.pw.println("}");
          this.pw.print(' ');
          }
 
@@ -342,7 +349,8 @@ public class ModifiedUnparseVisitor implements 
ComprehensiveVisitor {
         this.pw.print(';');
     }
     public void visitReturnStatement(Java.ReturnStatement rs) {
-        this.pw.print("return");
+        this.pw.print("break " + returnLabel);
+      
         if (rs.optionalReturnValue != null) {
             this.pw.print(' ');
             this.unparse(rs.optionalReturnValue);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/80c6ebb6/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
index 0492a6e..cc1eab9 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
@@ -50,6 +50,7 @@ public class MathFunctions{
     
     public void eval(){
       out.value = -input.value;
+      return;
     }
 
   }  

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/80c6ebb6/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git 
a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java 
b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index 8660579..62efd37 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -585,4 +585,45 @@ public class TestFunctionsQuery {
             "DEC38_2=1000000000000000000; " +
             "DEC38_3=1000000000.000000000000000000\n");
   }
+
+  @Test
+  public void testOptiqDecimalCapping() throws Exception {
+    String query = "select  cast('12345.678900000' as decimal(18, 
9))=cast('12345.678900000' as decimal(38, 9)) as CMP " +
+                   "from cp.`employee.json` where employee_id = 1";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "CMP=true\n");
+  }
+
+  @Test
+  public void testDecimalRoundUp() throws Exception {
+    String query = "select cast('999999999999999999.9999999999999999995' as 
decimal(38, 18)) as DEC38_1, " +
+                   "cast('999999999999999999.9999999999999999994' as 
decimal(38, 18)) as DEC38_2, " +
+                   "cast('999999999999999999.1234567895' as decimal(38, 9)) as 
DEC38_3, " +
+                   "cast('99999.12345' as decimal(18, 4)) as DEC18_1, " +
+                   "cast('99999.99995' as decimal(18, 4)) as DEC18_2 " +
+                   "from cp.`employee.json` where employee_id = 1";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "DEC38_1=1000000000000000000.000000000000000000; " +
+            "DEC38_2=999999999999999999.999999999999999999; " +
+            "DEC38_3=999999999999999999.123456790; " +
+            "DEC18_1=99999.1235; " +
+            "DEC18_2=100000.0000\n");
+  }
+
+  @Test
+  public void testNegative() throws Exception {
+    String query = "select  negative(2) as NEG " +
+                   "from cp.`employee.json` where employee_id = 1";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "NEG=-2\n");
+  }
 }

Reply via email to