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/01/17 10:23:39 UTC

[09/12] git commit: TAJO-501: Rewrite the projection part of logical planning.

TAJO-501: Rewrite the projection part of logical planning.


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

Branch: refs/heads/master
Commit: 8e1f989aad27022371d1c973d5acea68568918db
Parents: b822c28
Author: Hyunsik Choi <hy...@apache.org>
Authored: Fri Jan 17 13:58:53 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Fri Jan 17 15:57:55 2014 +0900

----------------------------------------------------------------------
 .../org/apache/tajo/algebra/Aggregation.java    |   30 +-
 .../apache/tajo/algebra/BetweenPredicate.java   |    7 +
 .../org/apache/tajo/algebra/BinaryOperator.java |   10 +
 .../apache/tajo/algebra/CaseWhenPredicate.java  |   19 +
 .../java/org/apache/tajo/algebra/CastExpr.java  |   16 +-
 .../tajo/algebra/ColumnReferenceExpr.java       |   44 +-
 .../tajo/algebra/CountRowsFunctionExpr.java     |    5 +
 .../org/apache/tajo/algebra/CreateTable.java    |  127 +-
 .../org/apache/tajo/algebra/DataTypeExpr.java   |    7 +
 .../java/org/apache/tajo/algebra/DropTable.java |    7 +
 .../apache/tajo/algebra/ExistsPredicate.java    |   16 +-
 .../main/java/org/apache/tajo/algebra/Expr.java |    3 +
 .../org/apache/tajo/algebra/FunctionExpr.java   |    6 +
 .../tajo/algebra/GeneralSetFunctionExpr.java    |   11 +
 .../java/org/apache/tajo/algebra/Having.java    |    6 +
 .../java/org/apache/tajo/algebra/Insert.java    |    6 +
 .../apache/tajo/algebra/IsNullPredicate.java    |   15 +-
 .../main/java/org/apache/tajo/algebra/Join.java |   18 +-
 .../java/org/apache/tajo/algebra/Limit.java     |    6 +
 .../org/apache/tajo/algebra/LiteralValue.java   |    6 +
 .../java/org/apache/tajo/algebra/NamedExpr.java |   89 +
 .../org/apache/tajo/algebra/NullLiteral.java    |    5 +
 .../java/org/apache/tajo/algebra/OpType.java    |    2 +-
 .../tajo/algebra/PatternMatchPredicate.java     |   17 +-
 .../org/apache/tajo/algebra/Projection.java     |   13 +-
 .../java/org/apache/tajo/algebra/Relation.java  |   13 +-
 .../org/apache/tajo/algebra/RelationList.java   |    6 +
 .../org/apache/tajo/algebra/ScalarSubQuery.java |   10 +-
 .../java/org/apache/tajo/algebra/Selection.java |    5 +
 .../org/apache/tajo/algebra/SetOperation.java   |    5 +
 .../org/apache/tajo/algebra/SignedExpr.java     |    6 +
 .../tajo/algebra/SimpleTableSubQuery.java       |    9 +-
 .../main/java/org/apache/tajo/algebra/Sort.java |   25 +-
 .../tajo/algebra/TablePrimarySubQuery.java      |   10 +-
 .../org/apache/tajo/algebra/TargetExpr.java     |   67 -
 .../org/apache/tajo/algebra/UnaryOperator.java  |    6 +
 .../org/apache/tajo/algebra/ValueListExpr.java  |    6 +
 .../java/org/apache/tajo/algebra/TestExpr.java  |    9 +-
 .../java/org/apache/tajo/catalog/Column.java    |    8 +-
 .../java/org/apache/tajo/catalog/Schema.java    |  111 +-
 .../tajo/catalog/partition/PartitionDesc.java   |    6 +-
 .../org/apache/tajo/catalog/TestColumn.java     |    1 -
 .../org/apache/tajo/catalog/TestSchema.java     |    4 +-
 .../apache/tajo/catalog/store/HCatalogUtil.java |    3 +-
 .../java/org/apache/tajo/client/TajoClient.java |   12 +-
 .../java/org/apache/tajo/datum/Float8Datum.java |    5 +-
 .../java/org/apache/tajo/datum/TextDatum.java   |    2 +-
 .../org/apache/tajo/common/type/TestIPv4.java   |    8 +-
 .../org/apache/tajo/datum/TestBitDatum.java     |    4 +-
 .../org/apache/tajo/engine/parser/SQLParser.g4  |   14 +-
 .../apache/tajo/engine/eval/AlgebraicUtil.java  |    5 +
 .../org/apache/tajo/engine/eval/BinaryEval.java |    3 +-
 .../apache/tajo/engine/eval/CaseWhenEval.java   |    9 +-
 .../apache/tajo/engine/eval/EvalTreeUtil.java   |   35 +-
 .../org/apache/tajo/engine/eval/FieldEval.java  |   15 +-
 .../org/apache/tajo/engine/eval/InEval.java     |   11 +
 .../org/apache/tajo/engine/eval/IsNullEval.java |    5 +
 .../org/apache/tajo/engine/eval/NotEval.java    |    3 +-
 .../engine/exception/NoSuchColumnException.java |    2 +-
 .../tajo/engine/parser/HiveConverter.java       |   18 +-
 .../apache/tajo/engine/parser/SQLAnalyzer.java  |   39 +-
 .../tajo/engine/planner/AlgebraVisitor.java     |  112 +-
 .../tajo/engine/planner/BaseAlgebraVisitor.java |  256 +--
 .../engine/planner/BasicLogicalPlanVisitor.java |   12 +
 .../planner/ExplainLogicalPlanVisitor.java      |    5 +
 .../tajo/engine/planner/ExprAnnotator.java      |  622 ++++++
 .../apache/tajo/engine/planner/ExprFinder.java  |   72 +
 .../tajo/engine/planner/ExprNormalizer.java     |  259 +++
 .../tajo/engine/planner/GroupElement.java       |   21 +-
 .../apache/tajo/engine/planner/InsertNode.java  |   17 +-
 .../tajo/engine/planner/LogicalOptimizer.java   |   36 +-
 .../apache/tajo/engine/planner/LogicalPlan.java |  599 ++----
 .../engine/planner/LogicalPlanPreprocessor.java |  301 +++
 .../engine/planner/LogicalPlanVerifier.java     |    3 -
 .../tajo/engine/planner/LogicalPlanVisitor.java |    3 +
 .../tajo/engine/planner/LogicalPlanner.java     | 1873 +++++++++---------
 .../tajo/engine/planner/NamedExprsManager.java  |  271 +++
 .../engine/planner/PhysicalPlannerImpl.java     |   63 +-
 .../apache/tajo/engine/planner/PlannerUtil.java |  113 +-
 .../apache/tajo/engine/planner/Projector.java   |   66 +-
 .../engine/planner/RangePartitionAlgorithm.java |    3 +
 .../engine/planner/SimpleAlgebraVisitor.java    |  210 ++
 .../org/apache/tajo/engine/planner/Target.java  |   22 +-
 .../tajo/engine/planner/TargetListManager.java  |  234 ---
 .../engine/planner/global/GlobalPlanner.java    |   80 +-
 .../engine/planner/logical/CreateTableNode.java |   12 +-
 .../engine/planner/logical/DropTableNode.java   |    5 +-
 .../engine/planner/logical/EvalExprNode.java    |    3 +-
 .../engine/planner/logical/GroupbyNode.java     |   53 +-
 .../tajo/engine/planner/logical/HavingNode.java |   73 +
 .../engine/planner/logical/IndexScanNode.java   |    1 -
 .../tajo/engine/planner/logical/JoinNode.java   |   33 +-
 .../tajo/engine/planner/logical/LimitNode.java  |    7 +-
 .../tajo/engine/planner/logical/NodeType.java   |    1 +
 .../engine/planner/logical/Projectable.java     |    7 +
 .../engine/planner/logical/ProjectionNode.java  |    8 +-
 .../engine/planner/logical/RelationNode.java    |   10 +
 .../tajo/engine/planner/logical/ScanNode.java   |    1 +
 .../engine/planner/logical/SelectionNode.java   |    9 +-
 .../tajo/engine/planner/logical/SortNode.java   |   13 +-
 .../planner/logical/TableSubQueryNode.java      |   53 +-
 .../tajo/engine/planner/logical/UnionNode.java  |    8 +-
 .../engine/planner/logical/join/JoinGraph.java  |   69 +-
 .../planner/physical/AggregationExec.java       |   44 +-
 .../engine/planner/physical/BNLJoinExec.java    |  153 +-
 .../planner/physical/BSTIndexScanExec.java      |    2 +-
 .../physical/BasicPhysicalExecutorVisitor.java  |  201 +-
 .../engine/planner/physical/EvalExprExec.java   |    8 +-
 .../planner/physical/HashAggregateExec.java     |   20 +-
 .../planner/physical/HashFullOuterJoinExec.java |    2 +-
 .../engine/planner/physical/HashJoinExec.java   |   16 +-
 .../planner/physical/HashLeftOuterJoinExec.java |    2 +-
 .../engine/planner/physical/HavingExec.java     |   59 +
 .../physical/MergeFullOuterJoinExec.java        |    2 +-
 .../engine/planner/physical/MergeJoinExec.java  |    2 +-
 .../engine/planner/physical/NLJoinExec.java     |    2 +-
 .../planner/physical/NLLeftOuterJoinExec.java   |    2 +-
 .../physical/PhysicalExecutorVisitor.java       |   89 +-
 .../planner/physical/PhysicalPlanUtil.java      |    7 +-
 .../engine/planner/physical/ProjectionExec.java |    8 +-
 .../physical/RightOuterMergeJoinExec.java       |    2 +-
 .../engine/planner/physical/SelectionExec.java  |   21 +-
 .../engine/planner/physical/SeqScanExec.java    |    2 +-
 .../planner/rewrite/FilterPushDownRule.java     |    2 +-
 .../rewrite/PartitionedTableRewriter.java       |    7 +-
 .../planner/rewrite/ProjectionPushDownRule.java |  848 +++++---
 .../apache/tajo/engine/utils/SchemaUtil.java    |   24 +-
 .../org/apache/tajo/master/GlobalEngine.java    |   14 +-
 .../master/GreedyFragmentScheduleAlgorithm.java |    4 +-
 .../java/org/apache/tajo/master/TajoMaster.java |    2 -
 .../apache/tajo/engine/eval/ExprTestBase.java   |   38 +-
 .../apache/tajo/engine/eval/TestEvalTree.java   |  247 +--
 .../tajo/engine/eval/TestEvalTreeUtil.java      |   66 +-
 .../apache/tajo/engine/eval/TestPredicates.java |  233 ++-
 .../tajo/engine/parser/TestHiveConverter.java   |   12 -
 .../tajo/engine/planner/TestLogicalNode.java    |    6 +-
 .../tajo/engine/planner/TestLogicalPlan.java    |    2 +-
 .../tajo/engine/planner/TestLogicalPlanner.java |  106 +-
 .../tajo/engine/planner/TestPlannerUtil.java    |    2 -
 .../planner/physical/TestBSTIndexExec.java      |    6 +-
 .../planner/physical/TestHashAntiJoinExec.java  |    4 +-
 .../planner/physical/TestHashSemiJoinExec.java  |    1 -
 .../planner/physical/TestPhysicalPlanner.java   |   28 +-
 .../apache/tajo/engine/query/TestCTASQuery.java |    5 +-
 .../tajo/engine/query/TestGroupByQuery.java     |   29 +
 .../apache/tajo/engine/query/TestJoinQuery.java |   48 +-
 .../tajo/engine/query/TestSelectQuery.java      |   26 +-
 .../apache/tajo/engine/query/TestSortQuery.java |   19 +-
 .../tajo/engine/query/TestTablePartitions.java  |   18 +-
 .../tajo/engine/query/TestUnionQuery.java       |  135 ++
 .../org/apache/tajo/jdbc/TestResultSet.java     |    3 -
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java |    1 -
 .../tajo/master/TestExecutionBlockCursor.java   |    3 +-
 .../tajo/worker/TestRangeRetrieverHandler.java  |   26 +-
 .../worker/dataserver/TestHttpDataServer.java   |    2 -
 .../resources/dataset/TestJoinQuery/table1.tbl  |    5 +
 .../resources/dataset/TestJoinQuery/table2.tbl  |    4 +
 .../TestGroupByQuery/testGroupByNested1.sql     |    1 +
 .../TestGroupByQuery/testGroupByNested2.sql     |    1 +
 .../queries/TestJoinQuery/oj_table1_ddl.sql     |    6 +
 .../queries/TestJoinQuery/oj_table2_ddl.sql     |    6 +
 .../queries/TestJoinQuery/testCrossJoin.sql     |    2 +-
 .../TestJoinQuery/testCrossJoinAndCaseWhen.sql  |   18 +
 .../testCrossJoinWithExplicitJoinQual.sql       |    1 -
 .../TestJoinQuery/testJoinAndCaseWhen.sql       |   15 -
 .../queries/TestJoinQuery/testJoinRefEval.sql   |   12 +-
 .../TestJoinQuery/testOuterJoinAndCaseWhen1.sql |    9 +
 .../queries/TestJoinQuery/testTPCHQ2Join.sql    |    5 +
 .../TestJoinQuery/testWhereClauseJoin1.sql      |   10 +
 .../TestJoinQuery/testWhereClauseJoin2.sql      |    8 +
 .../TestJoinQuery/testWhereClauseJoin3.sql      |    9 +
 .../TestJoinQuery/testWhereClauseJoin4.sql      |    8 +
 .../TestJoinQuery/testWhereClauseJoin5.sql      |   15 +
 .../TestJoinQuery/testWhereClauseJoin6.sql      |   19 +
 .../TestSelectQuery/testSelectColumnAlias1.sql  |    1 +
 .../queries/TestSelectQuery/testUnion1.sql      |   19 -
 .../queries/TestSelectQuery/testUnion2.sql      |    9 -
 .../TestSortQuery/testSortAfterGroupby.sql      |    2 +-
 .../TestSortQuery/testSortWithAlias1.sql        |    1 +
 .../TestSortQuery/testSortWithAliasKey.sql      |    1 -
 .../queries/TestSortQuery/testSortWithExpr1.sql |    1 +
 .../queries/TestSortQuery/testSortWithExpr2.sql |    1 +
 .../queries/TestTPCH/testQ2FourJoins.sql        |   14 +-
 .../queries/TestTPCH/testTPCH14Expr.sql         |   11 +-
 .../queries/TestUnionQuery/testUnion1.sql       |   19 +
 .../queries/TestUnionQuery/testUnion10.sql      |  150 ++
 .../queries/TestUnionQuery/testUnion2.sql       |   18 +
 .../queries/TestUnionQuery/testUnion3.sql       |   19 +
 .../queries/TestUnionQuery/testUnion4.sql       |   16 +
 .../queries/TestUnionQuery/testUnion5.sql       |   20 +
 .../queries/TestUnionQuery/testUnion6.sql       |   15 +
 .../queries/TestUnionQuery/testUnion7.sql       |   18 +
 .../queries/TestUnionQuery/testUnion8.sql       |   24 +
 .../queries/TestUnionQuery/testUnion9.sql       |   29 +
 .../TestGroupByQuery/testGroupByNested1.result  |    6 +
 .../TestGroupByQuery/testGroupByNested2.result  |    6 +
 .../results/TestJoinQuery/testCrossJoin.result  |  200 +-
 .../testCrossJoinAndCaseWhen.result             |   27 +
 .../testCrossJoinWithExplicitJoinQual.result    |   27 -
 .../TestJoinQuery/testJoinAndCaseWhen.result    |   27 -
 .../TestJoinQuery/testJoinRefEval.result        |   28 +-
 .../testOuterJoinAndCaseWhen1.result            |    7 +
 .../results/TestJoinQuery/testTPCHQ2Join.result |    2 +-
 .../TestJoinQuery/testWhereClauseJoin1.result   |   27 +
 .../TestJoinQuery/testWhereClauseJoin2.result   |   27 +
 .../TestJoinQuery/testWhereClauseJoin3.result   |   27 +
 .../TestJoinQuery/testWhereClauseJoin4.result   |   27 +
 .../TestJoinQuery/testWhereClauseJoin5.result   |    5 +
 .../testSelectColumnAlias1.result               |    7 +
 .../TestSortQuery/testSortAfterGroupby.result   |    2 +-
 .../TestSortQuery/testSortWithAlias1.result     |    7 +
 .../TestSortQuery/testSortWithAliasKey.result   |    7 -
 .../TestSortQuery/testSortWithExpr1.result      |    7 +
 .../TestSortQuery/testSortWithExpr2.result      |    7 +
 .../results/TestUnionQuery/testUnion1.result    |   10 +
 .../results/TestUnionQuery/testUnion10.result   |   22 +
 .../results/TestUnionQuery/testUnion2.result    |   12 +
 .../results/TestUnionQuery/testUnion3.result    |    4 +
 .../results/TestUnionQuery/testUnion4.result    |    3 +
 .../results/TestUnionQuery/testUnion5.result    |    3 +
 .../results/TestUnionQuery/testUnion6.result    |    3 +
 .../results/TestUnionQuery/testUnion7.result    |   12 +
 .../results/TestUnionQuery/testUnion8.result    |    3 +
 .../results/TestUnionQuery/testUnion9.result    |    7 +
 .../org/apache/tajo/storage/v2/DiskUtil.java    |    1 -
 225 files changed, 6843 insertions(+), 3480 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
