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 2013/12/10 05:07:01 UTC

git commit: TAJO-404: Tajo does not recognize boolean literal. (hyunsik)

Updated Branches:
  refs/heads/master ea5aa8f47 -> 34a296f95


TAJO-404: Tajo does not recognize boolean literal. (hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/34a296f9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/34a296f9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/34a296f9

Branch: refs/heads/master
Commit: 34a296f9549e988acf03313bb0abcab9d4495e64
Parents: ea5aa8f
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue Dec 10 13:05:29 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue Dec 10 13:06:43 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 ++
 .../org/apache/tajo/algebra/BooleanLiteral.java | 32 +++++++++++++++++++
 .../org/apache/tajo/algebra/LiteralValue.java   |  4 +--
 .../org/apache/tajo/engine/parser/SQLParser.g4  | 33 +++++++++++++-------
 .../tajo/engine/eval/BasicEvalNodeVisitor.java  | 25 +++++++++++++++
 .../org/apache/tajo/engine/eval/CastEval.java   |  4 +++
 .../tajo/engine/eval/EvalNodeVisitor2.java      |  4 +++
 .../apache/tajo/engine/parser/SQLAnalyzer.java  | 16 +++++++---
 .../tajo/engine/planner/LogicalPlanner.java     |  3 +-
 .../org/apache/tajo/master/GlobalEngine.java    |  2 ++
 .../tajo/engine/eval/TestSQLExpression.java     | 11 +++++++
 .../tajo/engine/query/TestInsertQuery.java      |  1 -
 12 files changed, 117 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 4b55a7c..4037859 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -129,6 +129,8 @@ Release 0.8.0 - unreleased
 
   BUG FIXES
 
+    TAJO-404: TAJO-404: Tajo does not recognize boolean literal. (hyunsik)
+
     TAJO-344: Tajo cannot recognize negative numeric expressions. (hyunsik)
 
     TAJO-393: Unit tests must use test-data directory. (hyunsik)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-algebra/src/main/java/org/apache/tajo/algebra/BooleanLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BooleanLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BooleanLiteral.java
new file mode 100644
index 0000000..84586e7
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BooleanLiteral.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.algebra;
+
+public class BooleanLiteral extends LiteralValue {
+  public static final String TRUE = "TRUE";
+  public static final String FALSE = "FALSE";
+
+  public BooleanLiteral(boolean value) {
+    super(value ? TRUE : FALSE, LiteralType.Boolean);
+  }
+
+  public boolean isTrue() {
+    return value.equals(TRUE);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
index 4f106f2..9d8d71a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
@@ -19,8 +19,8 @@
 package org.apache.tajo.algebra;
 
 public class LiteralValue extends Expr {
-  private LiteralType valueType;
-  private String value;
+  protected LiteralType valueType;
+  protected String value;
 
   public static enum LiteralType {
     Boolean,

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/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 c806846..c55c195 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
@@ -171,6 +171,26 @@ drop_table_statement
 
 /*
 ===============================================================================
+  5.3 <literal>
+===============================================================================
+*/
+
+unsigned_literal
+  : unsigned_numeric_literal
+  | general_literal
+  ;
+
+general_literal
+  : Character_String_Literal
+  | boolean_literal
+  ;
+
+boolean_literal
+  : TRUE | FALSE | UNKNOWN
+  ;
+
+/*
+===============================================================================
   6.1 <data types>
 ===============================================================================
 */
@@ -288,15 +308,6 @@ unsigned_value_specification
   : unsigned_literal
   ;
 
-unsigned_literal
-  : unsigned_numeric_literal
-  | general_literal
-  ;
-
-general_literal
-  : Character_String_Literal
-  ;
-
 unsigned_numeric_literal
   : NUMBER
   | REAL_NUMBER
@@ -380,7 +391,7 @@ searched_case
   : CASE (searched_when_clause)+ (else_clause)? END
   ;
 
-simple_when_clause : WHEN numeric_value_expression THEN result ;
+simple_when_clause : WHEN search_condition THEN result ;
 
 searched_when_clause
   : WHEN c=search_condition THEN r=result
@@ -391,7 +402,7 @@ else_clause
   ;
 
 result
-  : numeric_value_expression | NULL
+  : value_expression | NULL
   ;
 
 /*

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
index 8643ba6..6053469 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
@@ -118,6 +118,13 @@ public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<C
         result = visitAggrFuncCall(context, (AggregationFunctionCallEval) evalNode, stack);
         break;
 
+      case SIGNED:
+        result = visitSigned(context, (SignedEval) evalNode, stack);
+        break;
+      case CAST:
+        result = visitCast(context, (CastEval) evalNode, stack);
+        break;
+
       default:
         throw new InvalidEvalException("Unknown EvalNode: " + evalNode);
     }
@@ -291,4 +298,22 @@ public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<C
   public RESULT visitAggrFuncCall(CONTEXT context, AggregationFunctionCallEval evalNode, Stack<EvalNode> stack) {
     return visitDefaultFunctionEval(context, stack, evalNode);
   }
+
+  @Override
+  public RESULT visitSigned(CONTEXT context, SignedEval signedEval, Stack<EvalNode> stack) {
+    RESULT result;
+    stack.push(signedEval);
+    result = visitChild(context, signedEval.getChild(), stack);
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitCast(CONTEXT context, CastEval signedEval, Stack<EvalNode> stack) {
+    RESULT result;
+    stack.push(signedEval);
+    result = visitChild(context, signedEval.getOperand(), stack);
+    stack.pop();
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CastEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CastEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CastEval.java
index de94051..5ccea39 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CastEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/CastEval.java
@@ -36,6 +36,10 @@ public class CastEval extends EvalNode {
     this.target = target;
   }
 
+  public EvalNode getOperand() {
+    return operand;
+  }
+
   @Override
   public EvalContext newContext() {
     CastContext castContext = new CastContext();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
index 5e9a509..a77c9ea 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
@@ -62,4 +62,8 @@ public interface EvalNodeVisitor2<CONTEXT, RESULT> {
   // Functions
   RESULT visitFuncCall(CONTEXT context, GeneralFunctionEval evalNode, Stack<EvalNode> stack);
   RESULT visitAggrFuncCall(CONTEXT context, AggregationFunctionCallEval evalNode, Stack<EvalNode> stack);
+
+  RESULT visitSigned(CONTEXT context, SignedEval signedEval, Stack<EvalNode> stack);
+
+  RESULT visitCast(CONTEXT context, CastEval signedEval, Stack<EvalNode> stack);
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/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 d8f259e..b05a860 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
@@ -430,7 +430,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     for (int i = 0; i < ctx.simple_when_clause().size(); i++) {
       Simple_when_clauseContext simpleWhenCtx = ctx.simple_when_clause(i);
       BinaryOperator bin = new BinaryOperator(OpType.Equals, leftTerm,
-          visitNumeric_value_expression(simpleWhenCtx.numeric_value_expression()));
+          visitValue_expression(simpleWhenCtx.search_condition().value_expression()));
       caseWhen.addWhen(bin, buildCaseResult(simpleWhenCtx.result()));
     }
     if (ctx.else_clause() != null) {
@@ -443,7 +443,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     if (result.NULL() != null) {
       return new NullValue();
     } else {
-      return visitNumeric_value_expression(result.numeric_value_expression());
+      return visitValue_expression(result.value_expression());
     }
   }
 
@@ -1216,8 +1216,16 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     if (checkIfExist(ctx.unsigned_numeric_literal())) {
       return visitUnsigned_numeric_literal(ctx.unsigned_numeric_literal());
     } else {
-      return new LiteralValue(stripQuote(ctx.general_literal().Character_String_Literal().getText()),
-          LiteralType.String);
+      return visitGeneral_literal(ctx.general_literal());
+    }
+  }
+
+  @Override
+  public Expr visitGeneral_literal(SQLParser.General_literalContext ctx) {
+    if (checkIfExist(ctx.Character_String_Literal())) {
+      return new LiteralValue(stripQuote(ctx.Character_String_Literal().getText()), LiteralType.String);
+    } else {
+      return new BooleanLiteral(checkIfExist(ctx.boolean_literal().TRUE()));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 5e48f4a..720de53 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@ -1051,8 +1051,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         LiteralValue literal = (LiteralValue) expr;
         switch (literal.getValueType()) {
           case Boolean:
-            char val = literal.getValue().charAt(0);
-            return new ConstEval(DatumFactory.createBool(val == 't' || val == 'T'));
+            return new ConstEval(DatumFactory.createBool(((BooleanLiteral)literal).isTrue()));
           case String:
             return new ConstEval(DatumFactory.createText(literal.getValue()));
           case Unsigned_Integer:

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 6ba93d0..2412637 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -493,7 +493,9 @@ public class GlobalEngine extends AbstractService {
       PlannerUtil.replaceNode(plan.getRootBlock().getRoot(), storeNode, NodeType.INSERT);
       plan.getRootBlock().refresh();
       LogicalPlan.QueryBlock subBlock = plan.getBlock(insertNode.getSubQuery());
+      // remove the sub block and connection from a block graph.
       plan.removeBlock(subBlock);
+      plan.getQueryBlockGraph().removeEdge(subBlock.getName(), LogicalPlan.ROOT_BLOCK);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
index 7311bff..6c83b66 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
@@ -70,4 +70,15 @@ public class TestSQLExpression extends ExprTestBase {
     testEval(schema, "table1", "123,234", "select col1::float, col2::float from table1",
         new String[]{"123.0", "234.0"});
   }
+
+  @Test
+  public void testBooleanLiteral() throws IOException {
+    testSimpleEval("select true", new String[] {"t"});
+    testSimpleEval("select false", new String[] {"f"});
+
+    Schema schema = new Schema();
+    schema.addColumn("col1", TEXT);
+    schema.addColumn("col2", TEXT);
+    testEval(schema, "table1", "123,234", "select col1, col2 from table1 where true", new String[]{"123", "234"});
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/34a296f9/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
index b854d31..629ddb5 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
@@ -441,5 +441,4 @@ public class TestInsertQuery {
       }
     }
   }
-
 }