diff options
author | Jinfeng Ni <jni@maprtech.com> | 2014-08-29 14:17:13 -0700 |
---|---|---|
committer | Jacques Nadeau <jacques@apache.org> | 2014-08-29 17:51:47 -0700 |
commit | fa3c8d52a9da0913cc734ff8d3f3968d0e25fab8 (patch) | |
tree | 8e633019c5029e67f13d2b332ee1809569f755b3 /exec/java-exec/src | |
parent | 64e43d2b770cb420b8f4fa9cf390b07efa5da44e (diff) |
DRILL-1299: Enable short circuit evaluation for case expressions in the run-time generated code.
Diffstat (limited to 'exec/java-exec/src')
-rw-r--r-- | exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java | 10 | ||||
-rw-r--r-- | exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java | 4 |
2 files changed, 14 insertions, 0 deletions
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 cf3924640..de71eec0c 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(); 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 57d4043c5..58a18137b 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` ;"); + } } |