index 72acaa9..affb3bb 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
@@ -18,10 +18,11 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Aggregation extends UnaryOperator {
-  private TargetExpr[] targets;
+  private NamedExpr[] targets;
   private GroupElement [] groups;
   private Expr havingCondition;
 
@@ -29,11 +30,11 @@ public class Aggregation extends UnaryOperator {
     super(OpType.Aggregation);
   }
 
-  public TargetExpr[] getTargets() {
+  public NamedExpr[] getTargets() {
     return this.targets;
   }
 
-  public void setTargets(TargetExpr[] targets) {
+  public void setTargets(NamedExpr[] targets) {
     this.targets = targets;
   }
 
@@ -62,6 +63,11 @@ public class Aggregation extends UnaryOperator {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(targets, groups, havingCondition);
+  }
+
+  @Override
   public boolean equalsTo(Expr expr) {
     Aggregation another = (Aggregation) expr;
     boolean a = TUtil.checkEquals(groups, another.groups);
@@ -73,19 +79,19 @@ public class Aggregation extends UnaryOperator {
 
   public static class GroupElement implements JsonSerializable {
     private GroupType group_type;
-    private ColumnReferenceExpr[] columns;
+    private Expr [] grouping_sets;
 
-    public GroupElement(GroupType groupType, ColumnReferenceExpr[] columns) {
+    public GroupElement(GroupType groupType, Expr[] grouping_sets) {
       this.group_type = groupType;
-      this.columns = columns;
+      this.grouping_sets = grouping_sets;
     }
 
     public GroupType getType() {
       return this.group_type;
     }
 
-    public ColumnReferenceExpr[] getColumns() {
-      return this.columns;
+    public Expr[] getGroupingSets() {
+      return this.grouping_sets;
     }
 
     public String toString() {
@@ -97,11 +103,17 @@ public class Aggregation extends UnaryOperator {
       return JsonHelper.toJson(this);
     }
 
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(group_type, grouping_sets);
+    }
+
+    @Override
     public boolean equals(Object obj) {
       if (obj instanceof GroupElement) {
         GroupElement other = (GroupElement) obj;
         return group_type.equals(other) &&
-            TUtil.checkEquals(columns, other.columns);
+            TUtil.checkEquals(grouping_sets, other.grouping_sets);
       }
 
       return false;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
index 19f66af..f504994 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import java.util.Objects;
+
 public class BetweenPredicate extends Expr {
   private boolean not;
   // if symmetric is not set, asymmetric is implicit.
@@ -57,6 +59,11 @@ public class BetweenPredicate extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hash(not, symmetric, predicand, begin, end);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     BetweenPredicate another = (BetweenPredicate) expr;
     return symmetric == another.symmetric && predicand.equals(another.predicand) && begin.equals(another.begin) &&

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
index a090623..da37098 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 public class BinaryOperator extends Expr {
   protected Expr left;
   protected Expr right;
@@ -48,8 +50,16 @@ public class BinaryOperator extends Expr {
     this.right = right;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(opType, left, right);
+  }
+
   @Override
   boolean equalsTo(Expr expr) {
     return true;
   }
+
+  public String toString() {
+    return left.toString() + " " + opType.toString() + " " + right.toString();
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
index 398aa55..27869b3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -51,6 +53,11 @@ public class CaseWhenPredicate extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(whens, elseResult);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     return false;
   }
@@ -69,14 +76,26 @@ public class CaseWhenPredicate extends Expr {
       this.result = result;
     }
 
+    public void setCondition(Expr condition) {
+      this.condition = condition;
+    }
+
     public Expr getCondition() {
       return this.condition;
     }
 
+    public void setResult(Expr result) {
+      this.result = result;
+    }
+
     public Expr getResult() {
       return this.result;
     }
 
+    public int hashCode() {
+      return Objects.hashCode(condition, result);
+    }
+
     public boolean equals(Object obj) {
       if (obj instanceof WhenExpr) {
         WhenExpr another = (WhenExpr) obj;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
index ad793cd..24f6415 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
@@ -18,18 +18,19 @@
 
 package org.apache.tajo.algebra;
 
-public class CastExpr extends Expr {
-  private Expr operand;
+import com.google.common.base.Objects;
+
+public class CastExpr extends UnaryOperator {
   private DataTypeExpr target;
 
   public CastExpr(Expr operand, DataTypeExpr target) {
     super(OpType.Cast);
-    this.operand = operand;
     this.target = target;
+    setChild(operand);
   }
 
   public Expr getOperand() {
-    return operand;
+    return getChild();
   }
 
   public DataTypeExpr getTarget() {
@@ -37,8 +38,13 @@ public class CastExpr extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(target, getChild());
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     CastExpr another = (CastExpr) expr;
-    return operand.equals(another.operand) && target.equals(another.target);
+    return target.equals(another.target);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
index 340577c..9734593 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
@@ -18,37 +18,48 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class ColumnReferenceExpr extends Expr {
   private String qualifier;
   private String name;
 
-  public ColumnReferenceExpr(String columnName) {
+  public ColumnReferenceExpr(String referenceName) {
     super(OpType.Column);
-    this.name = columnName;
+    setName(referenceName);
   }
 
   public ColumnReferenceExpr(String qualifier, String columnName) {
     super(OpType.Column);
-    this.qualifier = qualifier;
-    this.name = columnName;
+    this.qualifier = qualifier.toLowerCase();
+    this.name = columnName.toLowerCase();
+  }
+
+  public boolean hasQualifier() {
+    return this.qualifier != null;
   }
 
   public void setQualifier(String qualifier) {
-    this.qualifier = qualifier;
+    this.qualifier = qualifier.toLowerCase();
   }
 
-  public String getName() {
-    return this.name;
+  public String getQualifier() {
+    return this.qualifier;
   }
 
-  public boolean hasQualifier() {
-    return this.qualifier != null;
+  public String getName() {
+    return this.name;
   }
 
-  public String getQualifier() {
-    return this.qualifier;
+  public void setName(String qualifiedName) {
+    String [] parts = qualifiedName.toLowerCase().split("\\.");
+    if (parts.length == 2) {
+      qualifier = parts[0];
+      name = parts[1];
+    } else {
+      name = parts[0];
+    }
   }
 
   public String getCanonicalName() {
@@ -59,9 +70,20 @@ public class ColumnReferenceExpr extends Expr {
     }
   }
 
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(name, qualifier);
+  }
+
+  @Override
   public boolean equalsTo(Expr expr) {
     ColumnReferenceExpr another = (ColumnReferenceExpr) expr;
     return name.equals(another.name) &&
         TUtil.checkEquals(qualifier, another.qualifier);
   }
+
+  @Override
+  public String toString() {
+    return qualifier != null ? qualifier + "." + name : name;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
index 77468fb..cf2efb5 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
@@ -18,4 +18,9 @@ public class CountRowsFunctionExpr extends FunctionExpr {
   public CountRowsFunctionExpr() {
     super(OpType.CountRowsFunction, "count");
   }
+
+  @Override
+  public int hashCode() {
+    return "count_row".hashCode();
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
index a85e366..3aadd8a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 import java.util.List;
@@ -128,9 +129,15 @@ public class CreateTable extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(external, tableElements, tableName, storageType, location, subquery, params, getSubQuery());
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     CreateTable another = (CreateTable) expr;
-    return tableName.equals(another.tableName) &&
+    return external == another.external &&
+        tableName.equals(another.tableName) &&
         TUtil.checkEquals(tableElements, another.tableElements) &&
         TUtil.checkEquals(storageType, another.storageType) &&
         TUtil.checkEquals(location, another.location) &&
@@ -161,10 +168,18 @@ public class CreateTable extends Expr {
       return this.col_name;
     }
 
-    public boolean equals(Object obj) {
-      if (obj instanceof ColumnDefinition) {
-        ColumnDefinition another = (ColumnDefinition) obj;
-        return col_name.equals(another.col_name) && super.equals(another);
+    @Override
+    public int hashCode() {
+      int hash = super.hashCode();
+      return hash * 89 * col_name.hashCode();
+
+    }
+
+    @Override
+    public boolean equalsTo(Expr expr) {
+      if (expr instanceof ColumnDefinition) {
+        ColumnDefinition another = (ColumnDefinition) expr;
+        return col_name.equals(another.col_name) && super.equalsTo(another);
       }
 
       return false;
@@ -207,12 +222,27 @@ public class CreateTable extends Expr {
     public List<RangePartitionSpecifier> getSpecifiers() {
       return specifiers;
     }
+
+    public int hashCode() {
+      return Objects.hashCode(type, columns, specifiers);
+    }
+
+    public boolean equals(Object object) {
+      if (object instanceof RangePartition) {
+        RangePartition another = (RangePartition) object;
+        return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+            specifiers.equals(another.specifiers);
+      } else {
+        return false;
+      }
+    }
   }
 
   public static class HashPartition extends PartitionDescExpr {
     ColumnReferenceExpr [] columns;
     Expr quantity;
     List<PartitionSpecifier> specifiers;
+
     public HashPartition(ColumnReferenceExpr [] columns, Expr quantity) {
       super(PartitionType.HASH);
       this.columns = columns;
@@ -244,6 +274,20 @@ public class CreateTable extends Expr {
     public List<PartitionSpecifier> getSpecifiers() {
       return specifiers;
     }
+
+    public int hashCode() {
+      return Objects.hashCode(type, columns, specifiers);
+    }
+
+    public boolean equals(Object object) {
+      if (object instanceof HashPartition) {
+        HashPartition another = (HashPartition) object;
+        return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+            specifiers.equals(another.specifiers);
+      } else {
+        return false;
+      }
+    }
   }
 
   public static class ListPartition extends PartitionDescExpr {
@@ -263,6 +307,20 @@ public class CreateTable extends Expr {
     public List<ListPartitionSpecifier> getSpecifiers() {
       return specifiers;
     }
+
+    public int hashCode() {
+      return Objects.hashCode(columns, specifiers);
+    }
+
+    public boolean equals(Object object) {
+      if (object instanceof HashPartition) {
+        HashPartition another = (HashPartition) object;
+        return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+            specifiers.equals(another.specifiers);
+      } else {
+        return false;
+      }
+    }
   }
 
   public static class ColumnPartition extends PartitionDescExpr {
@@ -282,6 +340,19 @@ public class CreateTable extends Expr {
     public boolean isOmitValues() {
       return isOmitValues;
     }
+
+    public int hashCode() {
+      return Objects.hashCode(columns);
+    }
+
+    public boolean equals(Object object) {
+      if (object instanceof HashPartition) {
+        HashPartition another = (HashPartition) object;
+        return type == another.type && TUtil.checkEquals(columns, another.columns);
+      } else {
+        return false;
+      }
+    }
   }
 
   public static class RangePartitionSpecifier extends PartitionSpecifier {
@@ -305,6 +376,23 @@ public class CreateTable extends Expr {
     public boolean isEndMaxValue() {
       return this.maxValue;
     }
+
+    public int hashCode() {
+      return Objects.hashCode(end, maxValue);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      RangePartitionSpecifier that = (RangePartitionSpecifier) o;
+
+      if (maxValue != that.maxValue) return false;
+      if (!end.equals(that.end)) return false;
+
+      return true;
+    }
   }
 
   public static class ListPartitionSpecifier extends PartitionSpecifier {
@@ -318,6 +406,23 @@ public class CreateTable extends Expr {
     public ValueListExpr getValueList() {
       return valueList;
     }
+
+    @Override
+    public int hashCode() {
+      return valueList.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      ListPartitionSpecifier that = (ListPartitionSpecifier) o;
+
+      if (!valueList.equals(that.valueList)) return false;
+
+      return true;
+    }
   }
 
   public static class PartitionSpecifier {
@@ -330,5 +435,17 @@ public class CreateTable extends Expr {
     public String getName() {
       return this.name;
     }
+
+    public int hashCode() {
+      return name.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+      if (obj instanceof PartitionSpecifier ) {
+        return name == ((PartitionSpecifier)obj).name;
+      } else {
+        return false;
+      }
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
index 7b2b903..15d6d7e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
@@ -20,6 +20,8 @@ package org.apache.tajo.algebra;
 
 import org.apache.tajo.util.TUtil;
 
+import java.util.Objects;
+
 public class DataTypeExpr extends Expr {
   String typeName;
   Integer lengthOrPrecision;
@@ -59,6 +61,11 @@ public class DataTypeExpr extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hash(typeName, lengthOrPrecision, scale);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     DataTypeExpr another = (DataTypeExpr) expr;
     return typeName.equals(another.typeName) &&

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
index e359ae0..57e0fcf 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 public class DropTable extends Expr {
   private final String tableName;
   private final boolean purge;
@@ -37,6 +39,11 @@ public class DropTable extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(tableName, purge);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     if (expr instanceof DropTable) {
       DropTable another = (DropTable) expr;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
index 0823807..fcb8531 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
@@ -18,14 +18,15 @@
 
 package org.apache.tajo.algebra;
 
-public class ExistsPredicate extends Expr {
-  private SimpleTableSubQuery simpleTableSubQuery;
+import com.google.common.base.Objects;
+
+public class ExistsPredicate extends UnaryOperator {
   private boolean not;
 
   public ExistsPredicate(SimpleTableSubQuery simpleTableSubQuery, boolean not) {
     super(OpType.InPredicate);
-    this.simpleTableSubQuery = simpleTableSubQuery;
     this.not = not;
+    setChild(simpleTableSubQuery);
   }
 
   public boolean isNot() {
@@ -33,12 +34,17 @@ public class ExistsPredicate extends Expr {
   }
 
   public SimpleTableSubQuery getSubQuery() {
-    return simpleTableSubQuery;
+    return (SimpleTableSubQuery) getChild();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(not, getChild());
   }
 
   @Override
   boolean equalsTo(Expr expr) {
     ExistsPredicate another = (ExistsPredicate) expr;
-    return not == another.not && simpleTableSubQuery.equals(another.simpleTableSubQuery);
+    return not == another.not;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
index 54c230b..27184b3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
@@ -33,6 +33,9 @@ public abstract class Expr implements JsonSerializable {
 		return this.opType;
 	}
 
+  @Override
+  public abstract int hashCode();
+
   abstract boolean equalsTo(Expr expr);
 
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
index 008bfc0..7f1dcd3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class FunctionExpr extends Expr {
@@ -63,6 +64,11 @@ public class FunctionExpr extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(signature, params);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     FunctionExpr another = (FunctionExpr) expr;
     return signature.equals(another.signature) &&

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
index dcceae4..c45a58f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
@@ -25,4 +25,15 @@ public class GeneralSetFunctionExpr extends FunctionExpr {
   public boolean isDistinct() {
     return distinct;
   }
+
+  @Override
+  public int hashCode() {
+    int hash = super.hashCode();
+    return hash * 89 * (distinct ? 31 : 23);
+  }
+
+  @Override
+  public boolean equalsTo(Expr expr) {
+    return distinct == ((GeneralSetFunctionExpr)expr).distinct;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
index d48537a..53bd9ba 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Having extends UnaryOperator implements JsonSerializable {
@@ -46,6 +47,11 @@ public class Having extends UnaryOperator implements JsonSerializable {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(qual, getChild());
+  }
+
+  @Override
   public boolean equalsTo(Expr expr) {
     if (expr instanceof Having) {
       Having other = (Having) expr;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
index 38c7ad4..c58c040 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 import java.util.Map;
@@ -112,6 +113,11 @@ public class Insert extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(overwrite, tableName, subquery, storageType, location, params);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     Insert another = (Insert) expr;
     return overwrite == another.overwrite &&

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
index 35fc769..40f5dd2 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
@@ -18,14 +18,15 @@
 
 package org.apache.tajo.algebra;
 
-public class IsNullPredicate extends Expr {
+import com.google.common.base.Objects;
+
+public class IsNullPredicate extends UnaryOperator {
   private final boolean not;
-  private final Expr predicand;
 
   public IsNullPredicate(boolean not, Expr column) {
     super(OpType.IsNullPredicate);
     this.not = not;
-    this.predicand = column;
+    setChild(column);
   }
 
   public boolean isNot() {
@@ -33,12 +34,16 @@ public class IsNullPredicate extends Expr {
   }
 
   public Expr getPredicand() {
-    return predicand;
+    return getChild();
+  }
+
+  public int hashCode() {
+    return Objects.hashCode(not, getChild());
   }
 
   @Override
   boolean equalsTo(Expr expr) {
     IsNullPredicate nullPredicate = (IsNullPredicate) expr;
-    return not == nullPredicate.not && predicand.equals(nullPredicate.predicand);
+    return not == nullPredicate.not;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
index 51c84c2..da2b153 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
@@ -18,10 +18,9 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
-import java.util.Arrays;
-
 public class Join extends BinaryOperator {
   private JoinType joinType;
   private Expr joinQual;
@@ -69,6 +68,11 @@ public class Join extends BinaryOperator {
     return natural;
   }
 
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(joinType, joinQual, joinColumns, natural);
+  }
+
   boolean equalsTo(Expr expr) {
     Join another = (Join) expr;
     return joinType.equals(another.joinType) &&
@@ -81,14 +85,4 @@ public class Join extends BinaryOperator {
   public String toJson() {
     return JsonHelper.toJson(this);
   }
-
-  @Override
-  public int hashCode() {
-    int result = getType().hashCode();
-    result = 31 * result + joinType.hashCode();
-    result = 31 * result + (joinQual != null ? joinQual.hashCode() : 0);
-    result = 31 * result + (joinColumns != null ? Arrays.hashCode(joinColumns) : 0);
-    result = 31 * result + (natural ? 1 : 0);
-    return result;
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
index dd3aee9..a217c5e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
@@ -19,6 +19,8 @@
 package org.apache.tajo.algebra;
 
 
+import com.google.common.base.Objects;
+
 public class Limit extends UnaryOperator {
   private Expr fetchFirstNum;
 
@@ -41,6 +43,10 @@ public class Limit extends UnaryOperator {
     return JsonHelper.toJson(this);
   }
 
+  public int hashCode() {
+    return Objects.hashCode(fetchFirstNum, getChild());
+  }
+
   @Override
   boolean equalsTo(Expr expr) {
     Limit another = (Limit) expr;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/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 9d8d71a..f7d7720 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
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 public class LiteralValue extends Expr {
   protected LiteralType valueType;
   protected String value;
@@ -44,6 +46,10 @@ public class LiteralValue extends Expr {
     return this.value;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(valueType, value);
+  }
+
   public boolean equalsTo(Expr expr) {
     LiteralValue another = (LiteralValue) expr;
     boolean a = valueType.equals(another.valueType);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
new file mode 100644
index 0000000..bd73481
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
@@ -0,0 +1,89 @@
+/**
+ * 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;
+
+import com.google.common.base.Objects;
+import org.apache.tajo.util.TUtil;
+
+/**
+ * <code>NamedExpr</code> is an expression which can be aliased in a target list.
+ *
+ * <pre>
+ *   SELECT col1 + col2 as a, sum(col2) as b, col3 as c, col4, ... FROM ...
+ *          ^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^  ^^^^^^^^^  ^^^^
+ *               expr1             expr2        expr3    expr4
+ * </pre>
+ *
+ * We define each expression in expr1 - expr4 as a named expression.
+ * In database community, each of them is called target or an expression in a select list,
+ * Each expression can be explicitly aliased as an given name.
+ */
+public class NamedExpr extends UnaryOperator {
+  private String alias;
+
+  public NamedExpr(Expr expr) {
+    super(OpType.Target);
+    setChild(expr);
+  }
+
+  public NamedExpr(Expr expr, String alias) {
+    this(expr);
+    setAlias(alias);
+  }
+
+  public Expr getExpr() {
+    return getChild();
+  }
+
+  public boolean hasAlias() {
+    return this.alias != null;
+  }
+
+  public String getAlias() {
+    return this.alias;
+  }
+
+  public void setAlias(String alias) {
+    this.alias = alias;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(alias, getChild());
+  }
+
+  @Override
+  public boolean equalsTo(Expr obj) {
+    if (obj instanceof NamedExpr) {
+      NamedExpr another = (NamedExpr) obj;
+      return TUtil.checkEquals(alias, another.alias);
+    }
+
+    return false;
+  }
+
+  public String toString() {
+    return getChild().toString() + (hasAlias() ? " AS " + alias : "");
+  }
+
+  @Override
+  public String toJson() {
+    return JsonHelper.toJson(this);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
index e4e7749..55d225a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
@@ -25,6 +25,11 @@ public class NullLiteral extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return getType().hashCode();
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     return expr instanceof NullLiteral;
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
index ec6be1c..84f784e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
@@ -85,7 +85,7 @@ public enum OpType {
   // Other Expressions
   Sign(SignedExpr.class),
   Column(ColumnReferenceExpr.class),
-  Target(TargetExpr.class),
+  Target(NamedExpr.class),
   Function(FunctionExpr.class),
 
   // Set Functions

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
index e3c7ba4..6f5ab68 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
@@ -20,10 +20,8 @@ package org.apache.tajo.algebra;
 
 import com.google.common.base.Preconditions;
 
-public class PatternMatchPredicate extends Expr {
+public class PatternMatchPredicate extends BinaryOperator {
   private boolean not;
-  private Expr columnRef;
-  private Expr pattern;
   private boolean caseInsensitive;
 
   public PatternMatchPredicate(OpType opType, boolean not, Expr predicand, Expr pattern,
@@ -33,9 +31,9 @@ public class PatternMatchPredicate extends Expr {
         opType == OpType.LikePredicate || opType == OpType.SimilarToPredicate || opType == OpType.Regexp,
         "pattern matching predicate is only available: " + opType.name());
     this.not = not;
-    this.columnRef = predicand;
-    this.pattern = pattern;
     this.caseInsensitive = caseInsensitive;
+    setLeft(predicand);
+    setRight(pattern);
   }
 
   public PatternMatchPredicate(OpType opType, boolean not, Expr predicand, Expr pattern) {
@@ -47,11 +45,11 @@ public class PatternMatchPredicate extends Expr {
   }
 
   public Expr getPredicand() {
-    return this.columnRef;
+    return getLeft();
   }
 
   public Expr getPattern() {
-    return this.pattern;
+    return getRight();
   }
 
   public boolean isCaseInsensitive() {
@@ -61,9 +59,6 @@ public class PatternMatchPredicate extends Expr {
   boolean equalsTo(Expr expr) {
     PatternMatchPredicate another = (PatternMatchPredicate) expr;
     return opType == another.opType &&
-        not == another.not &&
-        columnRef.equals(another.columnRef) &&
-        pattern.equals(another.pattern) &&
-        caseInsensitive == another.caseInsensitive;
+        not == another.not && caseInsensitive == another.caseInsensitive;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
index 958f20c..bcb6253 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
@@ -18,13 +18,14 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Projection extends UnaryOperator implements Cloneable {
   private boolean all;
   private boolean distinct = false;
 
-  private TargetExpr [] targets;
+  private NamedExpr[] targets;
 
   public Projection() {
     super(OpType.Projection);
@@ -50,18 +51,22 @@ public class Projection extends UnaryOperator implements Cloneable {
     return all;
   }
 	
-	public TargetExpr[] getTargets() {
+	public NamedExpr[] getNamedExprs() {
 	  return this.targets;
 	}
 
-  public void setTargets(TargetExpr[] targets) {
+  public void setNamedExprs(NamedExpr[] targets) {
     this.targets = targets;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(all, distinct, targets, getChild());
+  }
+
   @Override
   boolean equalsTo(Expr expr) {
     Projection another = (Projection) expr;
-    return TUtil.checkEquals(all, another.all) &&
+    return TUtil.checkEquals(all, another.all) && distinct == another.distinct &&
         TUtil.checkEquals(targets, another.targets);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
index 0cb0bbe..406794a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Relation extends Expr {
@@ -59,16 +60,14 @@ public class Relation extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(tableName, alias);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     Relation other = (Relation) expr;
     return TUtil.checkEquals(tableName, other.tableName) &&
         TUtil.checkEquals(alias, other.alias);
   }
-
-  @Override
-  public int hashCode() {
-    int result = tableName.hashCode();
-    result = 31 * result + (alias != null ? alias.hashCode() : 0);
-    return result;
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
index 918ff46..18c4ce9 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
@@ -14,6 +14,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import org.apache.tajo.util.TUtil;
 
@@ -53,6 +54,11 @@ public class RelationList extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(relations);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     Set<Expr> thisSet = TUtil.newHashSet(relations);
     RelationList another = (RelationList) expr;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
index 2273a48..425c08f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
@@ -18,22 +18,20 @@
 
 package org.apache.tajo.algebra;
 
-public class ScalarSubQuery extends Expr {
-  private Expr subquery;
+public class ScalarSubQuery extends UnaryOperator {
 
   public ScalarSubQuery(Expr subQuery) {
     super(OpType.ScalarSubQuery);
-    this.subquery = subQuery;
+    this.setChild(subQuery);
   }
 
   public Expr getSubQuery() {
-    return this.subquery;
+    return getChild();
   }
 
   @Override
   boolean equalsTo(Expr expr) {
-    ScalarSubQuery another = (ScalarSubQuery) expr;
-    return subquery.equals(another);
+    return true;
   }
 
   public String toJson() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
index f43c252..364e1b7 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Selection extends UnaryOperator implements JsonSerializable {
@@ -45,6 +46,10 @@ public class Selection extends UnaryOperator implements JsonSerializable {
     return JsonHelper.toJson(this);
   }
 
+  public int hashCode() {
+    return Objects.hashCode(qual, getChild());
+  }
+
   @Override
   public boolean equalsTo(Expr expr) {
     if (expr instanceof Selection) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
index 47ab44a..08ebd6a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.algebra;
 
 
+import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
 public class SetOperation extends BinaryOperator {
@@ -40,6 +41,10 @@ public class SetOperation extends BinaryOperator {
     distinct = false;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(distinct, getLeft(), getRight());
+  }
+
   boolean equalsTo(Expr expr) {
     SetOperation another = (SetOperation) expr;
     return distinct == another.distinct;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
index 15fcb51..7b3438c 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 public class SignedExpr extends UnaryOperator {
   private boolean negative;
 
@@ -31,6 +33,10 @@ public class SignedExpr extends UnaryOperator {
     return negative;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(negative, getChild());
+  }
+
   @Override
   boolean equalsTo(Expr expr) {
     return negative == ((SignedExpr)expr).negative;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
index 91442dc..7bd3b78 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
@@ -18,21 +18,20 @@
 
 package org.apache.tajo.algebra;
 
-public class SimpleTableSubQuery extends Expr {
-  private Expr subquery;
+public class SimpleTableSubQuery extends UnaryOperator {
 
   public SimpleTableSubQuery(Expr subquery) {
     super(OpType.SimpleTableSubQuery);
-    this.subquery = subquery;
+    setChild(subquery);
   }
 
   public Expr getSubQuery() {
-    return subquery;
+    return getChild();
   }
 
   @Override
   boolean equalsTo(Expr expr) {
-    return subquery.equals(subquery);
+    return true;
   }
 
   public String toJson() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
index f57cd89..c047c54 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
@@ -18,7 +18,7 @@
 
 package org.apache.tajo.algebra;
 
-import com.google.gson.annotations.SerializedName;
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class Sort extends UnaryOperator {
@@ -38,6 +38,11 @@ public class Sort extends UnaryOperator {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(sortSpecs);
+  }
+
+  @Override
   public boolean equalsTo(Expr expr) {
     Sort another = (Sort) expr;
     return TUtil.checkEquals(sortSpecs, another.sortSpecs);
@@ -49,12 +54,11 @@ public class Sort extends UnaryOperator {
   }
 
   public static class SortSpec {
-    private ColumnReferenceExpr key;
+    private Expr key;
     private boolean asc = true;
-    @SerializedName("null_first")
     private boolean nullFirst = false;
 
-    public SortSpec(final ColumnReferenceExpr key) {
+    public SortSpec(final Expr key) {
       this.key = key;
     }
 
@@ -88,10 +92,16 @@ public class Sort extends UnaryOperator {
       this.nullFirst = true;
     }
 
-    public final ColumnReferenceExpr getKey() {
+    public final Expr getKey() {
       return this.key;
     }
 
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(asc, key, nullFirst);
+    }
+
+    @Override
     public boolean equals(Object obj) {
       if (obj instanceof SortSpec) {
         SortSpec other = (SortSpec) obj;
@@ -101,5 +111,10 @@ public class Sort extends UnaryOperator {
       }
       return false;
     }
+
+    @Override
+    public String toString() {
+      return key + " " + (asc ? "asc" : "desc") + " " + (nullFirst ? "null first" :"");
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
index 929e9b2..90d89a4 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
@@ -18,6 +18,9 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+import org.apache.tajo.util.TUtil;
+
 public class TablePrimarySubQuery extends Relation {
   private Expr subquery;
   private String [] columnNames;
@@ -43,9 +46,14 @@ public class TablePrimarySubQuery extends Relation {
     return subquery;
   }
 
+  public int hashCode() {
+    return Objects.hashCode(subquery, columnNames);
+  }
+
   @Override
   boolean equalsTo(Expr expr) {
-    return subquery.equals(subquery);
+    TablePrimarySubQuery another = (TablePrimarySubQuery) expr;
+    return subquery.equals(subquery) && TUtil.checkEquals(columnNames, another.columnNames);
   }
 
   public String toJson() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
deleted file mode 100644
index 393790b..0000000
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 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;
-
-import org.apache.tajo.util.TUtil;
-
-public class TargetExpr extends Expr {
-  private Expr expr;
-  private String alias;
-
-  public TargetExpr(Expr expr) {
-    super(OpType.Target);
-    this.expr = expr;
-  }
-
-  public TargetExpr(Expr expr, String alias) {
-    this(expr);
-    setAlias(alias);
-  }
-
-  public Expr getExpr() {
-    return expr;
-  }
-
-  public boolean hasAlias() {
-    return this.alias != null;
-  }
-
-  public String getAlias() {
-    return this.alias;
-  }
-
-  public void setAlias(String alias) {
-    this.alias = alias;
-  }
-
-  @Override
-  public boolean equalsTo(Expr obj) {
-    if (obj instanceof TargetExpr) {
-      TargetExpr another = (TargetExpr) obj;
-      return expr.equals(another.expr) && TUtil.checkEquals(alias, another.alias);
-    }
-
-    return false;
-  }
-
-  @Override
-  public String toJson() {
-    return JsonHelper.toJson(this);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
index fec87d0..2a1e730 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
@@ -18,6 +18,8 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
+
 public abstract class UnaryOperator extends Expr {
   private Expr child;
 
@@ -36,4 +38,8 @@ public abstract class UnaryOperator extends Expr {
   public void setChild(Expr op) {
     this.child = op;
   }
+
+  public int hashCode() {
+    return Objects.hashCode(getType(), child.hashCode());
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
index bbcbd21..8d51a95 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.algebra;
 
+import com.google.common.base.Objects;
 import org.apache.tajo.util.TUtil;
 
 public class ValueListExpr extends Expr {
@@ -33,6 +34,11 @@ public class ValueListExpr extends Expr {
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hashCode(values);
+  }
+
+  @Override
   boolean equalsTo(Expr expr) {
     ValueListExpr valueListExpr = (ValueListExpr) expr;
     return TUtil.checkEquals(values, valueListExpr.values);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
index 660176d..f327739 100644
--- a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
+++ b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
@@ -36,6 +36,7 @@ public class TestExpr {
         new LiteralValue("1", LiteralType.Unsigned_Integer),
         new LiteralValue("2", LiteralType.Unsigned_Integer));
 
+    assertEquals(expr1.hashCode(), expr2.hashCode());
     assertEquals(expr1, expr2);
 
     Expr expr3 = new BinaryOperator(OpType.Minus,
@@ -102,8 +103,8 @@ public class TestExpr {
     selection.setChild(relation);
 
     Aggregation aggregation = new Aggregation();
-    aggregation.setTargets(new TargetExpr[]{
-          new TargetExpr(new ColumnReferenceExpr("col1"))
+    aggregation.setTargets(new NamedExpr[]{
+          new NamedExpr(new ColumnReferenceExpr("col1"))
         }
     );
 
@@ -129,8 +130,8 @@ public class TestExpr {
     selection.setChild(relation);
 
     Aggregation aggregation = new Aggregation();
-    aggregation.setTargets(new TargetExpr[]{
-        new TargetExpr(new ColumnReferenceExpr("col1"))
+    aggregation.setTargets(new NamedExpr[]{
+        new NamedExpr(new ColumnReferenceExpr("col1"))
     });
 
     aggregation.setChild(selection);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
index 436560e..cb42086 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
@@ -154,7 +154,13 @@ public class Column implements ProtoObject<ColumnProto>, Cloneable, GsonObject {
 	}
 	
 	public String toString() {
-	  return getQualifiedName() +" (" + getDataType().getType() +"(" + getDataType().getLength() + "))";
+    StringBuilder sb = new StringBuilder(getQualifiedName());
+    sb.append(" (").append(getDataType().getType());
+    if (getDataType().getLength()  > 0) {
+      sb.append("(" + getDataType().getLength() + ")");
+    }
+    sb.append(")");
+	  return sb.toString();
 	}
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
index 4ea3b81..a19d352 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
@@ -108,6 +108,26 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
     return fields.get(id);
   }
 
+  public Column getColumn(Column column) {
+    if (!contains(column)) {
+      return null;
+    }
+    if (column.hasQualifier()) {
+      return fields.get(fieldsByQualifiedName.get(column.getQualifiedName()));
+    } else {
+      return fields.get(fieldsByName.get(column.getColumnName()).get(0));
+    }
+  }
+
+  public Column getColumn(String name) {
+    String [] parts = name.split("\\.");
+    if (parts.length == 2) {
+      return getColumnByFQN(name);
+    } else {
+      return getColumnByName(name);
+    }
+  }
+
 	public Column getColumnByFQN(String qualifiedName) {
 		Integer cid = fieldsByQualifiedName.get(qualifiedName.toLowerCase());
 		return cid != null ? fields.get(cid) : null;
@@ -124,22 +144,44 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
     if (list.size() == 1) {
       return fields.get(list.get(0));
     } else {
-      StringBuilder sb = new StringBuilder();
-      boolean first = true;
-      for (Integer id : list) {
-        if (first) {
-          first = false;
-        } else {
-          sb.append(", ");
-        }
-        sb.append(fields.get(id));
-      }
-      throw new RuntimeException("Ambiguous Column Name: " + sb.toString());
+      throw throwAmbiguousFieldException(list);
     }
 	}
+
+  private RuntimeException throwAmbiguousFieldException(Collection<Integer> idList) {
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (Integer id : idList) {
+      if (first) {
+        first = false;
+      } else {
+        sb.append(", ");
+      }
+      sb.append(fields.get(id));
+    }
+    throw new RuntimeException("Ambiguous Column Name Access: " + sb.toString());
+  }
 	
-	public int getColumnId(String qualifiedName) {
-	  return fieldsByQualifiedName.get(qualifiedName.toLowerCase());
+	public int getColumnId(String name) {
+    String [] parts = name.split("\\.");
+    if (parts.length == 2) {
+      if (fieldsByQualifiedName.containsKey(name)) {
+        return fieldsByQualifiedName.get(name);
+      } else {
+        return -1;
+      }
+    } else {
+      List<Integer> list = fieldsByName.get(name);
+      if (list == null) {
+        return -1;
+      } else  if (list.size() == 1) {
+        return fieldsByName.get(name).get(0);
+      } else if (list.size() == 0) {
+        return -1;
+      } else { // if list.size > 2
+        throw throwAmbiguousFieldException(list);
+      }
+    }
 	}
 
   public int getColumnIdByName(String colName) {
@@ -155,12 +197,47 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
 	public List<Column> getColumns() {
 		return ImmutableList.copyOf(fields);
 	}
-	
-	public boolean contains(String colName) {
-		return fieldsByQualifiedName.containsKey(colName.toLowerCase());
 
+  public boolean contains(String name) {
+    if (fieldsByQualifiedName.containsKey(name)) {
+      return true;
+    }
+    if (fieldsByName.containsKey(name)) {
+      if (fieldsByName.size() > 1) {
+        throw new RuntimeException("Ambiguous Column name");
+      }
+      return true;
+    }
+
+    return false;
+  }
+
+  public boolean contains(Column column) {
+    if (column.hasQualifier()) {
+      return fieldsByQualifiedName.containsKey(column.getQualifiedName());
+    } else {
+      if (fieldsByName.containsKey(column.getColumnName())) {
+        int num = fieldsByName.get(column.getColumnName()).size();
+        if (num == 0) {
+          throw new IllegalStateException("No such column name: " + column.getColumnName());
+        }
+        if (num > 1) {
+          throw new RuntimeException("Ambiguous column name: " + column.getColumnName());
+        }
+        return true;
+      }
+      return false;
+    }
+  }
+	
+	public boolean containsByQualifiedName(String qualifiedName) {
+		return fieldsByQualifiedName.containsKey(qualifiedName.toLowerCase());
 	}
 
+  public boolean containsByName(String colName) {
+    return fieldsByName.containsKey(colName);
+  }
+
   public boolean containsAll(Collection<Column> columns) {
     return fields.containsAll(columns);
   }
@@ -229,7 +306,7 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
 
 	public String toString() {
 	  StringBuilder sb = new StringBuilder();
-	  sb.append("{");
+	  sb.append("{(").append(getColumnNum()).append(") ");
 	  int i = 0;
 	  for(Column col : fields) {
 	    sb.append(col);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
index 792d642..c3e31d8 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
@@ -181,9 +181,9 @@ public class PartitionDesc implements ProtoObject<CatalogProtos.PartitionDescPro
   }
 
   public String toString() {
-    Gson gson = new GsonBuilder().setPrettyPrinting().
-        excludeFieldsWithoutExposeAnnotation().create();
-    return gson.toJson(this);
+    StringBuilder sb = new StringBuilder("Partition Type: " + partitionsType.name()).append(", key=");
+    sb.append(schema);
+    return sb.toString();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
index b0b5051..81677c5 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
@@ -97,7 +97,6 @@ public class TestColumn {
 	public final void testToJson() {
 		Column col = new Column(field1.getProto());
 		String json = col.toJson();
-		System.out.println(json);
 		Column fromJson = CatalogGsonHelper.fromJson(json, Column.class);
 		assertEquals(col, fromJson);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
index 1422cf2..c879ecb 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
@@ -69,9 +69,9 @@ public class TestSchema {
 	@Test
 	public final void testAddField() {
 		Schema schema = new Schema();
-		assertFalse(schema.contains("studentId"));
+		assertFalse(schema.containsByQualifiedName("studentId"));
 		schema.addColumn("studentId", Type.INT4);
-		assertTrue(schema.contains("studentId"));
+		assertTrue(schema.containsByQualifiedName("studentId"));
 	}
 
 	@Test

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
index 33b3e45..2c2400a 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
@@ -84,8 +84,7 @@ public class HCatalogUtil {
     try {
       return Enum.valueOf(TajoDataTypes.Type.class, typeStr);
     } catch (IllegalArgumentException iae) {
-      System.out.println("Cannot find a matched type aginst from '" + typeStr + "'");
-      return null;
+      throw new InternalException("Cannot find a matched type aginst from '" + typeStr + "'");
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
index 7eabc08..a48142e 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
@@ -318,9 +318,15 @@ public class TajoClient {
         builder.setQuery(sql);
 
         TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
-        ResultCode resultCode =
-            tajoMasterService.updateQuery(null, builder.build()).getResultCode();
-        return resultCode == ResultCode.OK;
+        UpdateQueryResponse response = tajoMasterService.updateQuery(null, builder.build());
+        if (response.getResultCode() == ResultCode.OK) {
+          return true;
+        } else {
+          if (response.hasErrorMessage()) {
+            LOG.error(response.getErrorMessage());
+          }
+          return false;
+        }
       }
     }.withRetries();
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index 3569d02..782bfa3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -24,6 +24,7 @@ package org.apache.tajo.datum;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.exception.InvalidOperationException;
+import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.NumberUtil;
 
 import java.nio.ByteBuffer;
@@ -70,9 +71,7 @@ public class Float8Datum extends NumericDatum {
 
   @Override
 	public byte[] asByteArray() {
-		ByteBuffer bb = ByteBuffer.allocate(8);
-		bb.putDouble(val);
-		return bb.array();
+		return Bytes.toBytes(val);
 	}
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
index 26f7297..fba3fe9 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
@@ -138,7 +138,7 @@ public class TextDatum extends Datum {
       case NULL_TYPE:
         return datum;
       default:
-        throw new InvalidOperationException();
+        throw new InvalidOperationException("Cannot equivalent check: " + this.type() + " and " + datum.type());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
index 2f11f8a..884ad8f 100644
--- a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
+++ b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
@@ -26,13 +26,9 @@ import static org.junit.Assert.*;
 public class TestIPv4 {
 
 	@Test
-	public final void testSet() {
+	public final void testSet() throws InvalidAddressException {
 		IPv4 ip = null;
-		try {
-			ip = new IPv4("255.255.255.255");
-		} catch (InvalidAddressException e) {
-			System.out.println("InvalidAddressException is catched");
-		}
+	  ip = new IPv4("255.255.255.255");
 		byte[] b = new byte[4];
 		for (int i = 0; i < 4; i++) {
 			b[i] = (byte)0xFF;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
index b6b84d9..812c4c7 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
@@ -66,8 +66,8 @@ public class TestBitDatum {
 	
 	@Test
 	public final void testAsChars() {
-		Datum d = DatumFactory.createBit((byte) 5);
-		System.out.println(d.asChars());
+		Datum d = DatumFactory.createBit((byte) 'a');
+		assertEquals("0x97", d.asChars());
 	}
 	
 	@Test

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/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 4b5eea4..9b693c7 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
@@ -574,11 +574,11 @@ boolean_value_expression
   ;
 
 or_predicate
-  : and_predicate (OR boolean_value_expression)*
+  : and_predicate (OR or_predicate)*
   ;
 
 and_predicate
-  : boolean_factor (AND boolean_value_expression)*
+  : boolean_factor (AND and_predicate)*
   ;
 
 boolean_factor
@@ -789,8 +789,8 @@ grouping_element
   ;
 
 ordinary_grouping_set
-  : column_reference_list
-  | LEFT_PAREN column_reference_list RIGHT_PAREN
+  : row_value_predicand_list
+  | LEFT_PAREN row_value_predicand_list RIGHT_PAREN
   ;
 
 rollup_list
@@ -809,6 +809,10 @@ having_clause
   : HAVING boolean_value_expression
   ;
 
+row_value_predicand_list
+  : row_value_predicand (COMMA row_value_predicand)*
+  ;
+
 /*
 ===============================================================================
   7.13 <query expression>
@@ -1124,7 +1128,7 @@ sort_specifier_list
   ;
 
 sort_specifier
-  : column=column_reference order=order_specification? null_order=null_ordering?
+  : key=row_value_predicand order=order_specification? null_order=null_ordering?
   ;
 
 order_specification

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
index e933ddb..70ae712 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
@@ -131,6 +131,11 @@ public class AlgebraicUtil {
    * @return the simplified expr
    */
   public static EvalNode eliminateConstantExprs(EvalNode expr) {
+
+    if (expr.getType() == EvalType.FIELD) {
+      return expr;
+    }
+
     EvalNode left = expr.getLeftExpr();
     EvalNode right = expr.getRightExpr();