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