Repository: incubator-drill Updated Branches: refs/heads/master 64e43d2b7 -> b094c4438
DRILL-1299: Enable short circuit evaluation for case expressions in the run-time generated code. Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/fa3c8d52 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/fa3c8d52 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/fa3c8d52 Branch: refs/heads/master Commit: fa3c8d52a9da0913cc734ff8d3f3968d0e25fab8 Parents: 64e43d2 Author: Jinfeng Ni <j...@maprtech.com> Authored: Fri Aug 29 14:17:13 2014 -0700 Committer: Jacques Nadeau <jacq...@apache.org> Committed: Fri Aug 29 17:51:47 2014 -0700 ---------------------------------------------------------------------- .../org/apache/drill/exec/expr/EvaluationVisitor.java | 10 ++++++++++ .../test/java/org/apache/drill/TestExampleQueries.java | 4 ++++ 2 files changed, 14 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fa3c8d52/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 cf39246..de71eec 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 @@ -160,7 +160,12 @@ public class EvaluationVisitor { } } + generator.nestEvalBlock(jc._then()); + HoldingContainer thenExpr = c.expression.accept(this, generator); + + generator.unNestEvalBlock(); + if (thenExpr.isOptional()) { JConditional newCond = jc._then()._if(thenExpr.getIsSet().ne(JExpr.lit(0))); JBlock b = newCond._then(); @@ -170,7 +175,12 @@ public class EvaluationVisitor { jc._then().assign(output.getHolder(), thenExpr.getHolder()); } + generator.nestEvalBlock(jc._else()); + HoldingContainer elseExpr = ifExpr.elseExpression.accept(this, generator); + + generator.unNestEvalBlock(); + if (elseExpr.isOptional()) { JConditional newCond = jc._else()._if(elseExpr.getIsSet().ne(JExpr.lit(0))); JBlock b = newCond._then(); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fa3c8d52/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 57d4043..58a1813 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 @@ -471,4 +471,8 @@ public class TestExampleQueries extends BaseTestQuery{ test("select t1.name, t1.kind, t2.n_nationkey from (select * from sys.options) t1 join (select * from cp.`tpch/nation.parquet`) t2 on t1.name = t2.n_name;"); } + @Test + public void testCase() throws Exception { + test("select case when n_nationkey > 0 and n_nationkey < 2 then concat(n_name, '_abc') when n_nationkey >=2 and n_nationkey < 4 then '_EFG' else concat(n_name,'_XYZ') end from cp.`tpch/nation.parquet` ;"); + } }