Return-Path: X-Original-To: apmail-tajo-commits-archive@minotaur.apache.org Delivered-To: apmail-tajo-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 847D710213 for ; Tue, 8 Apr 2014 08:26:02 +0000 (UTC) Received: (qmail 94188 invoked by uid 500); 8 Apr 2014 08:26:02 -0000 Delivered-To: apmail-tajo-commits-archive@tajo.apache.org Received: (qmail 94162 invoked by uid 500); 8 Apr 2014 08:26:00 -0000 Mailing-List: contact commits-help@tajo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tajo.apache.org Delivered-To: mailing list commits@tajo.apache.org Received: (qmail 94145 invoked by uid 99); 8 Apr 2014 08:25:58 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Apr 2014 08:25:58 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id E27A694DC80; Tue, 8 Apr 2014 08:25:57 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hyunsik@apache.org To: commits@tajo.apache.org Message-Id: <1fc9d2534ff54cea8f1cefeb8c9c3fb7@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: TAJO-728: Supports expression IN statement. (hyunsik) Date: Tue, 8 Apr 2014 08:25:57 +0000 (UTC) Repository: tajo Updated Branches: refs/heads/branch-0.8.0 6e50b57c4 -> 22416a883 TAJO-728: Supports expression IN statement. (hyunsik) Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/22416a88 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/22416a88 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/22416a88 Branch: refs/heads/branch-0.8.0 Commit: 22416a883e6eb8089867f91012a9b88b34fe05b0 Parents: 6e50b57 Author: Hyunsik Choi Authored: Tue Apr 8 17:13:36 2014 +0900 Committer: Hyunsik Choi Committed: Tue Apr 8 17:19:59 2014 +0900 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ .../org/apache/tajo/engine/parser/SQLParser.g4 | 2 +- .../apache/tajo/engine/eval/EvalTreeUtil.java | 9 ++++++++ .../apache/tajo/engine/parser/SQLAnalyzer.java | 12 +++++------ .../tajo/engine/planner/ExprAnnotator.java | 9 +++++--- .../apache/tajo/engine/eval/TestPredicates.java | 22 +++++++++++++++++++- 6 files changed, 45 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 03ec046..0e7f8e3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -143,6 +143,8 @@ Release 0.8.0 - unreleased IMPROVEMENTS + TAJO-728: Supports expression IN statement. (hyunsik) + TAJO-725: Broadcast JOIN should supports multiple tables. (hyoungjunkim via jaehwa) TAJO-735: Remove multiple SLF4J bindings message. (hyoungjunkim via hyunsik) http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 index 825969a..f25b41f 100644 --- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 +++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 @@ -1192,7 +1192,7 @@ in_predicate_value ; in_value_list - : row_value_expression ( COMMA row_value_expression )* + : row_value_predicand ( COMMA row_value_predicand )* ; /* http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java index 1e2298c..0966ee0 100644 --- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java +++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java @@ -23,6 +23,7 @@ import com.google.common.collect.Sets; import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; +import org.apache.tajo.datum.Datum; import org.apache.tajo.engine.planner.Target; import org.apache.tajo.exception.InternalException; import org.apache.tajo.util.TUtil; @@ -324,4 +325,12 @@ public class EvalTreeUtil { return evalNode; } } + + public static boolean checkIfCanBeConstant(EvalNode evalNode) { + return findUniqueColumns(evalNode).size() == 0 && findDistinctAggFunction(evalNode).size() == 0; + } + + public static Datum evaluateImmediately(EvalNode evalNode) { + return evalNode.eval(null, null); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java index 35ad4c2..3edf768 100644 --- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java +++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java @@ -751,10 +751,10 @@ public class SQLAnalyzer extends SQLParserBaseVisitor { @Override public Expr visitIn_predicate_value(SQLParser.In_predicate_valueContext ctx) { if (checkIfExist(ctx.in_value_list())) { - int size = ctx.in_value_list().row_value_expression().size(); - Expr[] exprs = new Expr[size]; + int size = ctx.in_value_list().row_value_predicand().size(); + Expr [] exprs = new Expr[size]; for (int i = 0; i < size; i++) { - exprs[i] = visitRow_value_expression(ctx.in_value_list().row_value_expression(i)); + exprs[i] = visitRow_value_predicand(ctx.in_value_list().row_value_predicand(i)); } return new ValueListExpr(exprs); } else { @@ -1097,10 +1097,10 @@ public class SQLAnalyzer extends SQLParserBaseVisitor { List specifiers = Lists.newArrayList(); for (List_value_partitionContext listValuePartition : partitions) { - int size = listValuePartition.in_value_list().row_value_expression().size(); - Expr[] exprs = new Expr[size]; + int size = listValuePartition.in_value_list().row_value_predicand().size(); + Expr [] exprs = new Expr[size]; for (int i = 0; i < size; i++) { - exprs[i] = visitRow_value_expression(listValuePartition.in_value_list().row_value_expression(i)); + exprs[i] = visitRow_value_predicand(listValuePartition.in_value_list().row_value_predicand(i)); } specifiers.add(new ListPartitionSpecifier(listValuePartition.partition_name().getText(), new ValueListExpr(exprs))); http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java index 3d09597..1b57b98 100644 --- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java +++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java @@ -221,10 +221,13 @@ public class ExprAnnotator extends BaseAlgebraVisitor stack, ValueListExpr expr) throws PlanningException { Datum[] values = new Datum[expr.getValues().length]; - ConstEval [] constEvals = new ConstEval[expr.getValues().length]; + EvalNode [] evalNodes = new EvalNode[expr.getValues().length]; for (int i = 0; i < expr.getValues().length; i++) { - constEvals[i] = (ConstEval) visit(ctx, stack, expr.getValues()[i]); - values[i] = constEvals[i].getValue(); + evalNodes[i] = visit(ctx, stack, expr.getValues()[i]); + if (!EvalTreeUtil.checkIfCanBeConstant(evalNodes[i])) { + throw new PlanningException("Non constant values cannot be included in IN PREDICATE."); + } + values[i] = EvalTreeUtil.evaluateImmediately(evalNodes[i]); } return new RowConstantEval(values); } http://git-wip-us.apache.org/repos/asf/tajo/blob/22416a88/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java index db5cfc7..7811e69 100644 --- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java +++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java @@ -277,7 +277,7 @@ public class TestPredicates extends ExprTestBase { ////////////////////////////////////////////////////////////////// @Test - public void testInPredicate() throws IOException { + public void testInPredicateWithConstant() throws IOException { Schema schema2 = new Schema(); schema2.addColumn("col1", TEXT); schema2.addColumn("col2", TEXT); @@ -301,6 +301,26 @@ public class TestPredicates extends ExprTestBase { new String[]{"t"}); } + @Test + public void testInPredicateWithSimpleExprs() throws IOException { + Schema schema2 = new Schema(); + schema2.addColumn("col1", TEXT); + schema2.addColumn("col2", INT4); + schema2.addColumn("col3", TEXT); + + testEval(schema2, "table1", "abc,2,3", "select col1 in ('a'||'b'||'c'), col2 in (1 + 1, 2 * 10, 2003) from table1", + new String[]{"t","t"}); + + testEval(schema2, "table1", "abc,2,3", "select col1 in ('a'||'b'), col2 in ('1'::int, '2'::int, 3) from table1", + new String[]{"f","t"}); + + testEval(schema2, + "table1", + "abc,,3", + "select col1 in (reverse('cba')), (col2 in ('1'::int, '2'::int, 3)) is null from table1", + new String[]{"t","t"}); + } + ////////////////////////////////////////////////////////////////// // Null Predicate //////////////////////////////////////////////////////////////////