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/09/21 04:08:39 UTC

git commit: TAJO-187: The exception 'Some targets cannot be evaluated' is caused in nested joins. (hyunsik)

Updated Branches:
  refs/heads/master e595384ba -> 16d1895e5


TAJO-187: The exception 'Some targets cannot be evaluated' is caused in nested joins. (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/16d1895e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/16d1895e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/16d1895e

Branch: refs/heads/master
Commit: 16d1895e5f51832ce7fb9741ba4fb06c6ec2cc92
Parents: e595384
Author: Hyunsik Choi <hy...@apache.org>
Authored: Sat Sep 21 11:08:04 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Sat Sep 21 11:08:04 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  3 ++
 .../java/org/apache/tajo/catalog/Column.java    |  9 ++--
 .../java/org/apache/tajo/catalog/Schema.java    | 50 ++++++++++----------
 .../org/apache/tajo/catalog/TestSchema.java     |  6 +--
 .../main/java/org/apache/tajo/DataChannel.java  |  2 +-
 .../apache/tajo/engine/planner/InsertNode.java  |  2 +
 .../apache/tajo/engine/planner/LogicalPlan.java |  8 ++--
 .../tajo/engine/planner/logical/JoinNode.java   |  3 ++
 .../tajo/engine/planner/logical/ScanNode.java   |  5 +-
 .../planner/logical/TableSubQueryNode.java      |  6 +--
 .../planner/rewrite/ProjectionPushDownRule.java |  6 +--
 .../org/apache/tajo/master/ExecutionBlock.java  | 35 --------------
 .../org/apache/tajo/master/GlobalEngine.java    |  2 +-
 .../org/apache/tajo/master/GlobalPlanner.java   |  2 +-
 .../resources/webapps/admin/catalogview.jsp     |  2 +-
 .../tajo/engine/query/TestTableSubQuery.java    | 10 ++++
 .../org/apache/tajo/storage/TestFragment.java   |  8 ++--
 .../apache/tajo/storage/TableStatistics.java    |  4 --
 .../apache/tajo/storage/v2/CSVFileScanner.java  |  5 --
 .../apache/tajo/storage/v2/FileScannerV2.java   |  4 --
 20 files changed, 71 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index af1a245..8b91f00 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -143,6 +143,9 @@ Release 0.2.0 - unreleased
 
   BUG FIXES
 
+    TAJO-187: The exception 'Some targets cannot be evaluated' is caused in 
+    nested joins. (hyunsik)
+
     TAJO-46: The "having" clause does not work properly. (hyunsik)
 
     TAJO-186: Improve column resolving method. (hyunsik)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/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 1b623fa..40f1dab 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
@@ -28,6 +28,9 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.util.TUtil;
 
+/**
+ * It represents a column. It is usually used for relations.
+ */
 public class Column implements ProtoObject<ColumnProto>, Cloneable, GsonObject {
 	private ColumnProto.Builder builder = null;
 
@@ -55,10 +58,10 @@ public class Column implements ProtoObject<ColumnProto>, Cloneable, GsonObject {
 	
 	public Column(ColumnProto proto) {
     this();
-    name = proto.getColumnName();
+    name = proto.getColumnName().toLowerCase();
     dataType = proto.getDataType();
     if (proto.hasQualifier()) {
-      qualifier = proto.getQualifier();
+      qualifier = proto.getQualifier().toLowerCase();
     }
 	}
 
@@ -86,7 +89,7 @@ public class Column implements ProtoObject<ColumnProto>, Cloneable, GsonObject {
   }
 
   public void setQualifier(String qualifier) {
-    this.qualifier = qualifier;
+    this.qualifier = qualifier.toLowerCase();
   }
 
   public String getQualifier() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/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 b69bf6f..e36fbf3 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
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.catalog;
 
+import com.google.common.collect.ImmutableList;
 import com.google.gson.annotations.Expose;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -52,16 +53,17 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
     this.fieldsByQialifiedName = new HashMap<String, Integer>();
     this.fieldsByName = new HashMap<String, List<Integer>>();
     for(ColumnProto colProto : proto.getFieldsList()) {
-      fields.add(new Column(colProto));
-      if (colProto.hasQualifier()) {
-        fieldsByQialifiedName.put(colProto.getQualifier() + "." + colProto.getColumnName(), fields.size() - 1);
+      Column tobeAdded = new Column(colProto);
+      fields.add(tobeAdded);
+      if (tobeAdded.hasQualifier()) {
+        fieldsByQialifiedName.put(tobeAdded.getQualifier() + "." + tobeAdded.getColumnName(), fields.size() - 1);
       } else {
-        fieldsByQialifiedName.put(colProto.getColumnName(), fields.size() - 1);
+        fieldsByQialifiedName.put(tobeAdded.getColumnName(), fields.size() - 1);
       }
-      if (fieldsByName.containsKey(colProto.getColumnName())) {
-        fieldsByName.get(colProto.getColumnName()).add(fields.size() - 1);
+      if (fieldsByName.containsKey(tobeAdded.getColumnName())) {
+        fieldsByName.get(tobeAdded.getColumnName()).add(fields.size() - 1);
       } else {
-        fieldsByName.put(colProto.getColumnName(), TUtil.newList(fields.size() - 1));
+        fieldsByName.put(tobeAdded.getColumnName(), TUtil.newList(fields.size() - 1));
       }
     }
   }
@@ -114,8 +116,12 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
 		return this.fields.size();
 	}
 
-	public Column getColumnByFQN(String colName) {
-		Integer cid = fieldsByQialifiedName.get(colName.toLowerCase());
+  public Column getColumn(int id) {
+    return fields.get(id);
+  }
+
+	public Column getColumnByFQN(String qualifiedName) {
+		Integer cid = fieldsByQialifiedName.get(qualifiedName.toLowerCase());
 		return cid != null ? fields.get(cid) : null;
 	}
 	
@@ -144,12 +150,8 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
     }
 	}
 	
-	public Column getColumn(int id) {
-	  return fields.get(id);
-	}
-	
-	public int getColumnId(String colName) {
-	  return fieldsByQialifiedName.get(colName.toLowerCase());
+	public int getColumnId(String qualifiedName) {
+	  return fieldsByQialifiedName.get(qualifiedName.toLowerCase());
 	}
 
   public int getColumnIdByName(String colName) {
@@ -161,12 +163,8 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
     return -1;
   }
 	
-	public Collection<Column> getColumns() {
-		return fields;
-	}
-	
-	public void alter(int idx, Column column) {
-	  this.fields.set(idx, column);
+	public List<Column> getColumns() {
+		return ImmutableList.copyOf(fields);
 	}
 	
 	public boolean contains(String colName) {
@@ -185,13 +183,13 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
   }
 
   public synchronized Schema addColumn(String name, DataType dataType) {
-		String nomalized = name.toLowerCase();
-		if(fieldsByQialifiedName.containsKey(nomalized)) {
-		  LOG.error("Already exists column " + nomalized);
-			throw new AlreadyExistsFieldException(nomalized);
+		String normalized = name.toLowerCase();
+		if(fieldsByQialifiedName.containsKey(normalized)) {
+		  LOG.error("Already exists column " + normalized);
+			throw new AlreadyExistsFieldException(normalized);
 		}
 			
-		Column newCol = new Column(nomalized, dataType);
+		Column newCol = new Column(normalized, dataType);
 		fields.add(newCol);
 		fieldsByQialifiedName.put(newCol.getQualifiedName(), fields.size() - 1);
     fieldsByName.put(newCol.getColumnName(), TUtil.newList(fields.size() - 1));

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/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 e1be420..1747e68 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
@@ -18,12 +18,12 @@
 
 package org.apache.tajo.catalog;
 
-import org.apache.tajo.catalog.json.CatalogGsonHelper;
-import org.junit.Before;
-import org.junit.Test;
 import org.apache.tajo.catalog.exception.AlreadyExistsFieldException;
+import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
 import org.apache.tajo.common.TajoDataTypes.Type;
+import org.junit.Before;
+import org.junit.Test;
 
 import static org.junit.Assert.*;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/DataChannel.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/DataChannel.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/DataChannel.java
index be1852d..e00d534 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/DataChannel.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/DataChannel.java
@@ -167,7 +167,7 @@ public class DataChannel {
   }
 
   public void setSchema(Schema schema) {
-    this.schema = schema;
+    this.schema = (Schema) schema.clone();
   }
 
   public Schema getSchema() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/InsertNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/InsertNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/InsertNode.java
index 65c0dfa..ed13fb2 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/InsertNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/InsertNode.java
@@ -44,6 +44,7 @@ public class InsertNode extends LogicalNode implements Cloneable {
     this.targetTableDesc = desc;
     this.subQuery = subQuery;
     this.setInSchema(subQuery.getOutSchema());
+    this.setOutSchema(subQuery.getOutSchema());
   }
 
   public InsertNode(Path location, LogicalNode subQuery) {
@@ -51,6 +52,7 @@ public class InsertNode extends LogicalNode implements Cloneable {
     this.path = location;
     this.subQuery = subQuery;
     this.setInSchema(subQuery.getOutSchema());
+    this.setOutSchema(subQuery.getOutSchema());
   }
 
   public boolean isOverwrite() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
index fb1f729..c29f60c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
@@ -161,7 +161,7 @@ public class LogicalPlan {
 
       Column column = schema.getColumnByFQN(columnRef.getCanonicalName());
       if (column == null) {
-        throw new VerifyException("ERROR: no such a column '"+ column.getQualifiedName() + "'");
+        throw new VerifyException("ERROR: no such a column '"+ columnRef.getCanonicalName() + "'");
       }
 
       return column;
@@ -365,15 +365,15 @@ public class LogicalPlan {
     }
 
     public boolean containRelation(String name) {
-      return relations.containsKey(name);
+      return relations.containsKey(PlannerUtil.normalizeTableName(name));
     }
 
     public void addRelation(RelationNode relation) {
-      relations.put(relation.getCanonicalName(), relation);
+      relations.put(PlannerUtil.normalizeTableName(relation.getCanonicalName()), relation);
     }
 
     public RelationNode getRelation(String name) {
-      return relations.get(name);
+      return relations.get(PlannerUtil.normalizeTableName(name));
     }
 
     public Collection<RelationNode> getRelations() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
index 173ad55..45f40f9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
@@ -87,6 +87,9 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
     if (hasJoinQual()) {
       planStr.addExplan("Join Cond: " + joinQual.toString());
     }
+
+    planStr.addDetail("in schema: " + getInSchema());
+    planStr.addDetail("out schema: " + getOutSchema());
     return planStr;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
index 55b7963..3596e2d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
@@ -24,6 +24,7 @@ import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.engine.eval.EvalNode;
 import org.apache.tajo.engine.planner.PlanString;
+import org.apache.tajo.engine.planner.PlannerUtil;
 import org.apache.tajo.engine.planner.Target;
 import org.apache.tajo.util.TUtil;
 
@@ -47,9 +48,9 @@ public class ScanNode extends RelationNode implements Projectable {
   
 	public ScanNode(TableDesc desc, String alias) {
     this(desc);
-    this.alias = alias;
+    this.alias = PlannerUtil.normalizeTableName(alias);
     renamedSchema = getOutSchema();
-    renamedSchema.setQualifier(alias, true);
+    renamedSchema.setQualifier(this.alias, true);
 	}
 	
 	public String getTableName() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/TableSubQueryNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/TableSubQueryNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/TableSubQueryNode.java
index 6b75cb8..e246466 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/TableSubQueryNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/TableSubQueryNode.java
@@ -32,11 +32,11 @@ public class TableSubQueryNode extends RelationNode implements Projectable {
 
   public TableSubQueryNode(String tableName, LogicalNode subQuery) {
     super(NodeType.TABLE_SUBQUERY);
-    this.tableName = tableName;
+    this.tableName = PlannerUtil.normalizeTableName(tableName);
     this.subQuery = subQuery;
     setOutSchema((Schema) this.subQuery.getOutSchema().clone());
-    getOutSchema().setQualifier(tableName, true);
-    setInSchema(this.subQuery.getInSchema());
+    getOutSchema().setQualifier(this.tableName, true);
+    setInSchema((Schema) this.subQuery.getInSchema().clone());
   }
 
   public String getTableName() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
index 21730db..0570a88 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
@@ -385,9 +385,8 @@ public class ProjectionPushDownRule extends BasicLogicalPlanVisitor<ProjectionPu
       }
 
       List<Target> projectedTargets = new ArrayList<Target>();
-      for (Column column : context.upperRequired) {
-        for (Target target : checkingTargets) {
-
+      for (Target target : checkingTargets) {
+        for (Column column : context.upperRequired) {
           if (target.hasAlias() && target.getAlias().equalsIgnoreCase(column.getQualifiedName())) {
             projectedTargets.add(target);
           } else {
@@ -450,7 +449,6 @@ public class ProjectionPushDownRule extends BasicLogicalPlanVisitor<ProjectionPu
     rightContext.targetListManager = buildSubBlockTargetList(plan, rightBlock,
         (TableSubQueryNode) setNode.getRightChild(), context.upperRequired);
 
-
     stack.push(setNode);
     visitChild(plan, setNode.getLeftChild(), stack, leftContext);
     visitChild(plan, setNode.getRightChild(), stack, rightContext);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/ExecutionBlock.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/ExecutionBlock.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/ExecutionBlock.java
index d509156..5637d58 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/ExecutionBlock.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/ExecutionBlock.java
@@ -14,10 +14,8 @@
 
 package org.apache.tajo.master;
 
-import com.google.common.base.Preconditions;
 import org.apache.tajo.ExecutionBlockId;
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.engine.planner.PlannerUtil;
 import org.apache.tajo.engine.planner.logical.*;
 
 import java.util.*;
@@ -110,43 +108,10 @@ public class ExecutionBlock {
     return parent;
   }
 
-  public void setParentBlock(ExecutionBlock parent) {
-    this.parent = parent;
-  }
-
-  public boolean hasChildBlock() {
-    return childSubQueries.size() > 0;
-  }
-
-  public ExecutionBlock getChildBlock(ScanNode scanNode) {
-    return childSubQueries.get(scanNode);
-  }
-
   public Collection<ExecutionBlock> getChildBlocks() {
     return Collections.unmodifiableCollection(childSubQueries.values());
   }
 
-  public Map<ScanNode, ExecutionBlock> getChildBlockMap() {
-    return childSubQueries;
-  }
-
-  public void addChildBlock(ScanNode scanNode, ExecutionBlock child) {
-    childSubQueries.put(scanNode, child);
-  }
-
-  public int getChildNum() {
-    return childSubQueries.size();
-  }
-
-  public void removeChildBlock(ScanNode scanNode) {
-    scanlist.remove(scanNode);
-    this.childSubQueries.remove(scanNode);
-  }
-
-  public void addChildBlocks(Map<ScanNode, ExecutionBlock> childBlocks) {
-    childSubQueries.putAll(childBlocks);
-  }
-
   public boolean isLeafBlock() {
     return childSubQueries.size() == 0;
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/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 5080599..c8e3d91 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
@@ -134,7 +134,7 @@ public class GlobalEngine extends AbstractService {
       Expr planningContext = hiveQueryMode ? converter.parse(sql) : analyzer.parse(sql);
       
       LogicalPlan plan = createLogicalPlan(planningContext);
-      LogicalRootNode rootNode = (LogicalRootNode) plan.getRootBlock().getRoot();
+      LogicalRootNode rootNode = plan.getRootBlock().getRoot();
 
       GetQueryStatusResponse.Builder responseBuilder = GetQueryStatusResponse.newBuilder();
       if (PlannerUtil.checkIfDDLPlan(rootNode)) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalPlanner.java
index b853ed8..48f45f6 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalPlanner.java
@@ -281,7 +281,7 @@ public class GlobalPlanner {
         LogicalNode leftNode = joinNode.getLeftChild();
         LogicalNode rightNode = joinNode.getRightChild();
 
-        ExecutionBlock leftBlock = null;
+        ExecutionBlock leftBlock;
         if (lastChildBlock == null) {
           leftBlock = masterPlan.newExecutionBlock();
           leftBlock.setPlan(leftNode);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
index bc58b2c..44c43b3 100644
--- a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
@@ -78,7 +78,7 @@
     	 out.write("<li> Store Type : " + table.getMeta().getStoreType() + "</li>");
     	 out.write("<li> Schema<ul>");
     	 Schema schema = table.getMeta().getSchema();
-    	 for(int i = 0 ; i < table.getMeta().getSchema().getColumnNum() ; i ++) {
+    	 for(int i = 0 ; i < table.getMeta().getSchema().size() ; i ++) {
     		 out.write("<li>" + schema.getColumn(i).toString() + "</li>");
     	 }
     	 out.write("</ul>");

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestTableSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestTableSubQuery.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestTableSubQuery.java
index e445089..1635398 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestTableSubQuery.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestTableSubQuery.java
@@ -70,4 +70,14 @@ public class TestTableSubQuery {
       res.close();
     }
   }
+
+  @Test
+  public final void testJoinSubQuery() throws Exception {
+    ResultSet res = tpch.execute(
+        "SELECT A.n_regionkey, B.r_regionkey, A.n_name, B.r_name " +
+        "FROM\n" +
+        "(SELECT * FROM nation WHERE n_name LIKE 'A%') A " +
+        "JOIN region B ON A.n_regionkey=B.r_regionkey");
+    System.out.println(ResultSetUtil.prettyFormat(res));
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/storage/TestFragment.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/storage/TestFragment.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/storage/TestFragment.java
index 9245b56..b378727 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/storage/TestFragment.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/storage/TestFragment.java
@@ -54,11 +54,11 @@ public class TestFragment {
     assertEquals("table1_1", fragment1.getName());
     assertEquals(new Path("/table0"), fragment1.getPath());
     assertEquals(meta1.getStoreType(), fragment1.getMeta().getStoreType());
-    assertEquals(meta1.getSchema().getColumnNum(), 
+    assertEquals(meta1.getSchema().getColumnNum(),
         fragment1.getMeta().getSchema().getColumnNum());
     assertTrue(fragment1.isDistCached());
     for(int i=0; i < meta1.getSchema().getColumnNum(); i++) {
-      assertEquals(meta1.getSchema().getColumn(i).getColumnName(), 
+      assertEquals(meta1.getSchema().getColumn(i).getColumnName(),
           fragment1.getMeta().getSchema().getColumn(i).getColumnName());
       assertEquals(meta1.getSchema().getColumn(i).getDataType(), 
           fragment1.getMeta().getSchema().getColumn(i).getDataType());
@@ -75,10 +75,10 @@ public class TestFragment {
     assertEquals("table1_1", fragment1.getName());
     assertEquals(new Path("/table0"), fragment1.getPath());
     assertEquals(meta1.getStoreType(), fragment1.getMeta().getStoreType());
-    assertEquals(meta1.getSchema().getColumnNum(), 
+    assertEquals(meta1.getSchema().getColumnNum(),
         fragment1.getMeta().getSchema().getColumnNum());
     for(int i=0; i < meta1.getSchema().getColumnNum(); i++) {
-      assertEquals(meta1.getSchema().getColumn(i).getColumnName(), 
+      assertEquals(meta1.getSchema().getColumn(i).getColumnName(),
           fragment1.getMeta().getSchema().getColumn(i).getColumnName());
       assertEquals(meta1.getSchema().getColumn(i).getDataType(), 
           fragment1.getMeta().getSchema().getColumn(i).getDataType());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TableStatistics.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TableStatistics.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TableStatistics.java
index fb0eae8..0344a25 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TableStatistics.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TableStatistics.java
@@ -45,10 +45,6 @@ public class TableStatistics {
     this.schema = schema;
     minValues = new VTuple(schema.getColumnNum());
     maxValues = new VTuple(schema.getColumnNum());
-    /*for (int i = 0; i < schema.getColumnNum(); i++) {
-      minValues[i] = Long.MAX_VALUE;
-      maxValues[i] = Long.MIN_VALUE;
-    }*/
 
     numNulls = new long[schema.getColumnNum()];
     comparable = new boolean[schema.getColumnNum()];

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/CSVFileScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/CSVFileScanner.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/CSVFileScanner.java
index f34fa84..16eca87 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/CSVFileScanner.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/CSVFileScanner.java
@@ -18,11 +18,9 @@
 
 package org.apache.tajo.storage.v2;
 
-import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -31,15 +29,12 @@ import org.apache.commons.net.util.Base64;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.Seekable;
-import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.compress.*;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.exception.UnsupportedException;
 import org.apache.tajo.storage.Fragment;
-import org.apache.tajo.storage.SeekableScanner;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.storage.compress.CodecPool;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/16d1895e/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/FileScannerV2.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/FileScannerV2.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/FileScannerV2.java
index 44c48a5..a431f5d 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/FileScannerV2.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/v2/FileScannerV2.java
@@ -21,7 +21,6 @@ package org.apache.tajo.storage.v2;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Column;
@@ -31,10 +30,7 @@ import org.apache.tajo.storage.Fragment;
 import org.apache.tajo.storage.Scanner;
 import org.apache.tajo.storage.Tuple;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicBoolean;