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;