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 {
}
}
}
-
}