You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/04/08 10:19:30 UTC

git commit: TAJO-728: Supports expression IN statement. (hyunsik)

Repository: tajo
Updated Branches:
  refs/heads/master 8824ba559 -> 8b5361a06


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/8b5361a0
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/8b5361a0
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/8b5361a0

Branch: refs/heads/master
Commit: 8b5361a0699406b684bc755bc86957d92a08d6c0
Parents: 8824ba5
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue Apr 8 17:13:36 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue Apr 8 17:13:36 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/8b5361a0/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index cd3a189..9412ae4 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/8b5361a0/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/8b5361a0/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/8b5361a0/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<Expr> {
   @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<Expr> {
       List<ListPartitionSpecifier> 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/8b5361a0/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<ExprAnnotator.Context, Eva
   @Override
   public EvalNode visitValueListExpr(Context ctx, Stack<Expr> 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/8b5361a0/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
   //////////////////////////////////////////////////////////////////