You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/05/30 06:05:03 UTC

[01/24] tajo git commit: TAJO-1619: JDBC program is stuck after closing. (jihoon)

Repository: tajo
Updated Branches:
  refs/heads/index_support 4d01fca99 -> 8ec099c8d


TAJO-1619: JDBC program is stuck after closing. (jihoon)

Closes #584


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

Branch: refs/heads/index_support
Commit: 4b2ab61072031ee39565755c285ef267e9451b55
Parents: bbfa076
Author: Jihoon Son <ji...@apache.org>
Authored: Tue May 26 16:14:21 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Tue May 26 16:14:21 2015 +0900

----------------------------------------------------------------------
 CHANGES                                               |  2 ++
 .../org/apache/tajo/client/SessionConnection.java     | 14 ++++++++++++++
 .../java/org/apache/tajo/jdbc/JdbcConnection.java     |  4 +++-
 3 files changed, 19 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/4b2ab610/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index f1b7e6e..0d71d2f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -136,6 +136,8 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1619: JDBC program is stuck after closing. (jihoon)
+
     TAJO-1620: random() in an SQL should generate RANDOM numbers.
     (Contributed by Jongyoung Park, Committed by jihoon)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4b2ab610/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
index 84decd5..ee2d45a 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
@@ -30,9 +30,11 @@ import org.apache.tajo.ipc.ClientProtos.ResultCode;
 import org.apache.tajo.ipc.ClientProtos.SessionUpdateResponse;
 import org.apache.tajo.ipc.TajoMasterClientProtocol;
 import org.apache.tajo.rpc.NettyClientBase;
+import org.apache.tajo.rpc.RpcChannelFactory;
 import org.apache.tajo.rpc.RpcClientManager;
 import org.apache.tajo.rpc.RpcConstants;
 import org.apache.tajo.service.ServiceTracker;
+import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.ProtoUtil;
 
@@ -45,6 +47,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.tajo.ipc.ClientProtos.CreateSessionRequest;
 import static org.apache.tajo.ipc.ClientProtos.CreateSessionResponse;
@@ -54,6 +57,8 @@ public class SessionConnection implements Closeable {
 
   private final static Log LOG = LogFactory.getLog(SessionConnection.class);
 
+  private final static AtomicInteger connections = new AtomicInteger();
+
   final RpcClientManager manager;
 
   private String baseDatabase;
@@ -112,6 +117,7 @@ public class SessionConnection implements Closeable {
         // Client do not closed on idle state for support high available
         this.client = manager.newClient(getTajoMasterAddr(), TajoMasterClientProtocol.class, false,
             manager.getRetries(), 0, TimeUnit.SECONDS, false);
+        connections.incrementAndGet();
       } catch (Exception e) {
         throw new ServiceException(e);
       }
@@ -272,6 +278,14 @@ public class SessionConnection implements Closeable {
       // ignore
     } finally {
       RpcClientManager.cleanup(client);
+      if(connections.decrementAndGet() == 0) {
+        if (!System.getProperty(CommonTestingUtil.TAJO_TEST_KEY, "FALSE").equals(CommonTestingUtil.TAJO_TEST_TRUE)) {
+          RpcChannelFactory.shutdownGracefully();
+          if (LOG.isDebugEnabled()) {
+            LOG.debug("RPC connection is closed");
+          }
+        }
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4b2ab610/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
index 2879540..959860d 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
@@ -33,7 +33,9 @@ import org.apache.tajo.util.KeyValueSet;
 import java.io.IOException;
 import java.net.URI;
 import java.sql.*;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
 


[07/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan
new file mode 100644
index 0000000..f5486f9
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan
@@ -0,0 +1,132 @@
+explain
+-------------------------------
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(1) on default.jointable14 as t4
+  => filter: default.t4.id (INT4) > 1
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+JOIN(8)(INNER)
+  => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t4.id (INT4)}
+     => in schema: {(1) default.t4.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => filter: default.t3.id (INT4) > 1
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(14) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.result b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.result
new file mode 100644
index 0000000..4fc079a
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.result
@@ -0,0 +1,4 @@
+id,name,id,id
+-------------------------------
+2,table11-2,2,2
+null,null,3,null

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan
new file mode 100644
index 0000000..1c2fd7a
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan
@@ -0,0 +1,101 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
+4: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t1
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(1) on default.jointable12 as t2
+     => target list: default.t2.id (INT4)
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+   SCAN(0) on default.jointable11 as t1
+     => target list: default.t1.id (INT4), default.t1.name (TEXT)
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..5a589ff
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan
@@ -0,0 +1,128 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+SCAN(1) on default.jointable12 as t2
+  => target list: default.t2.id (INT4)
+  => out schema: {(1) default.t2.id (INT4)}
+  => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(1) default.t2.id (INT4)}
+   SCAN(10) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan
new file mode 100644
index 0000000..1c2fd7a
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan
@@ -0,0 +1,101 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
+4: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t1
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(1) on default.jointable12 as t2
+     => target list: default.t2.id (INT4)
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+   SCAN(0) on default.jointable11 as t1
+     => target list: default.t1.id (INT4), default.t1.name (TEXT)
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan
new file mode 100644
index 0000000..5a589ff
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan
@@ -0,0 +1,128 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+SCAN(1) on default.jointable12 as t2
+  => target list: default.t2.id (INT4)
+  => out schema: {(1) default.t2.id (INT4)}
+  => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4) AND concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-11 OR concat(default.t1.name (TEXT),CAST (default.t2.id (INT4) AS TEXT)) = table11-33
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(1) default.t2.id (INT4)}
+   SCAN(10) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.result b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.result
new file mode 100644
index 0000000..c5da2c4
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.result
@@ -0,0 +1,4 @@
+id,name,id,id
+-------------------------------
+2,table11-2,2,2
+null,null,null,3

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Hash.plan
index d33aa32..b271dcc 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Hash.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(RIGHT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Sort.plan
index d33aa32..b271dcc 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinWithEmptyTable1.Sort.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(RIGHT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Hash.plan
index e4156aa..4fb9de0 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Hash.plan
@@ -31,61 +31,24 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-SCAN(0) on default.customer
-  => target list: default.customer.c_custkey (INT4)
-  => out schema: {(1) default.customer.c_custkey (INT4)}
-  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.o.o_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(3) as default.o
-  => Targets: default.o.o_orderkey (INT4)
-  => out schema: {(1) default.o.o_orderkey (INT4)}
-  => in  schema: {(9) default.o.o_clerk (TEXT), default.o.o_comment (TEXT), default.o.o_custkey (INT4), default.o.o_orderdate (TEXT), default.o.o_orderkey (INT4), default.o.o_orderpriority (TEXT), default.o.o_orderstatus (TEXT), default.o.o_shippriority (INT4), default.o.o_totalprice (FLOAT8)}
-   PROJECTION(2)
-     => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderstatus (TEXT), default.orders.o_totalprice (FLOAT8), default.orders.o_orderdate (TEXT), default.orders.o_orderpriority (TEXT), default.orders.o_clerk (TEXT), default.orders.o_shippriority (INT4), default.orders.o_comment (TEXT)
-     => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-     => in  schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-      SCAN(1) on default.orders
-        => target list: default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)
-        => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.o.o_orderkey (INT4), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.o.o_orderkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.orders
+
 SORT(12)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.o.o_orderkey (INT4) (asc)
    JOIN(8)(LEFT_OUTER)
@@ -93,12 +56,22 @@ SORT(12)
      => target list: default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)}
-      SCAN(11) on eb_0000000000000_0000_000002
+      TABLE_SUBQUERY(3) as default.o
+        => Targets: default.o.o_orderkey (INT4)
         => out schema: {(1) default.o.o_orderkey (INT4)}
-        => in schema: {(1) default.o.o_orderkey (INT4)}
-      SCAN(10) on eb_0000000000000_0000_000001
+        => in  schema: {(9) default.o.o_clerk (TEXT), default.o.o_comment (TEXT), default.o.o_custkey (INT4), default.o.o_orderdate (TEXT), default.o.o_orderkey (INT4), default.o.o_orderpriority (TEXT), default.o.o_orderstatus (TEXT), default.o.o_shippriority (INT4), default.o.o_totalprice (FLOAT8)}
+         PROJECTION(2)
+           => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderstatus (TEXT), default.orders.o_totalprice (FLOAT8), default.orders.o_orderdate (TEXT), default.orders.o_orderpriority (TEXT), default.orders.o_clerk (TEXT), default.orders.o_shippriority (INT4), default.orders.o_comment (TEXT)
+           => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+           => in  schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+            SCAN(1) on default.orders
+              => target list: default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)
+              => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+              => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+      SCAN(0) on default.customer
+        => target list: default.customer.c_custkey (INT4)
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(1) default.customer.c_custkey (INT4)}
+        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Sort.plan
index e4156aa..4fb9de0 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithConstantExpr2.Sort.plan
@@ -31,61 +31,24 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-SCAN(0) on default.customer
-  => target list: default.customer.c_custkey (INT4)
-  => out schema: {(1) default.customer.c_custkey (INT4)}
-  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.o.o_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(3) as default.o
-  => Targets: default.o.o_orderkey (INT4)
-  => out schema: {(1) default.o.o_orderkey (INT4)}
-  => in  schema: {(9) default.o.o_clerk (TEXT), default.o.o_comment (TEXT), default.o.o_custkey (INT4), default.o.o_orderdate (TEXT), default.o.o_orderkey (INT4), default.o.o_orderpriority (TEXT), default.o.o_orderstatus (TEXT), default.o.o_shippriority (INT4), default.o.o_totalprice (FLOAT8)}
-   PROJECTION(2)
-     => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderstatus (TEXT), default.orders.o_totalprice (FLOAT8), default.orders.o_orderdate (TEXT), default.orders.o_orderpriority (TEXT), default.orders.o_clerk (TEXT), default.orders.o_shippriority (INT4), default.orders.o_comment (TEXT)
-     => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-     => in  schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-      SCAN(1) on default.orders
-        => target list: default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)
-        => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.o.o_orderkey (INT4), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.o.o_orderkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.orders
+
 SORT(12)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.o.o_orderkey (INT4) (asc)
    JOIN(8)(LEFT_OUTER)
@@ -93,12 +56,22 @@ SORT(12)
      => target list: default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.o.o_orderkey (INT4)}
-      SCAN(11) on eb_0000000000000_0000_000002
+      TABLE_SUBQUERY(3) as default.o
+        => Targets: default.o.o_orderkey (INT4)
         => out schema: {(1) default.o.o_orderkey (INT4)}
-        => in schema: {(1) default.o.o_orderkey (INT4)}
-      SCAN(10) on eb_0000000000000_0000_000001
+        => in  schema: {(9) default.o.o_clerk (TEXT), default.o.o_comment (TEXT), default.o.o_custkey (INT4), default.o.o_orderdate (TEXT), default.o.o_orderkey (INT4), default.o.o_orderpriority (TEXT), default.o.o_orderstatus (TEXT), default.o.o_shippriority (INT4), default.o.o_totalprice (FLOAT8)}
+         PROJECTION(2)
+           => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderstatus (TEXT), default.orders.o_totalprice (FLOAT8), default.orders.o_orderdate (TEXT), default.orders.o_orderpriority (TEXT), default.orders.o_clerk (TEXT), default.orders.o_shippriority (INT4), default.orders.o_comment (TEXT)
+           => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+           => in  schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+            SCAN(1) on default.orders
+              => target list: default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)
+              => out schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+              => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+      SCAN(0) on default.customer
+        => target list: default.customer.c_custkey (INT4)
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(1) default.customer.c_custkey (INT4)}
+        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Hash.plan
index a978415..2e0cc87 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Hash.plan
@@ -37,88 +37,58 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
-5: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-
-SCAN(0) on default.jointable11 as a
-  => target list: default.a.id (INT4)
-  => out schema: {(1) default.a.id (INT4)}
-  => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.lineitem
- 1: type=Broadcast, tables=default.jointable12
+ 0: type=Broadcast, tables=default.jointable12
+ 1: type=Broadcast, tables=default.lineitem
 
-TABLE_SUBQUERY(5) as default.b
-  => Targets: default.b.id (INT4)
-  => out schema: {(1) default.b.id (INT4)}
-  => in  schema: {(1) default.b.id (INT4)}
-   PROJECTION(4)
-     => Targets: default.jointable12.id (INT4)
-     => out schema: {(1) default.jointable12.id (INT4)}
-     => in  schema: {(1) default.jointable12.id (INT4)}
-      JOIN(10)(INNER)
-        => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
-        => target list: default.jointable12.id (INT4)
-        => out schema: {(1) default.jointable12.id (INT4)}
-        => in schema: {(2) default.jointable12.id (INT4), default.lineitem.l_orderkey (INT4)}
-         SCAN(1) on default.jointable12
-           => filter: default.jointable12.id (INT4) > 10
-           => target list: default.jointable12.id (INT4)
-           => out schema: {(1) default.jointable12.id (INT4)}
-           => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-         SCAN(2) on default.lineitem
-           => target list: default.lineitem.l_orderkey (INT4)
-           => out schema: {(1) default.lineitem.l_orderkey (INT4)}
-           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), num=32)
-
-SORT(15)
+SORT(17)
   => Sort Keys: default.a.id (INT4) (asc)
    JOIN(11)(LEFT_OUTER)
      => Join Cond: default.a.id (INT4) = default.b.id (INT4)
      => target list: default.a.id (INT4), default.b.id (INT4)
      => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
      => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
-      SCAN(14) on eb_0000000000000_0000_000004
+      TABLE_SUBQUERY(5) as default.b
+        => Targets: default.b.id (INT4)
         => out schema: {(1) default.b.id (INT4)}
-        => in schema: {(1) default.b.id (INT4)}
-      SCAN(13) on eb_0000000000000_0000_000001
+        => in  schema: {(1) default.b.id (INT4)}
+         PROJECTION(4)
+           => Targets: default.jointable12.id (INT4)
+           => out schema: {(1) default.jointable12.id (INT4)}
+           => in  schema: {(1) default.jointable12.id (INT4)}
+            JOIN(10)(INNER)
+              => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
+              => target list: default.jointable12.id (INT4)
+              => out schema: {(1) default.jointable12.id (INT4)}
+              => in schema: {(2) default.jointable12.id (INT4), default.lineitem.l_orderkey (INT4)}
+               SCAN(1) on default.jointable12
+                 => filter: default.jointable12.id (INT4) > 10
+                 => target list: default.jointable12.id (INT4)
+                 => out schema: {(1) default.jointable12.id (INT4)}
+                 => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+               SCAN(2) on default.lineitem
+                 => target list: default.lineitem.l_orderkey (INT4)
+                 => out schema: {(1) default.lineitem.l_orderkey (INT4)}
+                 => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+      SCAN(0) on default.jointable11 as a
+        => target list: default.a.id (INT4)
         => out schema: {(1) default.a.id (INT4)}
-        => in schema: {(1) default.a.id (INT4)}
+        => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]
@@ -132,7 +102,7 @@ Block Id: eb_0000000000000_0000_000006 [ROOT]
 
 SORT(7)
   => Sort Keys: default.a.id (INT4) (asc)
-   SCAN(16) on eb_0000000000000_0000_000005
+   SCAN(18) on eb_0000000000000_0000_000005
      => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
      => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Sort.plan
index a978415..2e0cc87 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery1.1.Sort.plan
@@ -37,88 +37,58 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
-5: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-
-SCAN(0) on default.jointable11 as a
-  => target list: default.a.id (INT4)
-  => out schema: {(1) default.a.id (INT4)}
-  => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.lineitem
- 1: type=Broadcast, tables=default.jointable12
+ 0: type=Broadcast, tables=default.jointable12
+ 1: type=Broadcast, tables=default.lineitem
 
-TABLE_SUBQUERY(5) as default.b
-  => Targets: default.b.id (INT4)
-  => out schema: {(1) default.b.id (INT4)}
-  => in  schema: {(1) default.b.id (INT4)}
-   PROJECTION(4)
-     => Targets: default.jointable12.id (INT4)
-     => out schema: {(1) default.jointable12.id (INT4)}
-     => in  schema: {(1) default.jointable12.id (INT4)}
-      JOIN(10)(INNER)
-        => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
-        => target list: default.jointable12.id (INT4)
-        => out schema: {(1) default.jointable12.id (INT4)}
-        => in schema: {(2) default.jointable12.id (INT4), default.lineitem.l_orderkey (INT4)}
-         SCAN(1) on default.jointable12
-           => filter: default.jointable12.id (INT4) > 10
-           => target list: default.jointable12.id (INT4)
-           => out schema: {(1) default.jointable12.id (INT4)}
-           => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-         SCAN(2) on default.lineitem
-           => target list: default.lineitem.l_orderkey (INT4)
-           => out schema: {(1) default.lineitem.l_orderkey (INT4)}
-           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), num=32)
-
-SORT(15)
+SORT(17)
   => Sort Keys: default.a.id (INT4) (asc)
    JOIN(11)(LEFT_OUTER)
      => Join Cond: default.a.id (INT4) = default.b.id (INT4)
      => target list: default.a.id (INT4), default.b.id (INT4)
      => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
      => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
-      SCAN(14) on eb_0000000000000_0000_000004
+      TABLE_SUBQUERY(5) as default.b
+        => Targets: default.b.id (INT4)
         => out schema: {(1) default.b.id (INT4)}
-        => in schema: {(1) default.b.id (INT4)}
-      SCAN(13) on eb_0000000000000_0000_000001
+        => in  schema: {(1) default.b.id (INT4)}
+         PROJECTION(4)
+           => Targets: default.jointable12.id (INT4)
+           => out schema: {(1) default.jointable12.id (INT4)}
+           => in  schema: {(1) default.jointable12.id (INT4)}
+            JOIN(10)(INNER)
+              => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
+              => target list: default.jointable12.id (INT4)
+              => out schema: {(1) default.jointable12.id (INT4)}
+              => in schema: {(2) default.jointable12.id (INT4), default.lineitem.l_orderkey (INT4)}
+               SCAN(1) on default.jointable12
+                 => filter: default.jointable12.id (INT4) > 10
+                 => target list: default.jointable12.id (INT4)
+                 => out schema: {(1) default.jointable12.id (INT4)}
+                 => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+               SCAN(2) on default.lineitem
+                 => target list: default.lineitem.l_orderkey (INT4)
+                 => out schema: {(1) default.lineitem.l_orderkey (INT4)}
+                 => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+      SCAN(0) on default.jointable11 as a
+        => target list: default.a.id (INT4)
         => out schema: {(1) default.a.id (INT4)}
-        => in schema: {(1) default.a.id (INT4)}
+        => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]
@@ -132,7 +102,7 @@ Block Id: eb_0000000000000_0000_000006 [ROOT]
 
 SORT(7)
   => Sort Keys: default.a.id (INT4) (asc)
-   SCAN(16) on eb_0000000000000_0000_000005
+   SCAN(18) on eb_0000000000000_0000_000005
      => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
      => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Hash.plan
index c4c25da..45b95c2 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Hash.plan
@@ -34,82 +34,52 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.lineitem
- 1: type=Broadcast, tables=default.jointable12
-
-TABLE_SUBQUERY(4) as default.a
-  => Targets: default.a.id (INT4)
-  => out schema: {(1) default.a.id (INT4)}
-  => in  schema: {(3) default.a.id (INT4), default.a.name (TEXT), default.a.l_shipdate (TEXT)}
-   PROJECTION(3)
-     => Targets: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
-     => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-     => in  schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-      JOIN(9)(INNER)
-        => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
-        => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
-        => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-        => in schema: {(4) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
-         SCAN(0) on default.jointable12
-           => filter: default.jointable12.id (INT4) > 10
-           => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT)
-           => out schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-           => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-         SCAN(1) on default.lineitem
-           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)
-           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
-           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
-
-SCAN(5) on default.jointable11 as b
-  => target list: default.b.id (INT4)
-  => out schema: {(1) default.b.id (INT4)}
-  => in schema: {(2) default.b.id (INT4), default.b.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.jointable12
+ 1: type=Broadcast, tables=default.b
 
 JOIN(10)(LEFT_OUTER)
   => Join Cond: default.a.id (INT4) = default.b.id (INT4)
   => target list: default.a.id (INT4), default.b.id (INT4)
   => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
   => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000004
+   SCAN(5) on default.jointable11 as b
+     => target list: default.b.id (INT4)
      => out schema: {(1) default.b.id (INT4)}
-     => in schema: {(1) default.b.id (INT4)}
-   SCAN(12) on eb_0000000000000_0000_000003
+     => in schema: {(2) default.b.id (INT4), default.b.name (TEXT)}
+   TABLE_SUBQUERY(4) as default.a
+     => Targets: default.a.id (INT4)
      => out schema: {(1) default.a.id (INT4)}
-     => in schema: {(1) default.a.id (INT4)}
+     => in  schema: {(3) default.a.id (INT4), default.a.name (TEXT), default.a.l_shipdate (TEXT)}
+      PROJECTION(3)
+        => Targets: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
+        => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+        => in  schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+         JOIN(9)(INNER)
+           => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
+           => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
+           => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+           => in schema: {(4) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
+            SCAN(0) on default.jointable12
+              => filter: default.jointable12.id (INT4) > 10
+              => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT)
+              => out schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+              => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+            SCAN(1) on default.lineitem
+              => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)
+              => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
+              => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]


[03/24] tajo git commit: TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)

Posted by ji...@apache.org.
TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)

Closes #586


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

Branch: refs/heads/index_support
Commit: 1872df94355bed50a3ac55ffd7632ab532bdb506
Parents: 25bd5cb
Author: Jinho Kim <jh...@apache.org>
Authored: Wed May 27 11:04:43 2015 +0900
Committer: Jinho Kim <jh...@apache.org>
Committed: Wed May 27 11:04:43 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 tajo-core/pom.xml                               |   1 +
 .../apache/tajo/engine/utils/ThreadUtil.java    | 149 -------------------
 .../org/apache/tajo/ha/HdfsServiceTracker.java  |  13 +-
 .../org/apache/tajo/TajoTestingCluster.java     |   1 +
 5 files changed, 11 insertions(+), 155 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/1872df94/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index c79a185..58944a5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -136,6 +136,8 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)
+
     TAJO-1619: JDBC program is stuck after closing. (jihoon)
 
     TAJO-1620: random() in an SQL should generate RANDOM numbers.

http://git-wip-us.apache.org/repos/asf/tajo/blob/1872df94/tajo-core/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-core/pom.xml b/tajo-core/pom.xml
index c9367b2..4b3936e 100644
--- a/tajo-core/pom.xml
+++ b/tajo-core/pom.xml
@@ -585,6 +585,7 @@
             <configuration combine.self="override">
               <forkCount>${maven.fork.count}</forkCount>
               <reuseForks>true</reuseForks>
+              <trimStackTrace>false</trimStackTrace>
               <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=152m -Dfile.encoding=UTF-8</argLine>
               <useSystemClassLoader>true</useSystemClassLoader>
               <useManifestOnlyJar>true</useManifestOnlyJar>

http://git-wip-us.apache.org/repos/asf/tajo/blob/1872df94/tajo-core/src/main/java/org/apache/tajo/engine/utils/ThreadUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/ThreadUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/ThreadUtil.java
deleted file mode 100644
index 23b1e5d..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/ThreadUtil.java
+++ /dev/null
@@ -1,149 +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.engine.utils;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.util.ReflectionUtils;
-
-import java.io.PrintWriter;
-import java.lang.Thread.UncaughtExceptionHandler;
-
-public class ThreadUtil {
-	protected static final Log LOG = LogFactory.getLog(ThreadUtil.class);
-
-	  /**
-	   * Utility method that sets name, daemon status and starts passed thread.
-	   * @param t thread to run
-	   * @return Returns the passed Thread <code>t</code>.
-	   */
-	  public static Thread setDaemonThreadRunning(final Thread t) {
-	    return setDaemonThreadRunning(t, t.getName());
-	  }
-
-	  /**
-	   * Utility method that sets name, daemon status and starts passed thread.
-	   * @param t thread to frob
-	   * @param name new name
-	   * @return Returns the passed Thread <code>t</code>.
-	   */
-	  public static Thread setDaemonThreadRunning(final Thread t,
-	    final String name) {
-	    return setDaemonThreadRunning(t, name, null);
-	  }
-
-	  /**
-	   * Utility method that sets name, daemon status and starts passed thread.
-	   * @param t thread to frob
-	   * @param name new name
-	   * @param handler A handler to set on the thread.  Pass null if want to
-	   * use default handler.
-	   * @return Returns the passed Thread <code>t</code>.
-	   */
-	  public static Thread setDaemonThreadRunning(final Thread t,
-	    final String name, final UncaughtExceptionHandler handler) {
-	    t.setName(name);
-	    if (handler != null) {
-	      t.setUncaughtExceptionHandler(handler);
-	    }
-	    t.setDaemon(true);
-	    t.start();
-	    return t;
-	  }
-
-	  /**
-	   * Shutdown passed thread using isAlive and join.
-	   * @param t Thread to shutdown
-	   */
-	  public static void shutdown(final Thread t) {
-	    shutdown(t, 0);
-	  }
-
-	  /**
-	   * Shutdown passed thread using isAlive and join.
-	   * @param joinwait Pass 0 if we're to wait forever.
-	   * @param t Thread to shutdown
-	   */
-	  public static void shutdown(final Thread t, final long joinwait) {
-	    if (t == null) return;
-	    while (t.isAlive()) {
-	      try {
-	        t.join(joinwait);
-	      } catch (InterruptedException e) {
-	        LOG.warn(t.getName() + "; joinwait=" + joinwait, e);
-	      }
-	    }
-	  }
-
-
-	  /**
-	   * @param t Waits on the passed thread to die dumping a threaddump every
-	   * minute while its up.
-	   * @throws InterruptedException
-	   */
-	  public static void threadDumpingIsAlive(final Thread t)
-	  throws InterruptedException {
-	    if (t == null) {
-	      return;
-	    }
-
-	    while (t.isAlive()) {
-	      t.join(60 * 1000);
-	      if (t.isAlive()) {
-	        ReflectionUtils.printThreadInfo(new PrintWriter(System.out),
-	            "Automatic Stack Trace every 60 seconds waiting on " +
-	            t.getName());
-	      }
-	    }
-	  }
-
-	  /**
-	   * @param millis How long to sleep for in milliseconds.
-	   */
-	  public static void sleep(int millis) {
-	    try {
-	      Thread.sleep(millis);
-	    } catch (InterruptedException e) {
-	      e.printStackTrace();
-	    }
-	  }
-
-	  /**
-	   * Sleeps for the given amount of time even if interrupted. Preserves
-	   * the interrupt status.
-	   * @param msToWait the amount of time to sleep in milliseconds
-	   */
-	  public static void sleepWithoutInterrupt(final long msToWait) {
-	    long timeMillis = System.currentTimeMillis();
-	    long endTime = timeMillis + msToWait;
-	    boolean interrupted = false;
-	    while (timeMillis < endTime) {
-	      try {
-	        Thread.sleep(endTime - timeMillis);
-	      } catch (InterruptedException ex) {
-	        interrupted = true;
-	      }
-	      timeMillis = System.currentTimeMillis();
-	    }
-
-	    if (interrupted) {
-	      Thread.currentThread().interrupt();
-	    }
-	  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1872df94/tajo-core/src/main/java/org/apache/tajo/ha/HdfsServiceTracker.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ha/HdfsServiceTracker.java b/tajo-core/src/main/java/org/apache/tajo/ha/HdfsServiceTracker.java
index 5f1aff8..d0eb985 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ha/HdfsServiceTracker.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ha/HdfsServiceTracker.java
@@ -350,6 +350,13 @@ public class HdfsServiceTracker extends HAServiceTracker {
     @Override
     public void run() {
       while (!stopped && !Thread.currentThread().isInterrupted()) {
+        try {
+          Thread.sleep(monitorInterval);
+        } catch (InterruptedException e) {
+          LOG.info("PingChecker interrupted. - masterName:" + masterName);
+          break;
+        }
+
         synchronized (HdfsServiceTracker.this) {
           try {
             if (!currentActiveMaster.equals(masterName)) {
@@ -371,12 +378,6 @@ public class HdfsServiceTracker extends HAServiceTracker {
             e.printStackTrace();
           }
         }
-        try {
-          Thread.sleep(monitorInterval);
-        } catch (InterruptedException e) {
-          LOG.info("PingChecker interrupted. - masterName:" + masterName);
-          break;
-        }
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/1872df94/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
index fcb9b58..f4818f6 100644
--- a/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -509,6 +509,7 @@ public class TajoTestingCluster {
     startMiniDFSCluster(numDataNodes, clusterTestBuildDir, dataNodeHosts);
     this.dfsCluster.waitClusterUp();
 
+    conf.setInt("hbase.hconnection.threads.core", 50);
     hbaseUtil = new HBaseTestClusterUtil(conf, clusterTestBuildDir);
 
     startMiniTajoCluster(this.clusterTestBuildDir, numSlaves, false);


[11/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort.plan
index 88c814d..cfbb849 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort.plan
@@ -43,95 +43,62 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000008
    |-eb_0000000000000_0000_000007
-      |-eb_0000000000000_0000_000006
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      JOIN(12)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
 [Enforcers]
- 0: type=Broadcast, tables=default.s
+ 0: type=Broadcast, tables=default.r
  1: type=Broadcast, tables=default.ps
-
-JOIN(13)(INNER)
-  => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-  => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(7) on default.partsupp as ps
-     => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-     => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-     => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-   SCAN(5) on default.supplier as s
-     => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-     => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+ 2: type=Broadcast, tables=default.s
 
 JOIN(14)(INNER)
   => Join Cond: default.s.s_nationkey (INT4) = default.t.n_nationkey (INT4)
   => target list: default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)
   => out schema: {(6) default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
   => in schema: {(7) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   SCAN(17) on eb_0000000000000_0000_000006
+   JOIN(13)(INNER)
+     => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+     => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
      => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(16) on eb_0000000000000_0000_000003
+     => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+      SCAN(7) on default.partsupp as ps
+        => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+        => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+        => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+      SCAN(5) on default.supplier as s
+        => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+        => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+        => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+   TABLE_SUBQUERY(4) as default.t
+     => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
      => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-     => in schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+     => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
+      PROJECTION(3)
+        => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+         JOIN(12)(INNER)
+           => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            SCAN(1) on default.region as r
+              => target list: default.r.r_regionkey (INT4)
+              => out schema: {(1) default.r.r_regionkey (INT4)}
+              => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+            SCAN(0) on default.nation as n
+              => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+              => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000008 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash.plan
index 15be610..a9b0876 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash.plan
@@ -45,83 +45,21 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000008
    |-eb_0000000000000_0000_000007
-      |-eb_0000000000000_0000_000006
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      JOIN(12)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
 [Enforcers]
- 0: type=Broadcast, tables=default.s
+ 0: type=Broadcast, tables=default.r
  1: type=Broadcast, tables=default.ps
-
-JOIN(13)(INNER)
-  => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-  => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(7) on default.partsupp as ps
-     => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-     => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-     => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-   SCAN(5) on default.supplier as s
-     => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-     => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+ 2: type=Broadcast, tables=default.s
 
 SELECTION(9)
   => Search Cond: default.t.n_nationkey (INT4) > default.s.s_suppkey (INT4)
@@ -130,12 +68,41 @@ SELECTION(9)
      => target list: default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)
      => out schema: {(6) default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
      => in schema: {(7) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-      SCAN(17) on eb_0000000000000_0000_000006
+      JOIN(13)(INNER)
+        => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+        => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
         => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-        => in schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-      SCAN(16) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+         SCAN(7) on default.partsupp as ps
+           => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+           => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+           => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+         SCAN(5) on default.supplier as s
+           => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+           => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+           => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+      TABLE_SUBQUERY(4) as default.t
+        => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
         => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-        => in schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+        => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
+         PROJECTION(3)
+           => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+            JOIN(12)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+              => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(0) on default.nation as n
+                 => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
+                 => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000008 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort.plan
index 15be610..a9b0876 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort.plan
@@ -45,83 +45,21 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000008
    |-eb_0000000000000_0000_000007
-      |-eb_0000000000000_0000_000006
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      JOIN(12)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
 [Enforcers]
- 0: type=Broadcast, tables=default.s
+ 0: type=Broadcast, tables=default.r
  1: type=Broadcast, tables=default.ps
-
-JOIN(13)(INNER)
-  => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-  => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(7) on default.partsupp as ps
-     => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-     => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-     => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-   SCAN(5) on default.supplier as s
-     => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-     => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+ 2: type=Broadcast, tables=default.s
 
 SELECTION(9)
   => Search Cond: default.t.n_nationkey (INT4) > default.s.s_suppkey (INT4)
@@ -130,12 +68,41 @@ SELECTION(9)
      => target list: default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)
      => out schema: {(6) default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
      => in schema: {(7) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-      SCAN(17) on eb_0000000000000_0000_000006
+      JOIN(13)(INNER)
+        => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+        => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
         => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-        => in schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-      SCAN(16) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+         SCAN(7) on default.partsupp as ps
+           => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+           => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+           => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+         SCAN(5) on default.supplier as s
+           => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+           => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+           => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+      TABLE_SUBQUERY(4) as default.t
+        => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
         => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-        => in schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+        => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
+         PROJECTION(3)
+           => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+            JOIN(12)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+              => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(0) on default.nation as n
+                 => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
+                 => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000008 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash.plan
new file mode 100644
index 0000000..c0b6f82
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash.plan
@@ -0,0 +1,142 @@
+explain
+-------------------------------
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         GROUP_BY(4)(r_regionkey)
+           => exprs: (count())
+           => target list: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            JOIN(11)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+              => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+              => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(2) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.nation as n
+                 => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
+      |-eb_0000000000000_0000_000006
+         |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
+4: eb_0000000000000_0000_000008
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 6 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.r
+
+GROUP_BY(16)(r_regionkey)
+  => exprs: (count())
+  => target list: default.r.r_regionkey (INT4), ?count_4 (INT8)
+  => out schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+  => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+   JOIN(11)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+      SCAN(2) on default.region as r
+        => target list: default.r.r_regionkey (INT4)
+        => out schema: {(1) default.r.r_regionkey (INT4)}
+        => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+      SCAN(1) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 6 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.n
+
+SORT(20)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         PROJECTION(5)
+           => Targets: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in  schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+            GROUP_BY(4)(r_regionkey)
+              => exprs: (count(?count_4 (INT8)))
+              => target list: default.r.r_regionkey (INT4), cnt (INT8)
+              => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+              => in schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+               SCAN(17) on eb_0000000000000_0000_000003
+                 => out schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+                 => in schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000006
+
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   SCAN(21) on eb_0000000000000_0000_000006
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..6509afc
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Hash_NoBroadcast.plan
@@ -0,0 +1,196 @@
+explain
+-------------------------------
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         GROUP_BY(4)(r_regionkey)
+           => exprs: (count())
+           => target list: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            JOIN(11)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+              => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+              => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(2) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.nation as n
+                 => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
+      |-eb_0000000000000_0000_000006
+         |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+            |-eb_0000000000000_0000_000003
+               |-eb_0000000000000_0000_000002
+               |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+8: eb_0000000000000_0000_000008
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+SCAN(1) on default.nation as n
+  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+  => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+SCAN(2) on default.region as r
+  => target list: default.r.r_regionkey (INT4)
+  => out schema: {(1) default.r.r_regionkey (INT4)}
+  => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+GROUP_BY(16)(r_regionkey)
+  => exprs: (count())
+  => target list: default.r.r_regionkey (INT4), ?count_4 (INT8)
+  => out schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+  => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+   JOIN(11)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+      SCAN(15) on eb_0000000000000_0000_000002
+        => out schema: {(1) default.r.r_regionkey (INT4)}
+        => in schema: {(1) default.r.r_regionkey (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000001
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.t.r_regionkey (INT4), num=32)
+
+TABLE_SUBQUERY(6) as default.t
+  => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+  => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+  => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+   PROJECTION(5)
+     => Targets: default.r.r_regionkey (INT4), cnt (INT8)
+     => out schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+     => in  schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+      GROUP_BY(4)(r_regionkey)
+        => exprs: (count(?count_4 (INT8)))
+        => target list: default.r.r_regionkey (INT4), cnt (INT8)
+        => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+        => in schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+         SCAN(17) on eb_0000000000000_0000_000003
+           => out schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+           => in schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+SCAN(0) on default.nation as n
+  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+  => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.t.r_regionkey (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+SORT(20)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(19) on eb_0000000000000_0000_000005
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      SCAN(18) on eb_0000000000000_0000_000004
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000006
+
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   SCAN(21) on eb_0000000000000_0000_000006
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort.plan
new file mode 100644
index 0000000..c0b6f82
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort.plan
@@ -0,0 +1,142 @@
+explain
+-------------------------------
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         GROUP_BY(4)(r_regionkey)
+           => exprs: (count())
+           => target list: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            JOIN(11)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+              => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+              => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(2) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.nation as n
+                 => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
+      |-eb_0000000000000_0000_000006
+         |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
+4: eb_0000000000000_0000_000008
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 6 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.r
+
+GROUP_BY(16)(r_regionkey)
+  => exprs: (count())
+  => target list: default.r.r_regionkey (INT4), ?count_4 (INT8)
+  => out schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+  => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+   JOIN(11)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+      SCAN(2) on default.region as r
+        => target list: default.r.r_regionkey (INT4)
+        => out schema: {(1) default.r.r_regionkey (INT4)}
+        => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+      SCAN(1) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 6 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.n
+
+SORT(20)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         PROJECTION(5)
+           => Targets: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in  schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+            GROUP_BY(4)(r_regionkey)
+              => exprs: (count(?count_4 (INT8)))
+              => target list: default.r.r_regionkey (INT4), cnt (INT8)
+              => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+              => in schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+               SCAN(17) on eb_0000000000000_0000_000003
+                 => out schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+                 => in schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000006
+
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   SCAN(21) on eb_0000000000000_0000_000006
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort_NoBroadcast.plan
new file mode 100644
index 0000000..6509afc
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.Sort_NoBroadcast.plan
@@ -0,0 +1,196 @@
+explain
+-------------------------------
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(0) on default.nation as n
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      TABLE_SUBQUERY(6) as default.t
+        => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+         GROUP_BY(4)(r_regionkey)
+           => exprs: (count())
+           => target list: default.r.r_regionkey (INT4), cnt (INT8)
+           => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+           => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            JOIN(11)(INNER)
+              => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+              => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+              => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+              => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+               SCAN(2) on default.region as r
+                 => target list: default.r.r_regionkey (INT4)
+                 => out schema: {(1) default.r.r_regionkey (INT4)}
+                 => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+               SCAN(1) on default.nation as n
+                 => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+                 => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+                 => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
+      |-eb_0000000000000_0000_000006
+         |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+            |-eb_0000000000000_0000_000003
+               |-eb_0000000000000_0000_000002
+               |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+8: eb_0000000000000_0000_000008
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+SCAN(1) on default.nation as n
+  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+  => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+SCAN(2) on default.region as r
+  => target list: default.r.r_regionkey (INT4)
+  => out schema: {(1) default.r.r_regionkey (INT4)}
+  => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+GROUP_BY(16)(r_regionkey)
+  => exprs: (count())
+  => target list: default.r.r_regionkey (INT4), ?count_4 (INT8)
+  => out schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+  => in schema:{(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+   JOIN(11)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+      SCAN(15) on eb_0000000000000_0000_000002
+        => out schema: {(1) default.r.r_regionkey (INT4)}
+        => in schema: {(1) default.r.r_regionkey (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000001
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.t.r_regionkey (INT4), num=32)
+
+TABLE_SUBQUERY(6) as default.t
+  => Targets: default.t.cnt (INT8), default.t.r_regionkey (INT4)
+  => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+  => in  schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+   PROJECTION(5)
+     => Targets: default.r.r_regionkey (INT4), cnt (INT8)
+     => out schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+     => in  schema: {(2) cnt (INT8), default.r.r_regionkey (INT4)}
+      GROUP_BY(4)(r_regionkey)
+        => exprs: (count(?count_4 (INT8)))
+        => target list: default.r.r_regionkey (INT4), cnt (INT8)
+        => out schema:{(2) cnt (INT8), default.r.r_regionkey (INT4)}
+        => in schema:{(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+         SCAN(17) on eb_0000000000000_0000_000003
+           => out schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+           => in schema: {(2) default.r.r_regionkey (INT4), ?count_4 (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+SCAN(0) on default.nation as n
+  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+  => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.t.r_regionkey (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.n.n_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+SORT(20)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   JOIN(12)(INNER)
+     => Join Cond: default.n.n_regionkey (INT4) = default.t.r_regionkey (INT4)
+     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(5) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+      SCAN(19) on eb_0000000000000_0000_000005
+        => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      SCAN(18) on eb_0000000000000_0000_000004
+        => out schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+        => in schema: {(2) default.t.cnt (INT8), default.t.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 6 => 7 (type=RANGE_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000006
+
+SORT(8)
+  => Sort Keys: default.n.n_nationkey (INT4) (asc)
+   SCAN(21) on eb_0000000000000_0000_000006
+     => out schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+     => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.t.cnt (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.result b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.result
new file mode 100644
index 0000000..f3a26c8
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.result
@@ -0,0 +1,27 @@
+n_nationkey,n_name,n_regionkey,cnt
+-------------------------------
+0,ALGERIA,0,5
+1,ARGENTINA,1,5
+2,BRAZIL,1,5
+3,CANADA,1,5
+4,EGYPT,4,5
+5,ETHIOPIA,0,5
+6,FRANCE,3,5
+7,GERMANY,3,5
+8,INDIA,2,5
+9,INDONESIA,2,5
+10,IRAN,4,5
+11,IRAQ,4,5
+12,JAPAN,2,5
+13,JORDAN,4,5
+14,KENYA,0,5
+15,MOROCCO,0,5
+16,MOZAMBIQUE,0,5
+17,PERU,1,5
+18,CHINA,2,5
+19,ROMANIA,3,5
+20,SAUDI ARABIA,4,5
+21,VIETNAM,2,5
+22,RUSSIA,3,5
+23,UNITED KINGDOM,3,5
+24,UNITED STATES,1,5

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Hash.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Hash.plan
index 668ddab..4ded90a 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Hash.plan
@@ -27,32 +27,31 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
- 2: type=Broadcast, tables=default.supplier
+ 1: type=Broadcast, tables=default.supplier
 
-SORT(11)
+SORT(15)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
    JOIN(9)(LEFT_OUTER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
@@ -78,21 +77,21 @@ SORT(11)
            => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(5)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
-   SCAN(12) on eb_0000000000000_0000_000003
+   SCAN(16) on eb_0000000000000_0000_000005
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Sort.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Sort.plan
index 668ddab..4ded90a 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen.Sort.plan
@@ -27,32 +27,31 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
- 2: type=Broadcast, tables=default.supplier
+ 1: type=Broadcast, tables=default.supplier
 
-SORT(11)
+SORT(15)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
    JOIN(9)(LEFT_OUTER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
@@ -78,21 +77,21 @@ SORT(11)
            => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(5)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
-   SCAN(12) on eb_0000000000000_0000_000003
+   SCAN(16) on eb_0000000000000_0000_000005
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================


[10/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Hash.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Hash.plan
index 483457a..a719990 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Hash.plan
@@ -36,86 +36,57 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
-5: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.supplier
+ 1: type=Broadcast, tables=default.region
 
-TABLE_SUBQUERY(5) as default.t
-  => Targets: CASE WHEN default.t.s_name (TEXT) IS NULL THEN N/O ELSE default.t.s_name (TEXT) END as s1, default.t.n_regionkey (INT4)
-  => out schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
-  => in  schema: {(11) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.s_acctbal (FLOAT8), default.t.s_address (TEXT), default.t.s_comment (TEXT), default.t.s_name (TEXT), default.t.s_nationkey (INT4), default.t.s_phone (TEXT), default.t.s_suppkey (INT4)}
-   PROJECTION(4)
-     => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT), default.supplier.s_suppkey (INT4), default.supplier.s_name (TEXT), default.supplier.s_address (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_comment (TEXT)
-     => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-     => in  schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-      JOIN(10)(LEFT_OUTER)
-        => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
-        => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-        => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-        => in schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-         SCAN(2) on default.supplier
-           => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-           => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-           => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-         SCAN(1) on default.nation
-           => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-           => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-SCAN(0) on default.region
-  => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
-  => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-  => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_regionkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
-
-SORT(15)
+SORT(17)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
    JOIN(11)(INNER)
      => Join Cond: default.t.n_regionkey (INT4) = default.region.r_regionkey (INT4)
      => target list: default.region.r_name (TEXT), s1 (TEXT)
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(4) default.region.r_name (TEXT), default.region.r_regionkey (INT4), default.t.n_regionkey (INT4), s1 (TEXT)}
-      SCAN(14) on eb_0000000000000_0000_000004
+      SCAN(0) on default.region
+        => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
         => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-        => in schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-      SCAN(13) on eb_0000000000000_0000_000003
+        => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+      TABLE_SUBQUERY(5) as default.t
+        => Targets: CASE WHEN default.t.s_name (TEXT) IS NULL THEN N/O ELSE default.t.s_name (TEXT) END as s1, default.t.n_regionkey (INT4)
         => out schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
-        => in schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
+        => in  schema: {(11) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.s_acctbal (FLOAT8), default.t.s_address (TEXT), default.t.s_comment (TEXT), default.t.s_name (TEXT), default.t.s_nationkey (INT4), default.t.s_phone (TEXT), default.t.s_suppkey (INT4)}
+         PROJECTION(4)
+           => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT), default.supplier.s_suppkey (INT4), default.supplier.s_name (TEXT), default.supplier.s_address (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_comment (TEXT)
+           => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+           => in  schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+            JOIN(10)(LEFT_OUTER)
+              => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+              => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+              => in schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+               SCAN(2) on default.supplier
+                 => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+                 => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+                 => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+               SCAN(1) on default.nation
+                 => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+                 => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+                 => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]
@@ -129,7 +100,7 @@ Block Id: eb_0000000000000_0000_000006 [ROOT]
 
 SORT(7)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
-   SCAN(16) on eb_0000000000000_0000_000005
+   SCAN(18) on eb_0000000000000_0000_000005
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Sort.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Sort.plan
index 483457a..a719990 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testComplexJoinsWithCaseWhen2.Sort.plan
@@ -36,86 +36,57 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
-5: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.supplier
+ 1: type=Broadcast, tables=default.region
 
-TABLE_SUBQUERY(5) as default.t
-  => Targets: CASE WHEN default.t.s_name (TEXT) IS NULL THEN N/O ELSE default.t.s_name (TEXT) END as s1, default.t.n_regionkey (INT4)
-  => out schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
-  => in  schema: {(11) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.s_acctbal (FLOAT8), default.t.s_address (TEXT), default.t.s_comment (TEXT), default.t.s_name (TEXT), default.t.s_nationkey (INT4), default.t.s_phone (TEXT), default.t.s_suppkey (INT4)}
-   PROJECTION(4)
-     => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT), default.supplier.s_suppkey (INT4), default.supplier.s_name (TEXT), default.supplier.s_address (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_comment (TEXT)
-     => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-     => in  schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-      JOIN(10)(LEFT_OUTER)
-        => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
-        => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-        => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-        => in schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-         SCAN(2) on default.supplier
-           => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-           => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-           => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-         SCAN(1) on default.nation
-           => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-           => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-SCAN(0) on default.region
-  => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
-  => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-  => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_regionkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), s1 (TEXT), num=32)
-
-SORT(15)
+SORT(17)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
    JOIN(11)(INNER)
      => Join Cond: default.t.n_regionkey (INT4) = default.region.r_regionkey (INT4)
      => target list: default.region.r_name (TEXT), s1 (TEXT)
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(4) default.region.r_name (TEXT), default.region.r_regionkey (INT4), default.t.n_regionkey (INT4), s1 (TEXT)}
-      SCAN(14) on eb_0000000000000_0000_000004
+      SCAN(0) on default.region
+        => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
         => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-        => in schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-      SCAN(13) on eb_0000000000000_0000_000003
+        => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+      TABLE_SUBQUERY(5) as default.t
+        => Targets: CASE WHEN default.t.s_name (TEXT) IS NULL THEN N/O ELSE default.t.s_name (TEXT) END as s1, default.t.n_regionkey (INT4)
         => out schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
-        => in schema: {(2) s1 (TEXT), default.t.n_regionkey (INT4)}
+        => in  schema: {(11) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.s_acctbal (FLOAT8), default.t.s_address (TEXT), default.t.s_comment (TEXT), default.t.s_name (TEXT), default.t.s_nationkey (INT4), default.t.s_phone (TEXT), default.t.s_suppkey (INT4)}
+         PROJECTION(4)
+           => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT), default.supplier.s_suppkey (INT4), default.supplier.s_name (TEXT), default.supplier.s_address (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_comment (TEXT)
+           => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+           => in  schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+            JOIN(10)(LEFT_OUTER)
+              => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+              => out schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+              => in schema: {(11) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+               SCAN(2) on default.supplier
+                 => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+                 => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+                 => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+               SCAN(1) on default.nation
+                 => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+                 => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+                 => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]
@@ -129,7 +100,7 @@ Block Id: eb_0000000000000_0000_000006 [ROOT]
 
 SORT(7)
   => Sort Keys: default.region.r_name (TEXT) (asc),s1 (TEXT) (asc)
-   SCAN(16) on eb_0000000000000_0000_000005
+   SCAN(18) on eb_0000000000000_0000_000005
      => out schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
      => in schema: {(2) default.region.r_name (TEXT), s1 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Hash.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Hash.plan
index 9721e73..1d5762f 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Hash.plan
@@ -26,25 +26,24 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
  0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.a
- 2: type=Broadcast, tables=default.c
+ 1: type=Broadcast, tables=default.c
 
 JOIN(8)(LEFT_OUTER)
   => Join Cond: default.a.l_orderkey (INT4) = default.c.c_custkey (INT4)
@@ -71,5 +70,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(9) default.b.o_clerk (TEXT), default.b.o_comment (TEXT), default.b.o_custkey (INT4), default.b.o_orderdate (TEXT), default.b.o_orderkey (INT4), default.b.o_orderpriority (TEXT), default.b.o_orderstatus (TEXT), default.b.o_shippriority (INT4), default.b.o_totalprice (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Sort.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Sort.plan
index 9721e73..1d5762f 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testInnerAndOuterWithEmpty.1.Sort.plan
@@ -26,25 +26,24 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
  0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.a
- 2: type=Broadcast, tables=default.c
+ 1: type=Broadcast, tables=default.c
 
 JOIN(8)(LEFT_OUTER)
   => Join Cond: default.a.l_orderkey (INT4) = default.c.c_custkey (INT4)
@@ -71,5 +70,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(9) default.b.o_clerk (TEXT), default.b.o_comment (TEXT), default.b.o_custkey (INT4), default.b.o_orderdate (TEXT), default.b.o_orderkey (INT4), default.b.o_orderpriority (TEXT), default.b.o_orderstatus (TEXT), default.b.o_shippriority (INT4), default.b.o_totalprice (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Hash.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Hash.plan
index b2021fc..2c990f8 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Hash.plan
@@ -33,107 +33,51 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-
-SCAN(0) on default.customer as c
-  => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)
-  => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-  => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
-
-TABLE_SUBQUERY(3) as default.n
-  => Targets: default.n.n_nationkey (INT4)
-  => out schema: {(1) default.n.n_nationkey (INT4)}
-  => in  schema: {(1) default.n.n_nationkey (INT4)}
-   PROJECTION(2)
-     => Targets: default.nation.n_nationkey (INT4)
-     => out schema: {(1) default.nation.n_nationkey (INT4)}
-     => in  schema: {(1) default.nation.n_nationkey (INT4)}
-      SCAN(1) on default.nation
-        => target list: default.nation.n_nationkey (INT4)
-        => out schema: {(1) default.nation.n_nationkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-
-JOIN(9)(RIGHT_OUTER)
-  => Join Cond: default.n.n_nationkey (INT4) = default.c.c_custkey (INT4)
-  => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)
-  => out schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
-  => in schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000002
-     => out schema: {(1) default.n.n_nationkey (INT4)}
-     => in schema: {(1) default.n.n_nationkey (INT4)}
-   SCAN(12) on eb_0000000000000_0000_000001
-     => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-     => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
-
-SCAN(5) on default.region as r
-  => target list: default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
-  => out schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-  => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.c
+ 1: type=Broadcast, tables=default.r
 
 JOIN(10)(INNER)
   => Join Cond: default.r.r_regionkey (INT4) = default.c.c_custkey (INT4)
   => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
   => out schema: {(12) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
   => in schema: {(12) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(15) on eb_0000000000000_0000_000004
+   SCAN(5) on default.region as r
+     => target list: default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
      => out schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
      => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(14) on eb_0000000000000_0000_000003
+   JOIN(9)(RIGHT_OUTER)
+     => Join Cond: default.n.n_nationkey (INT4) = default.c.c_custkey (INT4)
+     => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)
      => out schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
      => in schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
+      TABLE_SUBQUERY(3) as default.n
+        => Targets: default.n.n_nationkey (INT4)
+        => out schema: {(1) default.n.n_nationkey (INT4)}
+        => in  schema: {(1) default.n.n_nationkey (INT4)}
+         PROJECTION(2)
+           => Targets: default.nation.n_nationkey (INT4)
+           => out schema: {(1) default.nation.n_nationkey (INT4)}
+           => in  schema: {(1) default.nation.n_nationkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_nationkey (INT4)
+              => out schema: {(1) default.nation.n_nationkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      SCAN(0) on default.customer as c
+        => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)
+        => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
+        => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Sort.plan b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Sort.plan
index b2021fc..2c990f8 100644
--- a/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestMultipleJoinTypes/testJoinWithMultipleJoinTypes.Sort.plan
@@ -33,107 +33,51 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-
-SCAN(0) on default.customer as c
-  => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)
-  => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-  => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
-
-TABLE_SUBQUERY(3) as default.n
-  => Targets: default.n.n_nationkey (INT4)
-  => out schema: {(1) default.n.n_nationkey (INT4)}
-  => in  schema: {(1) default.n.n_nationkey (INT4)}
-   PROJECTION(2)
-     => Targets: default.nation.n_nationkey (INT4)
-     => out schema: {(1) default.nation.n_nationkey (INT4)}
-     => in  schema: {(1) default.nation.n_nationkey (INT4)}
-      SCAN(1) on default.nation
-        => target list: default.nation.n_nationkey (INT4)
-        => out schema: {(1) default.nation.n_nationkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-
-JOIN(9)(RIGHT_OUTER)
-  => Join Cond: default.n.n_nationkey (INT4) = default.c.c_custkey (INT4)
-  => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)
-  => out schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
-  => in schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000002
-     => out schema: {(1) default.n.n_nationkey (INT4)}
-     => in schema: {(1) default.n.n_nationkey (INT4)}
-   SCAN(12) on eb_0000000000000_0000_000001
-     => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-     => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
-
-SCAN(5) on default.region as r
-  => target list: default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
-  => out schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-  => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.c.c_custkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.r.r_regionkey (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.c
+ 1: type=Broadcast, tables=default.r
 
 JOIN(10)(INNER)
   => Join Cond: default.r.r_regionkey (INT4) = default.c.c_custkey (INT4)
   => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
   => out schema: {(12) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
   => in schema: {(12) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4), default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(15) on eb_0000000000000_0000_000004
+   SCAN(5) on default.region as r
+     => target list: default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)
      => out schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
      => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(14) on eb_0000000000000_0000_000003
+   JOIN(9)(RIGHT_OUTER)
+     => Join Cond: default.n.n_nationkey (INT4) = default.c.c_custkey (INT4)
+     => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)
      => out schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
      => in schema: {(9) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT), default.n.n_nationkey (INT4)}
+      TABLE_SUBQUERY(3) as default.n
+        => Targets: default.n.n_nationkey (INT4)
+        => out schema: {(1) default.n.n_nationkey (INT4)}
+        => in  schema: {(1) default.n.n_nationkey (INT4)}
+         PROJECTION(2)
+           => Targets: default.nation.n_nationkey (INT4)
+           => out schema: {(1) default.nation.n_nationkey (INT4)}
+           => in  schema: {(1) default.nation.n_nationkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_nationkey (INT4)
+              => out schema: {(1) default.nation.n_nationkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      SCAN(0) on default.customer as c
+        => target list: default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)
+        => out schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
+        => in schema: {(8) default.c.c_acctbal (FLOAT8), default.c.c_address (TEXT), default.c.c_comment (TEXT), default.c.c_custkey (INT4), default.c.c_mktsegment (TEXT), default.c.c_name (TEXT), default.c.c_nationkey (INT4), default.c.c_phone (TEXT)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Hash.plan
index 9b709e7..9fbfec5 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Hash.plan
@@ -23,40 +23,66 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000001 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
 
-[Enforcers]
- 0: type=Broadcast, tables=default.orders
- 1: type=Broadcast, tables=default.customer
+SCAN(0) on default.orders
+  => target list: default.orders.o_orderkey (INT4)
+  => out schema: {(1) default.orders.o_orderkey (INT4)}
+  => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+SCAN(1) on default.customer
+  => target list: default.customer.c_custkey (INT4)
+  => out schema: {(1) default.customer.c_custkey (INT4)}
+  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
 
-SORT(8)
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4), num=32)
+
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(FULL_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
      => target list: default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(1) on default.customer
-        => target list: default.customer.c_custkey (INT4)
+      SCAN(9) on eb_0000000000000_0000_000002
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-      SCAN(0) on default.orders
-        => target list: default.orders.o_orderkey (INT4)
+        => in schema: {(1) default.customer.c_custkey (INT4)}
+      SCAN(8) on eb_0000000000000_0000_000001
         => out schema: {(1) default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+        => in schema: {(1) default.orders.o_orderkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]
@@ -70,7 +96,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Sort.plan
index 9b709e7..9fbfec5 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoin1.Sort.plan
@@ -23,40 +23,66 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000001 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
 
-[Enforcers]
- 0: type=Broadcast, tables=default.orders
- 1: type=Broadcast, tables=default.customer
+SCAN(0) on default.orders
+  => target list: default.orders.o_orderkey (INT4)
+  => out schema: {(1) default.orders.o_orderkey (INT4)}
+  => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+SCAN(1) on default.customer
+  => target list: default.customer.c_custkey (INT4)
+  => out schema: {(1) default.customer.c_custkey (INT4)}
+  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
 
-SORT(8)
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4), num=32)
+
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(FULL_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
      => target list: default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(1) on default.customer
-        => target list: default.customer.c_custkey (INT4)
+      SCAN(9) on eb_0000000000000_0000_000002
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-      SCAN(0) on default.orders
-        => target list: default.orders.o_orderkey (INT4)
+        => in schema: {(1) default.customer.c_custkey (INT4)}
+      SCAN(8) on eb_0000000000000_0000_000001
         => out schema: {(1) default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+        => in schema: {(1) default.orders.o_orderkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]
@@ -70,7 +96,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash.plan
new file mode 100644
index 0000000..fa727c0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash.plan
@@ -0,0 +1,153 @@
+explain
+-------------------------------
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(3) on default.jointable14 as t4
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      JOIN(8)(FULL_OUTER)
+        => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+        => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+         SCAN(1) on default.jointable13 as t3
+           => target list: default.t3.id (INT4)
+           => out schema: {(1) default.t3.id (INT4)}
+           => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+         SCAN(0) on default.jointable11 as t1
+           => target list: default.t1.id (INT4), default.t1.name (TEXT)
+           => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+           => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+         |-eb_0000000000000_0000_000003
+            |-eb_0000000000000_0000_000002
+            |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(1) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(FULL_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(3) on default.jointable14 as t4
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SORT(15)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000004
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(1) default.t4.id (INT4)}
+      SCAN(13) on eb_0000000000000_0000_000003
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000005
+
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   SCAN(16) on eb_0000000000000_0000_000005
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..fa727c0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
@@ -0,0 +1,153 @@
+explain
+-------------------------------
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(3) on default.jointable14 as t4
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      JOIN(8)(FULL_OUTER)
+        => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+        => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+         SCAN(1) on default.jointable13 as t3
+           => target list: default.t3.id (INT4)
+           => out schema: {(1) default.t3.id (INT4)}
+           => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+         SCAN(0) on default.jointable11 as t1
+           => target list: default.t1.id (INT4), default.t1.name (TEXT)
+           => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+           => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+         |-eb_0000000000000_0000_000003
+            |-eb_0000000000000_0000_000002
+            |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(1) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(FULL_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(3) on default.jointable14 as t4
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SORT(15)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000004
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(1) default.t4.id (INT4)}
+      SCAN(13) on eb_0000000000000_0000_000003
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000005
+
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   SCAN(16) on eb_0000000000000_0000_000005
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
+=======================================================


[14/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort.plan
index 3a80bb4..f3b0e9d 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=joins.supplier_
- 1: type=Broadcast, tables=default.nation
- 2: type=Broadcast, tables=default.region
+ 1: type=Broadcast, tables=default.region
+ 2: type=Broadcast, tables=joins.part_
+ 3: type=Broadcast, tables=default.partsupp
 
-JOIN(14)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-   SCAN(4) on default.region
-     => target list: default.region.r_regionkey (INT4)
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-   JOIN(13)(INNER)
-     => Join Cond: joins.supplier_.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
-     => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-     => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-      SCAN(3) on default.nation
-        => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-        => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-      SCAN(1) on joins.supplier_
-        => target list: joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-        => out schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-        => in schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=joins.part_
- 1: type=Broadcast, tables=default.partsupp
-
-JOIN(15)(INNER)
-  => Join Cond: joins.part_.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
-  => out schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-  => in schema: {(4) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-   SCAN(2) on default.partsupp
-     => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
-     => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
-     => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
-   SCAN(0) on joins.part_
-     => target list: joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
-     => out schema: {(2) joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-     => in schema: {(9) joins.part_.p_brand (TEXT), joins.part_.p_comment (TEXT), joins.part_.p_container (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_name (TEXT), joins.part_.p_partkey (INT4), joins.part_.p_retailprice (FLOAT8), joins.part_.p_size (INT4), joins.part_.p_type (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: joins.supplier_.s_acctbal (FLOAT8) (asc),joins.supplier_.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),joins.part_.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: joins.supplier_.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
      => target list: default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)
      => out schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
      => in schema: {(10) default.nation.n_name (TEXT), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: joins.part_.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+        => target list: default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
         => out schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-        => in schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
+         SCAN(2) on default.partsupp
+           => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
+           => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
+           => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+         SCAN(0) on joins.part_
+           => target list: joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
+           => out schema: {(2) joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
+           => in schema: {(9) joins.part_.p_brand (TEXT), joins.part_.p_comment (TEXT), joins.part_.p_container (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_name (TEXT), joins.part_.p_partkey (INT4), joins.part_.p_retailprice (FLOAT8), joins.part_.p_size (INT4), joins.part_.p_type (TEXT)}
+      JOIN(14)(INNER)
+        => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+        => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
         => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-        => in schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+        => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+         SCAN(4) on default.region
+           => target list: default.region.r_regionkey (INT4)
+           => out schema: {(1) default.region.r_regionkey (INT4)}
+           => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+         JOIN(13)(INNER)
+           => Join Cond: joins.supplier_.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+           => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+           => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+           => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+            SCAN(1) on joins.supplier_
+              => target list: joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+              => out schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+              => in schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: joins.supplier_.s_acctbal (FLOAT8) (asc),joins.supplier_.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),joins.part_.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
      => in schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan
index a661de6..ead39f7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan
@@ -45,124 +45,91 @@ SORT(10)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.s
- 1: type=Broadcast, tables=default.ps
- 2: type=Broadcast, tables=default.p
+ 0: type=Broadcast, tables=default.ps
+ 1: type=Broadcast, tables=default.p
+ 2: type=Broadcast, tables=default.s
+ 3: type=Broadcast, tables=default.r
 
-JOIN(14)(INNER)
-  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
-  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-   SCAN(7) on default.part as p
-     => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)
-     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-     => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-     => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-     => in schema: {(9) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-      SCAN(5) on default.partsupp as ps
-        => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)
-        => out schema: {(2) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)}
-        => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-      SCAN(3) on default.supplier as s
-        => target list: default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)
-        => out schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-        => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-JOIN(15)(INNER)
-  => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-  => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-   SCAN(1) on default.region as r
-     => target list: default.r.r_regionkey (INT4)
-     => out schema: {(1) default.r.r_regionkey (INT4)}
-     => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(0) on default.nation as n
-     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-     => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.s.s_acctbal (FLOAT8) (asc),default.s.s_name (TEXT) (asc),default.n.n_name (TEXT) (asc),default.p.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.n.n_regionkey (INT4) = default.ps.ps_suppkey (INT4) AND default.s.s_nationkey (INT4) = default.n.n_nationkey (INT4)
      => target list: default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)
      => out schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
      => in schema: {(12) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
         => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+         SCAN(1) on default.region as r
+           => target list: default.r.r_regionkey (INT4)
+           => out schema: {(1) default.r.r_regionkey (INT4)}
+           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+         SCAN(0) on default.nation as n
+           => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+           => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
+        => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
         => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-        => in schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+        => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+         SCAN(7) on default.part as p
+           => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)
+           => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+           => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+           => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
+           => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+           => in schema: {(9) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+            SCAN(5) on default.partsupp as ps
+              => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)
+              => out schema: {(2) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)}
+              => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+            SCAN(3) on default.supplier as s
+              => target list: default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)
+              => out schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+              => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(10)
   => Sort Keys: default.s.s_acctbal (FLOAT8) (asc),default.s.s_name (TEXT) (asc),default.n.n_name (TEXT) (asc),default.p.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
      => in schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan
index a661de6..ead39f7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan
@@ -45,124 +45,91 @@ SORT(10)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.s
- 1: type=Broadcast, tables=default.ps
- 2: type=Broadcast, tables=default.p
+ 0: type=Broadcast, tables=default.ps
+ 1: type=Broadcast, tables=default.p
+ 2: type=Broadcast, tables=default.s
+ 3: type=Broadcast, tables=default.r
 
-JOIN(14)(INNER)
-  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
-  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-   SCAN(7) on default.part as p
-     => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)
-     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-     => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-     => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-     => in schema: {(9) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-      SCAN(5) on default.partsupp as ps
-        => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)
-        => out schema: {(2) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)}
-        => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-      SCAN(3) on default.supplier as s
-        => target list: default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)
-        => out schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-        => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-JOIN(15)(INNER)
-  => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-  => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-  => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-  => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-   SCAN(1) on default.region as r
-     => target list: default.r.r_regionkey (INT4)
-     => out schema: {(1) default.r.r_regionkey (INT4)}
-     => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-   SCAN(0) on default.nation as n
-     => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-     => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.s.s_acctbal (FLOAT8) (asc),default.s.s_name (TEXT) (asc),default.n.n_name (TEXT) (asc),default.p.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.n.n_regionkey (INT4) = default.ps.ps_suppkey (INT4) AND default.s.s_nationkey (INT4) = default.n.n_nationkey (INT4)
      => target list: default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)
      => out schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
      => in schema: {(12) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+        => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
         => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+         SCAN(1) on default.region as r
+           => target list: default.r.r_regionkey (INT4)
+           => out schema: {(1) default.r.r_regionkey (INT4)}
+           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+         SCAN(0) on default.nation as n
+           => target list: default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+           => out schema: {(3) default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
+        => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
         => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-        => in schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+        => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+         SCAN(7) on default.part as p
+           => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)
+           => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+           => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+           => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
+           => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+           => in schema: {(9) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+            SCAN(5) on default.partsupp as ps
+              => target list: default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)
+              => out schema: {(2) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4)}
+              => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+            SCAN(3) on default.supplier as s
+              => target list: default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)
+              => out schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+              => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.n.n_name (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(10)
   => Sort Keys: default.s.s_acctbal (FLOAT8) (asc),default.s.s_name (TEXT) (asc),default.n.n_name (TEXT) (asc),default.p.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
      => in schema: {(8) default.n.n_name (TEXT), default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan
index b08ab10..c86757c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan
@@ -45,10 +45,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.n2
- 1: type=Broadcast, tables=default.n1
+ 0: type=Broadcast, tables=default.n1
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    SELECTION(2)
      => Search Cond: default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)
@@ -82,7 +81,7 @@ PROJECTION(4)
   => in  schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
    SORT(3)
      => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
         => in schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan
index b08ab10..c86757c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan
@@ -45,10 +45,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.n2
- 1: type=Broadcast, tables=default.n1
+ 0: type=Broadcast, tables=default.n1
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    SELECTION(2)
      => Search Cond: default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)
@@ -82,7 +81,7 @@ PROJECTION(4)
   => in  schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
    SORT(3)
      => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
         => in schema: {(4) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan
index bf9323d..1ef6092 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan
@@ -39,10 +39,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n2.n_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.n2
- 1: type=Broadcast, tables=default.n1
+ 0: type=Broadcast, tables=default.n1
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n2.n_name (TEXT) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_comment (TEXT) = default.n2.n_comment (TEXT) AND default.n1.n_name (TEXT) = default.n2.n_name (TEXT) AND default.n1.n_nationkey (INT4) = default.n2.n_nationkey (INT4) AND default.n1.n_regionkey (INT4) = default.n2.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n2.n_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)}
      => in schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan
index bf9323d..1ef6092 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan
@@ -39,10 +39,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n2.n_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.n2
- 1: type=Broadcast, tables=default.n1
+ 0: type=Broadcast, tables=default.n1
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n2.n_name (TEXT) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_comment (TEXT) = default.n2.n_comment (TEXT) AND default.n1.n_name (TEXT) = default.n2.n_name (TEXT) AND default.n1.n_nationkey (INT4) = default.n2.n_nationkey (INT4) AND default.n1.n_regionkey (INT4) = default.n2.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n2.n_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)}
      => in schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash.plan
index 38d9b38..b19c33f 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.supplier
+ 2: type=Broadcast, tables=default.partsupp
+ 3: type=Broadcast, tables=default.region
 
-JOIN(14)(INNER)
-  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-   SCAN(0) on default.part
-     => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)
-     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
-     => target list: default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-     => in schema: {(9) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-      SCAN(2) on default.partsupp
-        => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
-        => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
-        => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
-      SCAN(1) on default.supplier
-        => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-        => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-        => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
-
-JOIN(15)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
-  => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-  => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
-   SCAN(4) on default.region
-     => target list: default.region.r_regionkey (INT4)
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
      => target list: default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)
      => out schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
      => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+        => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
         => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-        => in schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
+         SCAN(4) on default.region
+           => target list: default.region.r_regionkey (INT4)
+           => out schema: {(1) default.region.r_regionkey (INT4)}
+           => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+         SCAN(3) on default.nation
+           => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+           => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+        => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
         => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-        => in schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+        => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+         SCAN(0) on default.part
+           => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)
+           => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
+           => target list: default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+           => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+           => in schema: {(9) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+            SCAN(2) on default.partsupp
+              => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
+              => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
+              => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+            SCAN(1) on default.supplier
+              => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+              => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+              => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
      => in schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================


[12/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort.plan
index 7cde4c5..839afaf 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort.plan
@@ -73,22 +73,14 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012)
 |-eb_0000000000000_0000_000012
    |-eb_0000000000000_0000_000011
       |-eb_0000000000000_0000_000010
-         |-eb_0000000000000_0000_000009
-            |-eb_0000000000000_0000_000008
-            |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000004
-            |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
 1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000007
-3: eb_0000000000000_0000_000008
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000009
-6: eb_0000000000000_0000_000010
-7: eb_0000000000000_0000_000011
-8: eb_0000000000000_0000_000012
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
+4: eb_0000000000000_0000_000012
 -------------------------------------------------------------------------------
 
 =======================================================
@@ -96,13 +88,12 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
+[q_0000000000000_0000] 3 => 10 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.part
+ 0: type=Broadcast, tables=default.part
 
-GROUP_BY(25)(l_orderkey)
+GROUP_BY(27)(l_orderkey)
   => exprs: (avg(default.e.l_quantity (FLOAT8)))
   => target list: default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)
   => out schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
@@ -130,113 +121,21 @@ GROUP_BY(25)(l_orderkey)
               => in schema: {(16) default.a.l_comment (TEXT), default.a.l_commitdate (TEXT), default.a.l_discount (FLOAT8), default.a.l_extendedprice (FLOAT8), default.a.l_linenumber (INT4), default.a.l_linestatus (TEXT), default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8), default.a.l_receiptdate (TEXT), default.a.l_returnflag (TEXT), default.a.l_shipdate (TEXT), default.a.l_shipinstruct (TEXT), default.a.l_shipmode (TEXT), default.a.l_suppkey (INT4), default.a.l_tax (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 10 (type=HASH_SHUFFLE, key=default.f.l_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(14) as default.f
-  => Targets: default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)
-  => out schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-  => in  schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-   PROJECTION(13)
-     => Targets: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
-     => out schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-     => in  schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-      GROUP_BY(12)(l_orderkey)
-        => exprs: (avg(?avg_11 (PROTOBUF)))
-        => target list: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
-        => out schema:{(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-        => in schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-         SCAN(26) on eb_0000000000000_0000_000003
-           => out schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-           => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 9 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.d
- 1: type=Broadcast, tables=default.part
-
-TABLE_SUBQUERY(4) as default.b
-  => Targets: default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)
-  => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-  => in  schema: {(2) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8)}
-   PROJECTION(10)
-     => Targets: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
-     => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-     => in  schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-      JOIN(20)(INNER)
-        => Join Cond: default.d.l_partkey (INT4) = default.part.p_partkey (INT4)
-        => target list: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
-        => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-        => in schema: {(4) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.part.p_partkey (INT4)}
-         SCAN(8) on default.part
-           => target list: default.part.p_partkey (INT4)
-           => out schema: {(1) default.part.p_partkey (INT4)}
-           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-         SCAN(7) on default.lineitem as d
-           => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
-           => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
-           => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000008 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-SCAN(5) on default.orders as c
-  => filter: default.c.o_orderkey (INT4) > 0
-  => target list: default.c.o_orderkey (INT4)
-  => out schema: {(1) default.c.o_orderkey (INT4)}
-  => in schema: {(9) default.c.o_clerk (TEXT), default.c.o_comment (TEXT), default.c.o_custkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4), default.c.o_orderpriority (TEXT), default.c.o_orderstatus (TEXT), default.c.o_shippriority (INT4), default.c.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000009 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 7 => 9 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32)
-[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-JOIN(22)(INNER)
-  => Join Cond: default.c.o_orderkey (INT4) = default.b.l_orderkey (INT4)
-  => target list: default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)
-  => out schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-  => in schema: {(3) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-   SCAN(28) on eb_0000000000000_0000_000008
-     => out schema: {(1) default.c.o_orderkey (INT4)}
-     => in schema: {(1) default.c.o_orderkey (INT4)}
-   SCAN(27) on eb_0000000000000_0000_000007
-     => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-     => in schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000010 [INTERMEDIATE]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 4 => 10 (type=HASH_SHUFFLE, key=default.f.l_orderkey (INT4), num=32)
-[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 3 => 10 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
 
 [Outgoing]
 [q_0000000000000_0000] 10 => 11 (type=HASH_SHUFFLE, key=, num=1)
 
-GROUP_BY(31)()
+[Enforcers]
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.c
+ 2: type=Broadcast, tables=default.d
+
+GROUP_BY(35)()
   => exprs: (sum(default.b.l_quantity (FLOAT8)))
   => target list: ?sum_12 (FLOAT8)
   => out schema:{(1) ?sum_12 (FLOAT8)}
@@ -248,12 +147,53 @@ GROUP_BY(31)()
         => target list: default.b.l_quantity (FLOAT8), default.f.avg_quantity (FLOAT8)
         => out schema: {(2) default.b.l_quantity (FLOAT8), default.f.avg_quantity (FLOAT8)}
         => in schema: {(4) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4), default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-         SCAN(30) on eb_0000000000000_0000_000009
+         JOIN(22)(INNER)
+           => Join Cond: default.c.o_orderkey (INT4) = default.b.l_orderkey (INT4)
+           => target list: default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)
            => out schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-           => in schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-         SCAN(29) on eb_0000000000000_0000_000004
+           => in schema: {(3) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
+            SCAN(5) on default.orders as c
+              => filter: default.c.o_orderkey (INT4) > 0
+              => target list: default.c.o_orderkey (INT4)
+              => out schema: {(1) default.c.o_orderkey (INT4)}
+              => in schema: {(9) default.c.o_clerk (TEXT), default.c.o_comment (TEXT), default.c.o_custkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4), default.c.o_orderpriority (TEXT), default.c.o_orderstatus (TEXT), default.c.o_shippriority (INT4), default.c.o_totalprice (FLOAT8)}
+            TABLE_SUBQUERY(4) as default.b
+              => Targets: default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)
+              => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
+              => in  schema: {(2) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8)}
+               PROJECTION(10)
+                 => Targets: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
+                 => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                 => in  schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                  JOIN(20)(INNER)
+                    => Join Cond: default.d.l_partkey (INT4) = default.part.p_partkey (INT4)
+                    => target list: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
+                    => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                    => in schema: {(4) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.part.p_partkey (INT4)}
+                     SCAN(8) on default.part
+                       => target list: default.part.p_partkey (INT4)
+                       => out schema: {(1) default.part.p_partkey (INT4)}
+                       => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+                     SCAN(7) on default.lineitem as d
+                       => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
+                       => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
+                       => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
+         TABLE_SUBQUERY(14) as default.f
+           => Targets: default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)
            => out schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-           => in schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
+           => in  schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
+            PROJECTION(13)
+              => Targets: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
+              => out schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+              => in  schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+               GROUP_BY(12)(l_orderkey)
+                 => exprs: (avg(?avg_11 (PROTOBUF)))
+                 => target list: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
+                 => out schema:{(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+                 => in schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
+                  SCAN(28) on eb_0000000000000_0000_000003
+                    => out schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
+                    => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000011 [ROOT]
@@ -267,7 +207,7 @@ GROUP_BY(18)()
   => target list: ?sum (FLOAT8)
   => out schema:{(1) ?sum (FLOAT8)}
   => in schema:{(1) ?sum_12 (FLOAT8)}
-   SCAN(32) on eb_0000000000000_0000_000010
+   SCAN(36) on eb_0000000000000_0000_000010
      => out schema: {(1) ?sum_12 (FLOAT8)}
      => in schema: {(1) ?sum_12 (FLOAT8)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Hash.plan
index 2325ed7..4e72e08 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Hash.plan
@@ -27,61 +27,24 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(3) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   PROJECTION(2)
-     => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in  schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-      SCAN(1) on default.nation
-        => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-        => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
-  => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+
 SORT(12)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(8)(INNER)
@@ -89,12 +52,22 @@ SORT(12)
      => target list: default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
      => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-      SCAN(11) on eb_0000000000000_0000_000002
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
         => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-        => in schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-      SCAN(10) on eb_0000000000000_0000_000001
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      TABLE_SUBQUERY(3) as default.n2
+        => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
         => out schema: {(1) name2 (TEXT)}
-        => in schema: {(1) name2 (TEXT)}
+        => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+         PROJECTION(2)
+           => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT)
+           => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+           => in  schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Sort.plan
index 2325ed7..4e72e08 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition5.Sort.plan
@@ -27,61 +27,24 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(3) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   PROJECTION(2)
-     => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in  schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-      SCAN(1) on default.nation
-        => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-        => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
-  => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+
 SORT(12)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(8)(INNER)
@@ -89,12 +52,22 @@ SORT(12)
      => target list: default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
      => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-      SCAN(11) on eb_0000000000000_0000_000002
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
         => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-        => in schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-      SCAN(10) on eb_0000000000000_0000_000001
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      TABLE_SUBQUERY(3) as default.n2
+        => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
         => out schema: {(1) name2 (TEXT)}
-        => in schema: {(1) name2 (TEXT)}
+        => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+         PROJECTION(2)
+           => Targets: default.nation.n_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.nation.n_comment (TEXT)
+           => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+           => in  schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Hash.plan
index 15a4a6b..2402db7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Hash.plan
@@ -40,89 +40,53 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000004
-4: eb_0000000000000_0000_000003
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000005
+3: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(13) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(1) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(14) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
-  => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 5 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+ 1: type=Broadcast, tables=default.n1
+
 SORT(18)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(11)(INNER)
      => Join Cond: name1 (TEXT) = name2 (TEXT)
      => target list: default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-     => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-      SCAN(17) on eb_0000000000000_0000_000004
+     => in schema: {(3) default.n2.name2 (TEXT), default.n1.n_nationkey (INT4), name1 (TEXT)}
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
         => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-        => in schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-      SCAN(15) on eb_0000000000000_0000_000001
-        => out schema: {(1) default.n2.name2 (TEXT)}
-        => in schema: {(1) default.n2.name2 (TEXT)}
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      UNION(21)
+         TABLE_SUBQUERY(14) as default.n2
+           => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
+           => out schema: {(1) name2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+         TABLE_SUBQUERY(13) as default.n2
+           => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
+           => out schema: {(1) name2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Sort.plan
index 15a4a6b..2402db7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition6.Sort.plan
@@ -40,89 +40,53 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000004
-4: eb_0000000000000_0000_000003
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000005
+3: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(13) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(1) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32)
-
-TABLE_SUBQUERY(14) as default.n2
-  => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
-  => out schema: {(1) name2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
-  => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=name2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=name1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 5 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+ 1: type=Broadcast, tables=default.n1
+
 SORT(18)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(11)(INNER)
      => Join Cond: name1 (TEXT) = name2 (TEXT)
      => target list: default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-     => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
-      SCAN(17) on eb_0000000000000_0000_000004
+     => in schema: {(3) default.n2.name2 (TEXT), default.n1.n_nationkey (INT4), name1 (TEXT)}
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as name1
         => out schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-        => in schema: {(2) default.n1.n_nationkey (INT4), name1 (TEXT)}
-      SCAN(15) on eb_0000000000000_0000_000001
-        => out schema: {(1) default.n2.name2 (TEXT)}
-        => in schema: {(1) default.n2.name2 (TEXT)}
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      UNION(21)
+         TABLE_SUBQUERY(14) as default.n2
+           => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
+           => out schema: {(1) name2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+         TABLE_SUBQUERY(13) as default.n2
+           => Targets: substr(default.n2.n_name (TEXT),1,4) as name2
+           => out schema: {(1) name2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Hash.plan
index cd716a4..8e6d32b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Hash.plan
@@ -40,89 +40,53 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000004
-4: eb_0000000000000_0000_000003
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000005
+3: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32)
-
-TABLE_SUBQUERY(13) as default.n2
-  => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
-  => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(1) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32)
-
-TABLE_SUBQUERY(14) as default.n2
-  => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
-  => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=?substr_1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as ?substr_1
-  => out schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=?substr_1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 5 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+ 1: type=Broadcast, tables=default.n1
+
 SORT(18)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc),default.n2.n_name (TEXT) (asc)
    JOIN(11)(INNER)
      => Join Cond: ?substr_1 (TEXT) = ?substr_2 (TEXT)
      => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
-     => in schema: {(5) ?substr_1 (TEXT), ?substr_2 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
-      SCAN(17) on eb_0000000000000_0000_000004
+     => in schema: {(5) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT), ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as ?substr_1
         => out schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-        => in schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-      SCAN(15) on eb_0000000000000_0000_000001
-        => out schema: {(2) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT)}
-        => in schema: {(2) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT)}
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      UNION(21)
+         TABLE_SUBQUERY(14) as default.n2
+           => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
+           => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+         TABLE_SUBQUERY(13) as default.n2
+           => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
+           => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Sort.plan
index cd716a4..8e6d32b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testComplexJoinCondition7.Sort.plan
@@ -40,89 +40,53 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
       |-eb_0000000000000_0000_000003
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000002
-         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000004
-4: eb_0000000000000_0000_000003
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000005
+3: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32)
-
-TABLE_SUBQUERY(13) as default.n2
-  => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
-  => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(1) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32)
-
-TABLE_SUBQUERY(14) as default.n2
-  => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
-  => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
-  => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=?substr_1 (TEXT), num=32)
-
-SCAN(0) on default.nation as n1
-  => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as ?substr_1
-  => out schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-  => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=?substr_2 (TEXT), num=32), union delegated scan: eb_0000000000000_0000_000001
-[q_0000000000000_0000] 4 => 3 (type=HASH_SHUFFLE, key=?substr_1 (TEXT), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 3 => 5 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.nation
+ 1: type=Broadcast, tables=default.n1
+
 SORT(18)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc),default.n2.n_name (TEXT) (asc)
    JOIN(11)(INNER)
      => Join Cond: ?substr_1 (TEXT) = ?substr_2 (TEXT)
      => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
-     => in schema: {(5) ?substr_1 (TEXT), ?substr_2 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
-      SCAN(17) on eb_0000000000000_0000_000004
+     => in schema: {(5) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT), ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
+      SCAN(0) on default.nation as n1
+        => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), substr(default.n1.n_name (TEXT),1,4) as ?substr_1
         => out schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-        => in schema: {(3) ?substr_1 (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4)}
-      SCAN(15) on eb_0000000000000_0000_000001
-        => out schema: {(2) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT)}
-        => in schema: {(2) default.n2.n_name (TEXT), default.n2.?substr_2 (TEXT)}
+        => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)}
+      UNION(21)
+         TABLE_SUBQUERY(14) as default.n2
+           => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
+           => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+         TABLE_SUBQUERY(13) as default.n2
+           => Targets: default.n2.n_name (TEXT), substr(default.n2.n_name (TEXT),1,4) as ?substr_2
+           => out schema: {(2) default.n2.n_name (TEXT), ?substr_2 (TEXT)}
+           => in  schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)}
+            SCAN(1) on default.nation
+              => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Hash.plan
index 9f790f3..f19b5cd 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Hash.plan
@@ -34,82 +34,52 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-      JOIN(10)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4), name (TEXT)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) = MOROCCO
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT) as name, default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4)
-  => out schema: {(1) default.s.s_nationkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.r
+ 1: type=Broadcast, tables=default.s
 
 JOIN(11)(INNER)
   => Join Cond: default.s.s_nationkey (INT4) = default.t.n_nationkey (INT4)
   => target list: default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)
   => out schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
   => in schema: {(5) default.s.s_nationkey (INT4), default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
-   SCAN(14) on eb_0000000000000_0000_000004
+   SCAN(5) on default.supplier as s
+     => target list: default.s.s_nationkey (INT4)
      => out schema: {(1) default.s.s_nationkey (INT4)}
-     => in schema: {(1) default.s.s_nationkey (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000003
+     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+   TABLE_SUBQUERY(4) as default.t
+     => Targets: default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
      => out schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-     => in schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+     => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
+      PROJECTION(3)
+        => Targets: default.n.n_nationkey (INT4), name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+        => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+         JOIN(10)(INNER)
+           => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+           => target list: default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+           => in schema: {(5) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4), name (TEXT)}
+            SCAN(1) on default.region as r
+              => target list: default.r.r_regionkey (INT4)
+              => out schema: {(1) default.r.r_regionkey (INT4)}
+              => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+            SCAN(0) on default.nation as n
+              => filter: default.n.n_name (TEXT) = MOROCCO
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT) as name, default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+              => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Sort.plan
index 9f790f3..f19b5cd 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual2.Sort.plan
@@ -34,82 +34,52 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-      JOIN(10)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4), name (TEXT)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) = MOROCCO
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT) as name, default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4)
-  => out schema: {(1) default.s.s_nationkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.r
+ 1: type=Broadcast, tables=default.s
 
 JOIN(11)(INNER)
   => Join Cond: default.s.s_nationkey (INT4) = default.t.n_nationkey (INT4)
   => target list: default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)
   => out schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
   => in schema: {(5) default.s.s_nationkey (INT4), default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
-   SCAN(14) on eb_0000000000000_0000_000004
+   SCAN(5) on default.supplier as s
+     => target list: default.s.s_nationkey (INT4)
      => out schema: {(1) default.s.s_nationkey (INT4)}
-     => in schema: {(1) default.s.s_nationkey (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000003
+     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+   TABLE_SUBQUERY(4) as default.t
+     => Targets: default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
      => out schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-     => in schema: {(4) default.t.n_nationkey (INT4), default.t.name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+     => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4), default.t.name (TEXT)}
+      PROJECTION(3)
+        => Targets: default.n.n_nationkey (INT4), name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+        => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+         JOIN(10)(INNER)
+           => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+           => target list: default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+           => in schema: {(5) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4), name (TEXT)}
+            SCAN(1) on default.region as r
+              => target list: default.r.r_regionkey (INT4)
+              => out schema: {(1) default.r.r_regionkey (INT4)}
+              => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+            SCAN(0) on default.nation as n
+              => filter: default.n.n_name (TEXT) = MOROCCO
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT) as name, default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), name (TEXT)}
+              => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash.plan
index 88c814d..cfbb849 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash.plan
@@ -43,95 +43,62 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000008
    |-eb_0000000000000_0000_000007
-      |-eb_0000000000000_0000_000006
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.n
- 1: type=Broadcast, tables=default.r
-
-TABLE_SUBQUERY(4) as default.t
-  => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
-  => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-  => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
-     => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-     => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-      JOIN(12)(INNER)
-        => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
-        => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-        => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
-         SCAN(1) on default.region as r
-           => target list: default.r.r_regionkey (INT4)
-           => out schema: {(1) default.r.r_regionkey (INT4)}
-           => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
-         SCAN(0) on default.nation as n
-           => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
-           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
-           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-           => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
-
 [Enforcers]
- 0: type=Broadcast, tables=default.s
+ 0: type=Broadcast, tables=default.r
  1: type=Broadcast, tables=default.ps
-
-JOIN(13)(INNER)
-  => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
-  => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(7) on default.partsupp as ps
-     => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-     => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-     => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-   SCAN(5) on default.supplier as s
-     => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-     => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.t.n_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.s.s_nationkey (INT4), num=32)
+ 2: type=Broadcast, tables=default.s
 
 JOIN(14)(INNER)
   => Join Cond: default.s.s_nationkey (INT4) = default.t.n_nationkey (INT4)
   => target list: default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)
   => out schema: {(6) default.ps.ps_availqty (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
   => in schema: {(7) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4), default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
-   SCAN(17) on eb_0000000000000_0000_000006
+   JOIN(13)(INNER)
+     => Join Cond: default.s.s_suppkey (INT4) = default.ps.ps_suppkey (INT4)
+     => target list: default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
      => out schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-     => in schema: {(3) default.ps.ps_availqty (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-   SCAN(16) on eb_0000000000000_0000_000003
+     => in schema: {(4) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+      SCAN(7) on default.partsupp as ps
+        => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+        => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+        => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+      SCAN(5) on default.supplier as s
+        => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+        => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+        => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+   TABLE_SUBQUERY(4) as default.t
+     => Targets: default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)
      => out schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
-     => in schema: {(4) default.t.n_nationkey (INT4), default.t.n_name (TEXT), default.t.n_regionkey (INT4), default.t.n_comment (TEXT)}
+     => in  schema: {(4) default.t.n_comment (TEXT), default.t.n_name (TEXT), default.t.n_nationkey (INT4), default.t.n_regionkey (INT4)}
+      PROJECTION(3)
+        => Targets: default.n.n_nationkey (INT4), default.n.n_name (TEXT), default.n.n_regionkey (INT4), default.n.n_comment (TEXT)
+        => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+        => in  schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+         JOIN(12)(INNER)
+           => Join Cond: default.n.n_regionkey (INT4) = default.r.r_regionkey (INT4)
+           => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+           => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+           => in schema: {(5) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4), default.r.r_regionkey (INT4)}
+            SCAN(1) on default.region as r
+              => target list: default.r.r_regionkey (INT4)
+              => out schema: {(1) default.r.r_regionkey (INT4)}
+              => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
+            SCAN(0) on default.nation as n
+              => filter: default.n.n_name (TEXT) IN (ARGENTINA, ETHIOPIA, MOROCCO)
+              => target list: default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)
+              => out schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
+              => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000008 [TERMINAL]


[17/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
TAJO-1553: Improve broadcast join planning. (jihoon)

Closes #583


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

Branch: refs/heads/index_support
Commit: 8fd9ae72c70b24c25eaf17d60a832cc7bd7d252c
Parents: 4f3a46c
Author: Jihoon Son <ji...@apache.org>
Authored: Wed May 27 20:16:25 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed May 27 20:16:25 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 .../BroadcastJoinMarkCandidateVisitor.java      |  72 ----
 .../planner/BroadcastJoinPlanVisitor.java       |  60 ----
 .../engine/planner/PhysicalPlannerImpl.java     |   2 +-
 .../engine/planner/global/ExecutionBlock.java   | 117 ++++++-
 .../engine/planner/global/GlobalPlanner.java    | 263 +-------------
 .../tajo/engine/planner/global/MasterPlan.java  |  19 +
 .../global/builder/DistinctGroupbyBuilder.java  |   9 +-
 .../BaseGlobalPlanRewriteRuleProvider.java      |   6 +-
 .../rewriter/GlobalPlanRewriteEngine.java       |   5 +-
 .../global/rewriter/GlobalPlanRewriteRule.java  |   9 +-
 .../rewriter/rules/BroadcastJoinRule.java       | 348 +++++++++++++++++++
 .../rules/GlobalPlanEqualityTester.java         |   3 +-
 .../rewriter/rules/GlobalPlanRewriteUtil.java   | 216 ++++++++++++
 .../planner/physical/CommonHashJoinExec.java    |  13 +
 .../DistinctGroupbyThirdAggregationExec.java    |   2 +-
 .../NonForwardQueryResultSystemScanner.java     |   2 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   2 +-
 .../tajo/querymaster/DefaultTaskScheduler.java  |   2 +-
 .../tajo/querymaster/QueryMasterTask.java       |   2 +-
 .../apache/tajo/querymaster/Repartitioner.java  |  62 +---
 .../java/org/apache/tajo/querymaster/Stage.java |   7 +-
 .../org/apache/tajo/benchmark/TestTPCH.java     |  25 +-
 .../tajo/engine/query/TestGroupByQuery.java     |   6 +-
 .../engine/query/TestInnerJoinWithSubQuery.java |   7 +
 .../tajo/engine/query/TestOuterJoinQuery.java   |   8 +-
 .../apache/tajo/engine/query/TestSortQuery.java |   7 +
 .../tajo/engine/query/TestUnionQuery.java       |  13 +
 .../tajo/master/TestExecutionBlockCursor.java   |   2 +-
 .../apache/tajo/master/TestGlobalPlanner.java   | 347 ------------------
 .../apache/tajo/querymaster/TestKillQuery.java  |   4 +-
 .../testBroadcastTwoPartJoin.sql                |   2 +-
 .../testThetaJoinKeyPairs.sql                   |  20 ++
 .../testSubQuerySortAfterGroupMultiBlocks.sql   |   5 +
 .../resources/queries/TestTPCH/testTPCHQ5.sql   |  24 ++
 .../TestUnionQuery/testComplexUnion1.sql        |  27 ++
 .../TestUnionQuery/testComplexUnion2.sql        |  35 ++
 .../queries/default/complex_union_1.sql         |  29 --
 .../queries/default/complex_union_2.sql         |  35 --
 .../testBroadcastTwoPartJoin.Hash.plan          | 135 +++----
 .../testBroadcastTwoPartJoin.Sort.plan          | 135 +++----
 .../testComplexJoinCondition1.Hash.plan         |   5 +-
 .../testComplexJoinCondition1.Sort.plan         |   5 +-
 .../testComplexJoinCondition2.Hash.plan         |   5 +-
 .../testComplexJoinCondition2.Sort.plan         |   5 +-
 .../testComplexJoinCondition3.Hash.plan         |   5 +-
 .../testComplexJoinCondition3.Sort.plan         |   5 +-
 .../testComplexJoinCondition4.Hash.plan         |   5 +-
 .../testComplexJoinCondition4.Sort.plan         |   5 +-
 .../testCrossJoin.1.Hash.plan                   |   7 +-
 .../testCrossJoin.1.Sort.plan                   |   7 +-
 .../testCrossJoin.2.Hash.plan                   |   1 -
 .../testCrossJoin.2.Sort.plan                   |   1 -
 .../testCrossJoin.3.Hash.plan                   |   3 +-
 .../testCrossJoin.3.Sort.plan                   |   3 +-
 .../testCrossJoin.4.Hash.plan                   |   3 +-
 .../testCrossJoin.4.Sort.plan                   |   3 +-
 .../testCrossJoin.5.Hash.plan                   |   7 +-
 .../testCrossJoin.5.Sort.plan                   |   7 +-
 .../testCrossJoinAndCaseWhen.Hash.plan          |   5 +-
 .../testCrossJoinAndCaseWhen.Sort.plan          |   5 +-
 .../testCrossJoinWithAsterisk1.Hash.plan        |   5 +-
 .../testCrossJoinWithAsterisk1.Sort.plan        |   5 +-
 .../testCrossJoinWithAsterisk2.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk2.Sort.plan        |   7 +-
 .../testCrossJoinWithAsterisk3.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk3.Sort.plan        |   7 +-
 .../testCrossJoinWithAsterisk4.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk4.Sort.plan        |   7 +-
 .../testCrossJoinWithEmptyTable1.Hash.plan      |   5 +-
 .../testCrossJoinWithEmptyTable1.Sort.plan      |   5 +-
 ...sJoinWithThetaJoinConditionInWhere.Hash.plan |   1 -
 ...sJoinWithThetaJoinConditionInWhere.Sort.plan |   1 -
 .../testDifferentTypesJoinCondition.Hash.plan   |   1 -
 .../testDifferentTypesJoinCondition.Sort.plan   |   1 -
 .../testInnerJoinAndCaseWhen.Hash.plan          |   5 +-
 .../testInnerJoinAndCaseWhen.Sort.plan          |   5 +-
 .../testInnerJoinWithEmptyTable.Hash.plan       |   5 +-
 .../testInnerJoinWithEmptyTable.Sort.plan       |   5 +-
 ...rJoinWithThetaJoinConditionInWhere.Hash.plan |   3 +-
 ...rJoinWithThetaJoinConditionInWhere.Sort.plan |   3 +-
 .../testJoinAsterisk.Hash.plan                  |   1 -
 .../testJoinAsterisk.Sort.plan                  |   1 -
 .../testJoinCoReferredEvals1.Hash.plan          |   5 +-
 .../testJoinCoReferredEvals1.Sort.plan          |   5 +-
 ...tJoinCoReferredEvalsWithSameExprs1.Hash.plan |   7 +-
 ...tJoinCoReferredEvalsWithSameExprs1.Sort.plan |   7 +-
 ...tJoinCoReferredEvalsWithSameExprs2.Hash.plan |  11 +-
 ...tJoinCoReferredEvalsWithSameExprs2.Sort.plan |  11 +-
 .../testJoinOnMultipleDatabases.Hash.plan       | 135 +++----
 .../testJoinOnMultipleDatabases.Sort.plan       | 135 +++----
 .../testJoinWithMultipleJoinQual1.Hash.plan     | 137 +++-----
 .../testJoinWithMultipleJoinQual1.Sort.plan     | 137 +++-----
 .../testJoinWithOrPredicates.Hash.plan          |   7 +-
 .../testJoinWithOrPredicates.Sort.plan          |   7 +-
 .../testNaturalJoin.Hash.plan                   |   7 +-
 .../testNaturalJoin.Sort.plan                   |   7 +-
 .../TestInnerJoinQuery/testTPCHQ2Join.Hash.plan | 137 +++-----
 .../TestInnerJoinQuery/testTPCHQ2Join.Sort.plan | 137 +++-----
 .../testWhereClauseJoin1.Hash.plan              |   5 +-
 .../testWhereClauseJoin1.Sort.plan              |   5 +-
 .../testWhereClauseJoin2.Hash.plan              |   5 +-
 .../testWhereClauseJoin2.Sort.plan              |   5 +-
 .../testWhereClauseJoin3.Hash.plan              |   5 +-
 .../testWhereClauseJoin3.Sort.plan              |   5 +-
 .../testWhereClauseJoin4.Hash.plan              |   7 +-
 .../testWhereClauseJoin4.Sort.plan              |   7 +-
 .../testWhereClauseJoin5.Hash.plan              |  33 +-
 .../testWhereClauseJoin5.Sort.plan              |  33 +-
 .../testWhereClauseJoin6.Hash.plan              |  37 +-
 .../testWhereClauseJoin6.Sort.plan              |  37 +-
 .../testBroadcastSubquery.Hash.plan             | 118 ++-----
 .../testBroadcastSubquery.Sort.plan             | 118 ++-----
 .../testBroadcastSubquery2.Hash.plan            | 180 ++++------
 .../testBroadcastSubquery2.Sort.plan            | 180 ++++------
 .../testComplexJoinCondition5.Hash.plan         |  69 ++--
 .../testComplexJoinCondition5.Sort.plan         |  69 ++--
 .../testComplexJoinCondition6.Hash.plan         |  94 ++---
 .../testComplexJoinCondition6.Sort.plan         |  94 ++---
 .../testComplexJoinCondition7.Hash.plan         |  94 ++---
 .../testComplexJoinCondition7.Sort.plan         |  94 ++---
 .../testJoinWithMultipleJoinQual2.Hash.plan     |  88 ++---
 .../testJoinWithMultipleJoinQual2.Sort.plan     |  88 ++---
 .../testJoinWithMultipleJoinQual3.Hash.plan     | 109 ++----
 .../testJoinWithMultipleJoinQual3.Sort.plan     | 109 ++----
 .../testJoinWithMultipleJoinQual4.Hash.plan     | 109 ++----
 .../testJoinWithMultipleJoinQual4.Sort.plan     | 109 ++----
 .../testThetaJoinKeyPairs.Hash.plan             | 142 ++++++++
 .../testThetaJoinKeyPairs.Hash_NoBroadcast.plan | 196 +++++++++++
 .../testThetaJoinKeyPairs.Sort.plan             | 142 ++++++++
 .../testThetaJoinKeyPairs.Sort_NoBroadcast.plan | 196 +++++++++++
 .../testThetaJoinKeyPairs.result                |  27 ++
 .../testComplexJoinsWithCaseWhen.Hash.plan      |  33 +-
 .../testComplexJoinsWithCaseWhen.Sort.plan      |  33 +-
 .../testComplexJoinsWithCaseWhen2.Hash.plan     |  91 ++---
 .../testComplexJoinsWithCaseWhen2.Sort.plan     |  91 ++---
 .../testInnerAndOuterWithEmpty.1.Hash.plan      |  17 +-
 .../testInnerAndOuterWithEmpty.1.Sort.plan      |  17 +-
 .../testJoinWithMultipleJoinTypes.Hash.plan     | 108 ++----
 .../testJoinWithMultipleJoinTypes.Sort.plan     | 108 ++----
 .../testFullOuterJoin1.Hash.plan                |  58 +++-
 .../testFullOuterJoin1.Sort.plan                |  58 +++-
 ...lOuterJoinPredicationCaseByCase1.1.Hash.plan | 153 ++++++++
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan | 153 ++++++++
 ...lOuterJoinPredicationCaseByCase1.1.Sort.plan | 153 ++++++++
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan | 153 ++++++++
 ...FullOuterJoinPredicationCaseByCase1.1.result |   9 +
 .../testFullOuterJoinWithEmptyTable1.Hash.plan  |  58 +++-
 .../testFullOuterJoinWithEmptyTable1.Sort.plan  |  58 +++-
 ...testJoinFilterOfRowPreservedTable1.Hash.plan |   4 +-
 ...testJoinFilterOfRowPreservedTable1.Sort.plan |   4 +-
 .../testLeftOuterJoin1.Hash.plan                |   4 +-
 .../testLeftOuterJoin1.Sort.plan                |   4 +-
 .../testLeftOuterJoin2.Hash.plan                |  14 +-
 .../testLeftOuterJoin2.Sort.plan                |  14 +-
 .../testLeftOuterJoin3.Hash.plan                |  22 +-
 .../testLeftOuterJoin3.Sort.plan                |  22 +-
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |  18 +-
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |  18 +-
 ...uterJoinPredicationCaseByCase2_1.1.Hash.plan |  21 +-
 ...uterJoinPredicationCaseByCase2_1.1.Sort.plan |  21 +-
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase4.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase4.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase5.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase5.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase6.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase6.1.Sort.plan |  14 +-
 ...testLeftOuterJoinWithConstantExpr1.Hash.plan |   4 +-
 ...testLeftOuterJoinWithConstantExpr1.Sort.plan |   4 +-
 .../testLeftOuterJoinWithEmptyTable1.Hash.plan  |   4 +-
 .../testLeftOuterJoinWithEmptyTable1.Sort.plan  |   4 +-
 .../testLeftOuterJoinWithEmptyTable2.Hash.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable2.Sort.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable3.Hash.plan  |  12 +-
 .../testLeftOuterJoinWithEmptyTable3.Sort.plan  |  12 +-
 .../testLeftOuterJoinWithEmptyTable4.Hash.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable4.Sort.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable5.Hash.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable5.Sort.plan  |   8 +-
 .../testLeftOuterJoinWithNull1.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull1.Sort.plan        |   4 +-
 .../testLeftOuterJoinWithNull2.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull2.Sort.plan        |   4 +-
 .../testLeftOuterJoinWithNull3.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull3.Sort.plan        |   4 +-
 ...leBroadcastDataFileWithZeroLength2.Hash.plan |  14 +-
 ...leBroadcastDataFileWithZeroLength2.Sort.plan |  14 +-
 .../testOuterJoinAndCaseWhen1.Hash.plan         |  30 +-
 .../testOuterJoinAndCaseWhen1.Sort.plan         |  30 +-
 .../testRightOuterJoin1.Hash.plan               |   4 +-
 .../testRightOuterJoin1.Sort.plan               |   4 +-
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan | 101 ++++++
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan | 128 +++++++
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan | 101 ++++++
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan | 128 +++++++
 ...ightOuterJoinPredicationCaseByCase1.1.result |   4 +
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |  76 ++++
 ...edicationCaseByCase2.1.Hash_NoBroadcast.plan | 132 +++++++
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |  76 ++++
 ...edicationCaseByCase2.1.Sort_NoBroadcast.plan | 132 +++++++
 ...ightOuterJoinPredicationCaseByCase2.1.result |   4 +
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan | 101 ++++++
 ...edicationCaseByCase3.1.Hash_NoBroadcast.plan | 128 +++++++
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan | 101 ++++++
 ...edicationCaseByCase3.1.Sort_NoBroadcast.plan | 128 +++++++
 ...ightOuterJoinPredicationCaseByCase3.1.result |   4 +
 .../testRightOuterJoinWithEmptyTable1.Hash.plan |   4 +-
 .../testRightOuterJoinWithEmptyTable1.Sort.plan |   4 +-
 ...testLeftOuterJoinWithConstantExpr2.Hash.plan |  69 ++--
 ...testLeftOuterJoinWithConstantExpr2.Sort.plan |  69 ++--
 ...tLeftOuterJoinWithEmptySubquery1.1.Hash.plan |  96 ++---
 ...tLeftOuterJoinWithEmptySubquery1.1.Sort.plan |  96 ++---
 ...tLeftOuterJoinWithEmptySubquery2.1.Hash.plan |  88 ++---
 ...tLeftOuterJoinWithEmptySubquery2.1.Sort.plan |  88 ++---
 .../testSubQuerySortAfterGroupMultiBlocks.plan  | 112 ++++++
 ...testSubQuerySortAfterGroupMultiBlocks.result |   5 +
 .../results/TestTPCH/testQ1OrderBy.plan         |  88 +++++
 .../results/TestTPCH/testQ1OrderBy.result       |   2 +-
 .../results/TestTPCH/testQ2FourJoins.plan       | 228 ++++++++++++
 .../results/TestTPCH/testQ2FourJoins.result     |   2 +-
 .../results/TestTPCH/testTPCH14Expr.plan        | 119 +++++++
 .../results/TestTPCH/testTPCH14Expr.result      |   2 +-
 .../resources/results/TestTPCH/testTPCHQ5.plan  | 332 ++++++++++++++++++
 .../results/TestTPCH/testTPCHQ5.result          |   2 +
 .../TestUnionQuery/testComplexUnion1.plan       |  80 +++++
 .../TestUnionQuery/testComplexUnion1.result     |   6 +
 .../TestUnionQuery/testComplexUnion2.plan       | 116 +++++++
 .../TestUnionQuery/testComplexUnion2.result     |   7 +
 .../plan/expr/AggregationFunctionCallEval.java  |  63 ++--
 .../function/python/PythonScriptEngine.java     |  17 +-
 .../plan/function/python/TajoScriptEngine.java  |  13 +-
 .../tajo/plan/logical/CreateTableNode.java      |   5 +
 .../org/apache/tajo/plan/logical/JoinNode.java  |  22 +-
 .../plan/rewrite/rules/FilterPushDownRule.java  |   1 +
 .../tajo/plan/serder/EvalNodeDeserializer.java  |  14 +-
 .../tajo/plan/serder/EvalNodeSerializer.java    |   4 +-
 .../plan/serder/LogicalNodeDeserializer.java    |   5 -
 .../tajo/plan/serder/LogicalNodeSerializer.java |  18 +-
 tajo-plan/src/main/proto/Plan.proto             |  12 +-
 243 files changed, 6687 insertions(+), 4087 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index aeda418..da63606 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,8 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1553: Improve broadcast join planning. (jihoon)
+
     TAJO-1577: Add test cases to verify join plans. (jihoon)
 
     TAJO-1607: Tajo Rest Cache-Id should be bigger than zero. (Contributed by 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinMarkCandidateVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinMarkCandidateVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinMarkCandidateVisitor.java
deleted file mode 100644
index 6b3dc48..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinMarkCandidateVisitor.java
+++ /dev/null
@@ -1,72 +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.engine.planner;
-
-import org.apache.tajo.engine.planner.global.GlobalPlanner;
-import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor;
-import org.apache.tajo.plan.LogicalPlan;
-import org.apache.tajo.plan.PlanningException;
-import org.apache.tajo.plan.logical.JoinNode;
-import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.plan.logical.NodeType;
-import org.apache.tajo.plan.logical.ScanNode;
-
-import java.util.Stack;
-
-public class BroadcastJoinMarkCandidateVisitor extends BasicLogicalPlanVisitor<GlobalPlanner.GlobalPlanContext, LogicalNode> {
-  @Override
-  public LogicalNode visitJoin(GlobalPlanner.GlobalPlanContext context, LogicalPlan plan, LogicalPlan.QueryBlock block,
-                               JoinNode node, Stack<LogicalNode> stack) throws PlanningException {
-    LogicalNode leftChild = node.getLeftChild();
-    LogicalNode rightChild = node.getRightChild();
-
-    if (ScanNode.isScanNode(leftChild) && ScanNode.isScanNode(rightChild)) {
-      node.setCandidateBroadcast(true);
-      return node;
-    }
-
-    if(!ScanNode.isScanNode(leftChild)) {
-      visit(context, plan, block, leftChild, stack);
-    }
-
-    if(!ScanNode.isScanNode(rightChild)) {
-      visit(context, plan, block, rightChild, stack);
-    }
-
-    if(isBroadcastCandidateNode(leftChild) &&
-        isBroadcastCandidateNode(rightChild)) {
-      node.setCandidateBroadcast(true);
-    }
-
-    return node;
-  }
-
-  public static boolean isBroadcastCandidateNode(LogicalNode node) {
-    if(node.getType() == NodeType.SCAN ||
-        node.getType() == NodeType.PARTITIONS_SCAN) {
-      return true;
-    }
-
-    if(node.getType() == NodeType.JOIN && ((JoinNode)node).isCandidateBroadcast()) {
-      return true;
-    }
-
-    return false;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinPlanVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinPlanVisitor.java
deleted file mode 100644
index bd8efbe..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/BroadcastJoinPlanVisitor.java
+++ /dev/null
@@ -1,60 +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.engine.planner;
-
-import org.apache.tajo.engine.planner.global.GlobalPlanner;
-import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor;
-import org.apache.tajo.plan.LogicalPlan;
-import org.apache.tajo.plan.PlanningException;
-import org.apache.tajo.plan.logical.JoinNode;
-import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.plan.logical.NodeType;
-import org.apache.tajo.plan.logical.ScanNode;
-
-import java.util.Stack;
-
-public class BroadcastJoinPlanVisitor extends BasicLogicalPlanVisitor<GlobalPlanner.GlobalPlanContext, LogicalNode> {
-  @Override
-  public LogicalNode visitJoin(GlobalPlanner.GlobalPlanContext context, LogicalPlan plan, LogicalPlan.QueryBlock block,
-                               JoinNode node, Stack<LogicalNode> stack) throws PlanningException {
-    LogicalNode leftChild = node.getLeftChild();
-    LogicalNode rightChild = node.getRightChild();
-
-    if (leftChild.getType() == NodeType.JOIN  && ScanNode.isScanNode(rightChild)) {
-      node.getBroadcastCandidateTargets().add(node);
-    }
-    LogicalNode parentNode = stack.peek();
-    if (parentNode != null && parentNode.getType() == NodeType.JOIN) {
-      node.getBroadcastCandidateTargets().addAll(((JoinNode)parentNode).getBroadcastCandidateTargets());
-    }
-
-    Stack<LogicalNode> currentStack = new Stack<LogicalNode>();
-    currentStack.push(node);
-    if(!ScanNode.isScanNode(leftChild)) {
-      visit(context, plan, block, leftChild, currentStack);
-    }
-
-    if(!ScanNode.isScanNode(rightChild)) {
-      visit(context, plan, block, rightChild, currentStack);
-    }
-    currentStack.pop();
-
-    return node;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
index 0252051..30cb24f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
@@ -34,7 +34,6 @@ import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.SortSpecProto;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.plan.serder.LogicalNodeDeserializer;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.planner.global.DataChannel;
 import org.apache.tajo.engine.planner.physical.*;
@@ -47,6 +46,7 @@ import org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.MultipleAg
 import org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.SortSpecArray;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.logical.*;
+import org.apache.tajo.plan.serder.LogicalNodeDeserializer;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.storage.*;
 import org.apache.tajo.storage.fragment.FileFragment;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlock.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlock.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlock.java
index aecb364..4f352c1 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlock.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlock.java
@@ -17,6 +17,7 @@ package org.apache.tajo.engine.planner.global;
 import org.apache.tajo.ExecutionBlockId;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.plan.logical.*;
+import org.apache.tajo.util.TUtil;
 
 import java.util.*;
 
@@ -39,8 +40,56 @@ public class ExecutionBlock {
 
   private boolean hasJoinPlan;
   private boolean hasUnionPlan;
-
-  private Set<String> broadcasted = new HashSet<String>();
+  private boolean isUnionOnly;
+
+  private Map<String, ScanNode> broadcastRelations = TUtil.newHashMap();
+
+  /*
+   * An execution block is null-supplying or preserved-row when its output is used as an input for outer join.
+   * These properties are decided based on the type of parent execution block's outer join.
+   * Here are brief descriptions for these properties.
+   *
+   * 1) left outer join
+   *
+   *              parent eb
+   *         -------------------
+   *         | left outer join |
+   *         -------------------
+   *           /              \
+   *   left child eb     right child eb
+   * ----------------- ------------------
+   * | preserved-row | | null-supplying |
+   * ----------------- ------------------
+   *
+   * 2) right outer join
+   *
+   *               parent eb
+   *         --------------------
+   *         | right outer join |
+   *         --------------------
+   *           /              \
+   *   left child eb     right child eb
+   * ------------------ -----------------
+   * | null-supplying | | preserved-row |
+   * ------------------ -----------------
+   *
+   * 3) full outer join
+   *
+   *               parent eb
+   *         -------------------
+   *         | full outer join |
+   *         -------------------
+   *           /              \
+   *   left child eb      right child eb
+   * ------------------ ------------------
+   * | null-supplying | | preserved-row  |
+   * | preserved-row  | | null-supplying |
+   * ------------------ ------------------
+   *
+   * The null-supplying and preserved-row properties are used to find which relations will be broadcasted.
+   */
+  protected boolean nullSuppllying = false;
+  protected boolean preservedRow = false;
 
   public ExecutionBlock(ExecutionBlockId executionBlockId) {
     this.executionBlockId = executionBlockId;
@@ -53,6 +102,7 @@ public class ExecutionBlock {
   public void setPlan(LogicalNode plan) {
     hasJoinPlan = false;
     hasUnionPlan = false;
+    isUnionOnly = true;
     this.scanlist.clear();
     this.plan = plan;
 
@@ -65,6 +115,12 @@ public class ExecutionBlock {
     s.add(node);
     while (!s.isEmpty()) {
       node = s.remove(s.size()-1);
+      // TODO: the below code should be improved to handle every case
+      if (isUnionOnly && node.getType() != NodeType.ROOT && node.getType() != NodeType.TABLE_SUBQUERY &&
+          node.getType() != NodeType.SCAN && node.getType() != NodeType.PARTITIONS_SCAN &&
+          node.getType() != NodeType.UNION && node.getType() != NodeType.PROJECTION) {
+        isUnionOnly = false;
+      }
       if (node instanceof UnaryNode) {
         UnaryNode unary = (UnaryNode) node;
         s.add(s.size(), unary.getChild());
@@ -86,6 +142,9 @@ public class ExecutionBlock {
         store = (StoreTableNode)node;
       }
     }
+    if (!hasUnionPlan) {
+      isUnionOnly = false;
+    }
   }
 
   public void addUnionScan(ExecutionBlockId realScanEbId, ExecutionBlockId delegatedScanEbId) {
@@ -108,6 +167,16 @@ public class ExecutionBlock {
     return store;
   }
 
+  public int getNonBroadcastRelNum() {
+    int nonBroadcastRelNum = 0;
+    for (ScanNode scanNode : scanlist) {
+      if (!broadcastRelations.containsKey(scanNode.getCanonicalName())) {
+        nonBroadcastRelNum++;
+      }
+    }
+    return nonBroadcastRelNum;
+  }
+
   public ScanNode [] getScanNodes() {
     return this.scanlist.toArray(new ScanNode[scanlist.size()]);
   }
@@ -120,25 +189,49 @@ public class ExecutionBlock {
     return hasUnionPlan;
   }
 
-  public void addBroadcastTable(String tableName) {
-    broadcasted.add(tableName);
-    enforcer.addBroadcast(tableName);
+  public boolean isUnionOnly() {
+    return isUnionOnly;
   }
 
-  public void removeBroadcastTable(String tableName) {
-    broadcasted.remove(tableName);
-    enforcer.removeBroadcast(tableName);
+  public void addBroadcastRelation(ScanNode relationNode) {
+    broadcastRelations.put(relationNode.getCanonicalName(), relationNode);
+    enforcer.addBroadcast(relationNode.getCanonicalName());
   }
 
-  public boolean isBroadcastTable(String tableName) {
-    return broadcasted.contains(tableName);
+  public void removeBroadcastRelation(ScanNode relationNode) {
+    broadcastRelations.remove(relationNode.getCanonicalName());
+    enforcer.removeBroadcast(relationNode.getCanonicalName());
   }
 
-  public Collection<String> getBroadcastTables() {
-    return broadcasted;
+  public boolean isBroadcastRelation(ScanNode relationNode) {
+    return broadcastRelations.containsKey(relationNode.getCanonicalName());
+  }
+
+  public boolean hasBroadcastRelation() {
+    return broadcastRelations.size() > 0;
+  }
+
+  public Collection<ScanNode> getBroadcastRelations() {
+    return broadcastRelations.values();
   }
 
   public String toString() {
     return executionBlockId.toString();
   }
+
+  public void setNullSuppllying() {
+    nullSuppllying = true;
+  }
+
+  public void setPreservedRow() {
+    preservedRow = true;
+  }
+
+  public boolean isNullSuppllying() {
+    return nullSuppllying;
+  }
+
+  public boolean isPreservedRow() {
+    return preservedRow;
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
index 48b5326..89e887a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
@@ -35,17 +35,15 @@ import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.engine.planner.BroadcastJoinMarkCandidateVisitor;
-import org.apache.tajo.engine.planner.BroadcastJoinPlanVisitor;
 import org.apache.tajo.engine.planner.global.builder.DistinctGroupbyBuilder;
 import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanRewriteEngine;
 import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanRewriteRuleProvider;
+import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.InternalException;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.PlanningException;
 import org.apache.tajo.plan.Target;
 import org.apache.tajo.plan.expr.*;
-import org.apache.tajo.plan.function.AggFunction;
 import org.apache.tajo.plan.logical.*;
 import org.apache.tajo.plan.rewrite.rules.ProjectionPushDownRule;
 import org.apache.tajo.plan.util.PlannerUtil;
@@ -119,7 +117,7 @@ public class GlobalPlanner {
   /**
    * Builds a master plan from the given logical plan.
    */
-  public void build(MasterPlan masterPlan) throws IOException, PlanningException {
+  public void build(QueryContext queryContext, MasterPlan masterPlan) throws IOException, PlanningException {
 
     DistributedPlannerVisitor planner = new DistributedPlannerVisitor();
     GlobalPlanContext globalPlanContext = new GlobalPlanContext();
@@ -132,19 +130,6 @@ public class GlobalPlanner {
     LogicalNode inputPlan = PlannerUtil.clone(masterPlan.getLogicalPlan(),
         masterPlan.getLogicalPlan().getRootBlock().getRoot());
 
-    boolean broadcastEnabled = masterPlan.getContext().getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED);
-    if (broadcastEnabled) {
-      // pre-visit the master plan in order to find tables to be broadcasted
-      // this visiting does not make any execution block and change plan.
-      BroadcastJoinMarkCandidateVisitor markCandidateVisitor = new BroadcastJoinMarkCandidateVisitor();
-      markCandidateVisitor.visit(globalPlanContext,
-          masterPlan.getLogicalPlan(), masterPlan.getLogicalPlan().getRootBlock(), inputPlan, new Stack<LogicalNode>());
-
-      BroadcastJoinPlanVisitor broadcastJoinPlanVisitor = new BroadcastJoinPlanVisitor();
-      broadcastJoinPlanVisitor.visit(globalPlanContext,
-          masterPlan.getLogicalPlan(), masterPlan.getLogicalPlan().getRootBlock(), inputPlan, new Stack<LogicalNode>());
-    }
-
     // create a distributed execution plan by visiting each logical node.
     // Its output is a graph, where each vertex is an execution block, and each edge is a data channel.
     // MasterPlan contains them.
@@ -167,9 +152,10 @@ public class GlobalPlanner {
     }
 
     masterPlan.setTerminal(terminalBlock);
-    LOG.info("\n" + masterPlan.toString());
+    LOG.info("\n\nNon-optimized master plan\n" + masterPlan.toString());
 
-    rewriteEngine.rewrite(masterPlan);
+    masterPlan = rewriteEngine.rewrite(queryContext, masterPlan);
+    LOG.info("\n\nOptimized master plan\n" + masterPlan.toString());
   }
 
   private static void setFinalOutputChannel(DataChannel outputChannel, Schema outputSchema) {
@@ -209,187 +195,12 @@ public class GlobalPlanner {
     return channel;
   }
 
-  /**
-   * It calculates the total volume of all descendent relation nodes.
-   */
-  public static long computeDescendentVolume(LogicalNode node) throws PlanningException {
-
-    if (node instanceof RelationNode) {
-      switch (node.getType()) {
-      case SCAN:
-        ScanNode scanNode = (ScanNode) node;
-        if (scanNode.getTableDesc().getStats() == null) {
-          // TODO - this case means that data is not located in HDFS. So, we need additional
-          // broadcast method.
-          return Long.MAX_VALUE;
-        } else {
-          return scanNode.getTableDesc().getStats().getNumBytes();
-        }
-      case PARTITIONS_SCAN:
-        PartitionedTableScanNode pScanNode = (PartitionedTableScanNode) node;
-        if (pScanNode.getTableDesc().getStats() == null) {
-          // TODO - this case means that data is not located in HDFS. So, we need additional
-          // broadcast method.
-          return Long.MAX_VALUE;
-        } else {
-          // if there is no selected partition
-          if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) {
-            return 0;
-          } else {
-            return pScanNode.getTableDesc().getStats().getNumBytes();
-          }
-        }
-      case TABLE_SUBQUERY:
-        return computeDescendentVolume(((TableSubQueryNode) node).getSubQuery());
-      default:
-        throw new IllegalArgumentException("Not RelationNode");
-      }
-    } else if (node instanceof UnaryNode) {
-      return computeDescendentVolume(((UnaryNode) node).getChild());
-    } else if (node instanceof BinaryNode) {
-      BinaryNode binaryNode = (BinaryNode) node;
-      return computeDescendentVolume(binaryNode.getLeftChild()) + computeDescendentVolume(binaryNode.getRightChild());
-    }
-
-    throw new PlanningException("Invalid State");
-  }
-
-  private static boolean checkIfCanBeOneOfBroadcastJoin(LogicalNode node) {
-    return node.getType() == NodeType.SCAN || node.getType() == NodeType.PARTITIONS_SCAN;
-  }
-
-  /**
-   * Get a volume of a table of a partitioned table
-   * @param scanNode ScanNode corresponding to a table
-   * @return table volume (bytes)
-   */
-  private static long getTableVolume(ScanNode scanNode) {
-    long scanBytes = scanNode.getTableDesc().getStats().getNumBytes();
-    if (scanNode.getType() == NodeType.PARTITIONS_SCAN) {
-      PartitionedTableScanNode pScanNode = (PartitionedTableScanNode)scanNode;
-      if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) {
-        scanBytes = 0L;
-      }
-    }
-
-    return scanBytes;
-  }
-
   private ExecutionBlock buildJoinPlan(GlobalPlanContext context, JoinNode joinNode,
                                         ExecutionBlock leftBlock, ExecutionBlock rightBlock)
       throws PlanningException {
     MasterPlan masterPlan = context.plan;
     ExecutionBlock currentBlock;
 
-    boolean broadcastEnabled = context.getPlan().getContext().getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED);
-    long broadcastTableSizeLimit = context.getPlan().getContext().getLong(SessionVars.BROADCAST_TABLE_SIZE_LIMIT);
-
-    // to check when the tajo.dist-query.join.broadcast.auto property is true
-    if (broadcastEnabled && joinNode.isCandidateBroadcast()) {
-      LogicalNode leftNode = joinNode.getLeftChild();
-      LogicalNode rightNode = joinNode.getRightChild();
-
-      List<ScanNode> broadcastTargetScanNodes = new ArrayList<ScanNode>();
-      int numLargeTables = 0;
-      boolean leftBroadcast = false;
-      boolean rightBroadcast = false;
-
-      // TODO - in the the current implementation, a broadcast join on a bush join tree is not supported yet.
-      //
-      //        Join
-      //       /    \
-      //   Join     Join
-      //   /  \     /  \
-      // Scan Scan Scan Scan
-
-
-      // Checking Left Side of Join
-      if (ScanNode.isScanNode(leftNode)) {
-        ScanNode scanNode = (ScanNode)leftNode;
-        if (joinNode.getJoinType() == JoinType.LEFT_OUTER || getTableVolume(scanNode) >= broadcastTableSizeLimit) {
-          numLargeTables++;
-        } else {
-          leftBroadcast = true;
-          broadcastTargetScanNodes.add(scanNode);
-          LOG.info("JoinNode's left table " + scanNode.getCanonicalName() + " ("
-              + getTableVolume(scanNode) + ") is marked a broadcasted table");
-        }
-      }
-
-      // Checking Right Side OF Join
-      if (ScanNode.isScanNode(rightNode)) {
-        ScanNode scanNode = (ScanNode)rightNode;
-        if (joinNode.getJoinType() == JoinType.RIGHT_OUTER || getTableVolume(scanNode) >= broadcastTableSizeLimit) {
-          numLargeTables++;
-        } else {
-          rightBroadcast = true;
-          broadcastTargetScanNodes.add(scanNode);
-          LOG.info("JoinNode's right table " + scanNode.getCanonicalName() + " ("
-              + getTableVolume(scanNode) + ") is marked a broadcasted table");
-        }
-      }
-
-      JoinNode blockJoinNode = null;
-      if (!leftBroadcast && !rightBroadcast) {
-        // In the case of large, large, small, small
-        // all small tables broadcast to right large table
-        numLargeTables = 1;
-      }
-      for(LogicalNode eachNode: joinNode.getBroadcastCandidateTargets()) {
-        if (eachNode.getPID() == joinNode.getPID()) {
-          continue;
-        }
-        if (numLargeTables >= 2) {
-          break;
-        }
-        JoinNode broadcastJoinNode = (JoinNode)eachNode;
-        ScanNode scanNode = broadcastJoinNode.getRightChild();
-        if (getTableVolume(scanNode) < broadcastTableSizeLimit) {
-          broadcastTargetScanNodes.add(scanNode);
-          blockJoinNode = broadcastJoinNode;
-          LOG.info("The table " + scanNode.getCanonicalName() + " ("
-              + getTableVolume(scanNode) + ") is marked a broadcasted table");
-        } else {
-          numLargeTables++;
-          if (numLargeTables < 2) {
-            blockJoinNode = broadcastJoinNode;
-          }
-        }
-      }
-
-      if (!broadcastTargetScanNodes.isEmpty()) {
-        // make new execution block
-        currentBlock = masterPlan.newExecutionBlock();
-
-        if (!leftBroadcast && !rightBroadcast) {
-          DataChannel leftChannel = createDataChannelFromJoin(leftBlock, rightBlock, currentBlock, joinNode, true);
-          ScanNode leftScan = buildInputExecutor(masterPlan.getLogicalPlan(), leftChannel);
-          joinNode.setLeftChild(leftScan);
-          masterPlan.addConnect(leftChannel);
-
-          DataChannel rightChannel = createDataChannelFromJoin(leftBlock, rightBlock, currentBlock, joinNode, false);
-          ScanNode rightScan = buildInputExecutor(masterPlan.getLogicalPlan(), rightChannel);
-          joinNode.setRightChild(rightScan);
-          masterPlan.addConnect(rightChannel);
-        }
-
-        if (blockJoinNode != null) {
-          LOG.info("Set execution's plan with join " + blockJoinNode + " for broadcast join");
-          // set current execution block's plan with last broadcast join node
-          currentBlock.setPlan(blockJoinNode);
-        } else {
-          currentBlock.setPlan(joinNode);
-        }
-
-        for (ScanNode eachBroadcastTarget: broadcastTargetScanNodes) {
-          currentBlock.addBroadcastTable(eachBroadcastTarget.getCanonicalName());
-          context.execBlockMap.remove(eachBroadcastTarget.getPID());
-        }
-
-        return currentBlock;
-      }
-    }
-
     LogicalNode leftNode = joinNode.getLeftChild();
     LogicalNode rightNode = joinNode.getRightChild();
 
@@ -961,7 +772,7 @@ public class GlobalPlanner {
         firstPhaseEvalNames[i] = plan.generateUniqueColumnName(firstPhaseEvals[i]);
         FieldEval param = new FieldEval(firstPhaseEvalNames[i], firstPhaseEvals[i].getValueType());
 
-        secondPhaseEvals[i].setFinalPhase();
+        secondPhaseEvals[i].setLastPhase();
         secondPhaseEvals[i].setArgs(new EvalNode[]{param});
       }
 
@@ -1355,33 +1166,20 @@ public class GlobalPlanner {
       LogicalNode leftChild = visit(context, plan, block, node.getLeftChild(), stack);
       ExecutionBlock leftChildBlock = context.execBlockMap.get(leftChild.getPID());
 
-      if (leftChild.getType() == NodeType.JOIN && checkIfCanBeOneOfBroadcastJoin(node.getRightChild())) {
-        ScanNode scanNode = node.getRightChild();
-        if (leftChildBlock.isBroadcastTable(scanNode.getCanonicalName())) {
-          context.execBlockMap.put(node.getPID(), leftChildBlock);
-          return node;
-        }
-
-        // if left execution block's plan is replaced with parent node(join node)
-        if (leftChildBlock.getPlan().getPID() == node.getPID()) {
-          context.execBlockMap.put(node.getPID(), leftChildBlock);
-          return node;
-        }
-      }
-
       LogicalNode rightChild = visit(context, plan, block, node.getRightChild(), stack);
       ExecutionBlock rightChildBlock = context.execBlockMap.get(rightChild.getPID());
 
-      // In the case of broadcast join leftChildBlock can be replaced with upper join node.
-      // So if the current join node is a child node of leftChildBlock's plan(join node)
-      // the current join node already participates in broadcast join.
-      LogicalNode leftChildBlockNode = leftChildBlock.getPlan();
-      // If child block is union, child block has not plan
-      if (leftChildBlockNode != null && leftChildBlockNode.getType() == NodeType.JOIN) {
-        if (leftChildBlockNode.getPID() > node.getPID()) {
-          context.execBlockMap.put(node.getPID(), leftChildBlock);
-          return node;
-        }
+      if (node.getJoinType() == JoinType.LEFT_OUTER) {
+        leftChildBlock.setPreservedRow();
+        rightChildBlock.setNullSuppllying();
+      } else if (node.getJoinType() == JoinType.RIGHT_OUTER) {
+        leftChildBlock.setNullSuppllying();
+        rightChildBlock.setPreservedRow();
+      } else if (node.getJoinType() == JoinType.FULL_OUTER) {
+        leftChildBlock.setPreservedRow();
+        leftChildBlock.setNullSuppllying();
+        rightChildBlock.setPreservedRow();
+        rightChildBlock.setNullSuppllying();
       }
 
       ExecutionBlock newExecBlock = buildJoinPlan(context, node, leftChildBlock, rightChildBlock);
@@ -1400,7 +1198,7 @@ public class GlobalPlanner {
       LogicalPlan.QueryBlock rightQueryBlock = plan.getBlock(node.getRightChild());
       LogicalNode rightChild = visit(context, plan, rightQueryBlock, rightQueryBlock.getRoot(), stack);
       stack.pop();
-      
+
       MasterPlan masterPlan = context.getPlan();
 
       List<ExecutionBlock> unionBlocks = Lists.newArrayList();
@@ -1611,29 +1409,4 @@ public class GlobalPlanner {
       return node;
     }
   }
-
-  @SuppressWarnings("unused")
-  private static class ConsecutiveUnionFinder extends BasicLogicalPlanVisitor<List<UnionNode>, LogicalNode> {
-    @Override
-    public LogicalNode visitUnion(List<UnionNode> unionNodeList, LogicalPlan plan, LogicalPlan.QueryBlock queryBlock,
-                                  UnionNode node, Stack<LogicalNode> stack)
-        throws PlanningException {
-      if (node.getType() == NodeType.UNION) {
-        unionNodeList.add(node);
-      }
-
-      stack.push(node);
-      TableSubQueryNode leftSubQuery = node.getLeftChild();
-      TableSubQueryNode rightSubQuery = node.getRightChild();
-      if (leftSubQuery.getSubQuery().getType() == NodeType.UNION) {
-        visit(unionNodeList, plan, queryBlock, leftSubQuery, stack);
-      }
-      if (rightSubQuery.getSubQuery().getType() == NodeType.UNION) {
-        visit(unionNodeList, plan, queryBlock, rightSubQuery, stack);
-      }
-      stack.pop();
-
-      return node;
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
index 3cca4f2..6e9b74f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
@@ -26,6 +26,7 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
+import org.apache.tajo.util.graph.DirectedGraphVisitor;
 import org.apache.tajo.util.graph.SimpleDirectedGraph;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.ipc.TajoWorkerProtocol;
@@ -108,6 +109,20 @@ public class MasterPlan {
     return execBlockMap.get(execBlockId);
   }
 
+  public void removeExecBlock(ExecutionBlockId execBlockId) throws IllegalStateException {
+    List<DataChannel> channels = getIncomingChannels(execBlockId);
+    if (channels != null && channels.size() > 0) {
+      throw new IllegalStateException("Cannot remove execution blocks because some other execution blocks are connected");
+    }
+
+    channels = getOutgoingChannels(execBlockId);
+    if (channels != null && channels.size() > 0) {
+      throw new IllegalStateException("Cannot remove execution blocks because some other execution blocks are connected");
+    }
+
+    execBlockMap.remove(execBlockId);
+  }
+
   public void addConnect(DataChannel dataChannel) {
     execBlockGraph.addEdge(dataChannel.getSrcId(), dataChannel.getTargetId(), dataChannel);
   }
@@ -204,6 +219,10 @@ public class MasterPlan {
     return getChild(executionBlock.getId(), idx);
   }
 
+  public void accept(ExecutionBlockId v, DirectedGraphVisitor<ExecutionBlockId> visitor) {
+    execBlockGraph.accept(v, visitor);
+  }
+
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
index 13ed99b..8095458 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
@@ -250,11 +250,6 @@ public class DistinctGroupbyBuilder {
     for (DistinctGroupbyNodeBuildInfo buildInfo: distinctNodeBuildInfos.values()) {
       GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode();
       List<AggregationFunctionCallEval> groupbyAggFunctions = buildInfo.getAggFunctions();
-      String [] firstPhaseEvalNames = new String[groupbyAggFunctions.size()];
-      int index = 0;
-      for (AggregationFunctionCallEval eachCallEval: groupbyAggFunctions) {
-        firstPhaseEvalNames[index++] = eachCallEval.getName();
-      }
 
       Target[] targets = new Target[eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()];
       int targetIdx = 0;
@@ -411,7 +406,7 @@ public class DistinctGroupbyBuilder {
         buildInfo.addAggFunction(aggFunction);
         buildInfo.addAggFunctionTarget(aggFunctionTarget);
       } else {
-        aggFunction.setFinalPhase();
+        aggFunction.setLastPhase();
         otherAggregationFunctionCallEvals.add(aggFunction);
         otherAggregationFunctionTargets.add(aggFunctionTarget);
       }
@@ -562,6 +557,7 @@ public class DistinctGroupbyBuilder {
         }
 
         for (int aggFuncIdx = 0; aggFuncIdx < secondStageGroupbyNode.getAggFunctions().length; aggFuncIdx++) {
+          secondStageGroupbyNode.getAggFunctions()[aggFuncIdx].setLastPhase();
           int targetIdx = originGroupColumns.size() + uniqueDistinctColumn.size() + aggFuncIdx;
           Target aggFuncTarget = oldTargets[targetIdx];
           secondGroupbyTargets.add(aggFuncTarget);
@@ -591,6 +587,7 @@ public class DistinctGroupbyBuilder {
 
           AggregationFunctionCallEval secondStageAggFunction = secondStageGroupbyNode.getAggFunctions()[aggFuncIdx];
           secondStageAggFunction.setArgs(new EvalNode[] {firstEval});
+          secondStageAggFunction.setLastPhase();
 
           Target secondTarget = secondStageGroupbyNode.getTargets()[secondStageGroupbyNode.getGroupingColumns().length + aggFuncIdx];
           Column column = secondTarget.getNamedColumn();

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/BaseGlobalPlanRewriteRuleProvider.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/BaseGlobalPlanRewriteRuleProvider.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/BaseGlobalPlanRewriteRuleProvider.java
index 96ee2c6..1ae4056 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/BaseGlobalPlanRewriteRuleProvider.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/BaseGlobalPlanRewriteRuleProvider.java
@@ -18,7 +18,9 @@
 
 package org.apache.tajo.engine.planner.global.rewriter;
 
+import com.google.common.collect.Lists;
 import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRule;
 import org.apache.tajo.util.TUtil;
 
 import java.util.Collection;
@@ -34,6 +36,8 @@ public class BaseGlobalPlanRewriteRuleProvider extends GlobalPlanRewriteRuleProv
 
   @Override
   public Collection<Class<? extends GlobalPlanRewriteRule>> getRules() {
-    return EMPTY_RULES;
+    List<Class<? extends GlobalPlanRewriteRule>> rules = Lists.newArrayList();
+    rules.add(BroadcastJoinRule.class);
+    return rules;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteEngine.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteEngine.java
index c01ed0e..cc1f3c6 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteEngine.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.planner.global.rewriter;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.tajo.OverridableConf;
 import org.apache.tajo.engine.planner.global.MasterPlan;
 import org.apache.tajo.plan.PlanningException;
 import org.apache.tajo.util.ReflectionUtil;
@@ -67,11 +68,11 @@ public class GlobalPlanRewriteEngine {
    * @param plan The plan to be rewritten with all query rewrite rule.
    * @return The rewritten plan.
    */
-  public MasterPlan rewrite(MasterPlan plan) throws PlanningException {
+  public MasterPlan rewrite(OverridableConf queryContext, MasterPlan plan) throws PlanningException {
     GlobalPlanRewriteRule rule;
     for (Map.Entry<String, GlobalPlanRewriteRule> rewriteRule : rewriteRules.entrySet()) {
       rule = rewriteRule.getValue();
-      if (rule.isEligible(plan)) {
+      if (rule.isEligible(queryContext, plan)) {
         plan = rule.rewrite(plan);
         if (LOG.isDebugEnabled()) {
           LOG.debug("The rule \"" + rule.getName() + " \" rewrites the query.");

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java
index 4a37207..f30160f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java
@@ -18,7 +18,9 @@
 
 package org.apache.tajo.engine.planner.global.rewriter;
 
+import org.apache.tajo.OverridableConf;
 import org.apache.tajo.engine.planner.global.MasterPlan;
+import org.apache.tajo.plan.PlanningException;
 
 /**
  * A rewrite rule for global plans
@@ -29,15 +31,16 @@ public interface GlobalPlanRewriteRule {
    * Return rule name
    * @return Rule name
    */
-  public abstract String getName();
+  String getName();
 
   /**
    * Check if this rule should be applied.
    *
+   * @param queryContext Query context
    * @param plan Global Plan
    * @return
    */
-  public abstract boolean isEligible(MasterPlan plan);
+  boolean isEligible(OverridableConf queryContext, MasterPlan plan);
 
   /**
    * Rewrite a global plan
@@ -45,5 +48,5 @@ public interface GlobalPlanRewriteRule {
    * @param plan Global Plan
    * @return
    */
-  public abstract MasterPlan rewrite(MasterPlan plan);
+  MasterPlan rewrite(MasterPlan plan) throws PlanningException;
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java
new file mode 100644
index 0000000..85b5e10
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java
@@ -0,0 +1,348 @@
+/**
+ * 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.engine.planner.global.rewriter.rules;
+
+import org.apache.tajo.ExecutionBlockId;
+import org.apache.tajo.OverridableConf;
+import org.apache.tajo.SessionVars;
+import org.apache.tajo.engine.planner.global.ExecutionBlock;
+import org.apache.tajo.engine.planner.global.GlobalPlanner;
+import org.apache.tajo.engine.planner.global.MasterPlan;
+import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanRewriteRule;
+import org.apache.tajo.plan.LogicalPlan;
+import org.apache.tajo.plan.PlanningException;
+import org.apache.tajo.plan.logical.*;
+import org.apache.tajo.plan.util.PlannerUtil;
+import org.apache.tajo.util.TUtil;
+import org.apache.tajo.util.graph.DirectedGraphVisitor;
+
+import java.util.*;
+
+/**
+ * {@link BroadcastJoinRule} converts repartition join plan into broadcast join plan.
+ * Broadcast join rules can be defined as follows.
+ *
+ * <h3>Broadcastable relation</h3>
+ * A relation is broadcastable when its size is smaller than a given threshold.
+ *
+ * <h3>Assumetion</h3>
+ * If every input of an execution block is broadcastable, the output of the execution block is also broadcastable.
+ *
+ * <h3>Rules to convert repartition join into broadcast join</h3>
+ * <ul>
+ *   <li>Given an EB containing a join and its child EBs, those EBs can be merged into a single EB if at least one child EB's output is broadcastable.</li>
+ *   <li>Given a user-defined threshold, the total size of broadcast relations of an EB cannot exceed such threshold.</li>
+ *   <ul>
+ *     <li>After merging EBs according to the first rule, the result EB may not satisfy the second rule. In this case, enforce repartition join for large relations to satisfy the second rule.</li>
+ *   </ul>
+ *   <li>Preserved-row relations cannot be broadcasted to avoid duplicated results. That is, full outer join cannot be executed with broadcast join.</li>
+ *   <ul>
+ *     <li>Here is brief backgrounds for this rule. Data of preserved-row relations will be appeared in the join result regardless of join conditions. If multiple tasks execute outer join with broadcasted preserved-row relations, they emit duplicates results.</li>
+ *     <li>Even though a single task can execute outer join when every input is broadcastable, broadcast join is not allowed if one of input relation consists of multiple files.</li>
+ *   </ul>
+ * </ul>
+ *
+ */
+public class BroadcastJoinRule implements GlobalPlanRewriteRule {
+
+  private BroadcastJoinPlanBuilder planBuilder;
+  private BroadcastJoinPlanFinalizer planFinalizer;
+
+  @Override
+  public String getName() {
+    return "BroadcastJoinRule";
+  }
+
+  @Override
+  public boolean isEligible(OverridableConf queryContext, MasterPlan plan) {
+    if (queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED)) {
+      for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) {
+        if (block.hasNode(NodeType.JOIN)) {
+          long broadcastSizeThreshold = queryContext.getLong(SessionVars.BROADCAST_TABLE_SIZE_LIMIT);
+          if (broadcastSizeThreshold > 0) {
+            GlobalPlanRewriteUtil.ParentFinder parentFinder = new GlobalPlanRewriteUtil.ParentFinder();
+            RelationSizeComparator relSizeComparator = new RelationSizeComparator();
+            planBuilder = new BroadcastJoinPlanBuilder(plan, relSizeComparator, parentFinder, broadcastSizeThreshold);
+            planFinalizer = new BroadcastJoinPlanFinalizer(plan, relSizeComparator);
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public MasterPlan rewrite(MasterPlan plan) throws PlanningException{
+    plan.accept(plan.getRoot().getId(), planBuilder);
+    plan.accept(plan.getRoot().getId(), planFinalizer);
+    return plan;
+  }
+
+  private static class RelationSizeComparator implements Comparator<ScanNode> {
+
+    @Override
+    public int compare(ScanNode o1, ScanNode o2) {
+      long compare = GlobalPlanRewriteUtil.getTableVolume(o1) - GlobalPlanRewriteUtil.getTableVolume(o2);
+      if (compare == 0) {
+        return 0;
+      } else if (compare > 0) {
+        return 1;
+      } else {
+        return -1;
+      }
+    }
+  }
+
+  /**
+   * If a plan contains only broadcast relations, it will be executed at multiple workers who store any broadcast relations.
+   * {@Link BroadcastJoinPlanFinalizer} checks whether every input is the broadcast candidate or not.
+   * If so, it removes the broadcast property from the largest relation.
+   */
+  private static class BroadcastJoinPlanFinalizer implements DirectedGraphVisitor<ExecutionBlockId> {
+    private final MasterPlan plan;
+    private final RelationSizeComparator relSizeComparator;
+
+    public BroadcastJoinPlanFinalizer(MasterPlan plan, RelationSizeComparator relationSizeComparator) {
+      this.plan = plan;
+      this.relSizeComparator = relationSizeComparator;
+    }
+
+    @Override
+    public void visit(Stack<ExecutionBlockId> stack, ExecutionBlockId currentId) {
+      ExecutionBlock current = plan.getExecBlock(currentId);
+      if (!plan.isTerminal(current)) {
+        // When every child is a broadcast candidate, enforce non-broadcast for the largest relation for the join to be
+        // computed at the node who stores such largest relation.
+        if (isFullyBroadcastable(current)) {
+          List<ScanNode> broadcastCandidates = TUtil.newList(current.getBroadcastRelations());
+          Collections.sort(broadcastCandidates, relSizeComparator);
+
+          current.removeBroadcastRelation(broadcastCandidates.remove(broadcastCandidates.size()-1));
+        }
+      }
+    }
+  }
+
+  private static class BroadcastJoinPlanBuilder implements DirectedGraphVisitor<ExecutionBlockId> {
+    private final MasterPlan plan;
+    private final RelationSizeComparator relSizeComparator;
+    private final long broadcastSizeThreshold;
+    private final GlobalPlanRewriteUtil.ParentFinder parentFinder;
+
+    public BroadcastJoinPlanBuilder(MasterPlan plan, RelationSizeComparator relationSizeComparator,
+                                    GlobalPlanRewriteUtil.ParentFinder parentFinder, long broadcastSizeThreshold) {
+      this.plan = plan;
+      this.relSizeComparator = relationSizeComparator;
+      this.broadcastSizeThreshold = broadcastSizeThreshold;
+      this.parentFinder = parentFinder;
+    }
+
+    @Override
+    public void visit(Stack<ExecutionBlockId> stack, ExecutionBlockId executionBlockId) {
+      ExecutionBlock current = plan.getExecBlock(executionBlockId);
+
+      if (plan.isLeaf(current)) {
+        visitLeafNode(current);
+      } else {
+        visitNonLeafNode(current);
+      }
+    }
+
+    private void visitLeafNode(ExecutionBlock current) {
+      // At leaf execution blocks, find input relations who's size is smaller than the predefined threshold.
+      if (!current.isPreservedRow()) {
+        // Preserved-row relations must not be broadcasted to avoid data duplication.
+        boolean fullyBroadcastable = true;
+        for (ScanNode scanNode : current.getScanNodes()) {
+          if (GlobalPlanRewriteUtil.getTableVolume(scanNode) <= broadcastSizeThreshold) {
+            current.addBroadcastRelation(scanNode);
+          } else {
+            fullyBroadcastable = false;
+          }
+        }
+        if (fullyBroadcastable && current.getScanNodes().length == 1) {
+          try {
+            updateScanOfParentAsBroadcastable(plan, current);
+          } catch (PlanningException e) {
+            // This case is when the current has two or more inputs via union, and simply ignored.
+          }
+        }
+      }
+    }
+
+    private void visitNonLeafNode(ExecutionBlock current) {
+      // At non-leaf execution blocks, merge broadcastable children's plan with the current plan.
+
+      if (!plan.isTerminal(current)) {
+        if (current.hasJoin()) {
+          List<ExecutionBlock> childs = plan.getChilds(current);
+          Map<ExecutionBlockId, ExecutionBlockId> unionScanMap = current.getUnionScanMap();
+
+          if (current.hasBroadcastRelation()) {
+            // The current execution block and its every child are able to be merged.
+            for (ExecutionBlock child : childs) {
+              try {
+                addUnionNodeIfNecessary(unionScanMap, plan, child, current);
+                mergeTwoPhaseJoin(plan, child, current);
+              } catch (PlanningException e) {
+                throw new RuntimeException(e);
+              }
+            }
+
+            checkTotalSizeOfBroadcastableRelations(current);
+
+            // We assume that if every input of an execution block is broadcastable,
+            // the output of the execution block is also broadcastable.
+            if (!current.isPreservedRow() && isFullyBroadcastable(current)) {
+              try {
+                updateScanOfParentAsBroadcastable(plan, current);
+              } catch (PlanningException e) {
+                throw new RuntimeException(e);
+              }
+            }
+          }
+        } else {
+          List<ScanNode> relations = TUtil.newList(current.getBroadcastRelations());
+          for (ScanNode eachRelation : relations) {
+            current.removeBroadcastRelation(eachRelation);
+          }
+        }
+      }
+    }
+
+    /**
+     * When the total size of broadcastable relations exceeds the threshold, enforce repartition join for large ones
+     * in order to broadcast as many relations as possible.
+     *
+     * @param block
+     */
+    private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) {
+      List<ScanNode> broadcastCandidates = TUtil.newList();
+      for (ScanNode scanNode : block.getScanNodes()) {
+        long estimatedRelationSize = GlobalPlanRewriteUtil.getTableVolume(scanNode);
+        if (estimatedRelationSize > 0 && estimatedRelationSize <= broadcastSizeThreshold) {
+          broadcastCandidates.add(scanNode);
+        }
+      }
+      Collections.sort(broadcastCandidates, relSizeComparator);
+
+      // Enforce broadcast for candidates in ascending order of relation size
+      long totalBroadcastVolume = 0;
+      int i;
+      for (i = 0; i < broadcastCandidates.size(); i++) {
+        long volumeOfCandidate = GlobalPlanRewriteUtil.getTableVolume(broadcastCandidates.get(i));
+        if (totalBroadcastVolume + volumeOfCandidate > broadcastSizeThreshold) {
+          break;
+        }
+        totalBroadcastVolume += volumeOfCandidate;
+      }
+
+      for (; i < broadcastCandidates.size(); ) {
+        ScanNode nonBroadcast = broadcastCandidates.remove(i);
+        block.removeBroadcastRelation(nonBroadcast);
+      }
+    }
+
+    private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current) throws PlanningException {
+      ExecutionBlock parent = plan.getParent(current);
+      if (parent != null && !plan.isTerminal(parent)) {
+        ScanNode scanForCurrent = GlobalPlanRewriteUtil.findScanForChildEb(current, parent);
+        parent.addBroadcastRelation(scanForCurrent);
+      }
+    }
+
+    /**
+     * Merge child execution blocks.
+     *
+     * @param plan master plan
+     * @param child child block
+     * @param parent parent block who has join nodes
+     * @return
+     */
+    private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent)
+        throws PlanningException {
+      ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(child, parent);
+
+      parentFinder.set(scanForChild);
+      parentFinder.find(parent.getPlan());
+      LogicalNode parentOfScanForChild = parentFinder.getFound();
+
+      LogicalNode rootOfChild = child.getPlan();
+      if (rootOfChild.getType() == NodeType.STORE) {
+        rootOfChild = ((StoreTableNode)rootOfChild).getChild();
+      }
+
+      GlobalPlanRewriteUtil.replaceChild(rootOfChild, scanForChild, parentOfScanForChild);
+
+      parent = GlobalPlanRewriteUtil.mergeExecutionBlocks(plan, child, parent);
+      parent.removeBroadcastRelation(scanForChild);
+
+      parent.setPlan(parent.getPlan());
+
+      return parent;
+    }
+
+    private void addUnionNodeIfNecessary(Map<ExecutionBlockId, ExecutionBlockId> unionScanMap, MasterPlan plan,
+                                         ExecutionBlock child, ExecutionBlock current)
+        throws PlanningException {
+      if (unionScanMap != null) {
+        List<ExecutionBlockId> unionScans = TUtil.newList();
+        ExecutionBlockId representativeId = null;
+        if (unionScanMap.containsKey(child.getId())) {
+          representativeId = unionScanMap.get(child.getId());
+        } else if (unionScanMap.containsValue(child.getId())) {
+          representativeId = child.getId();
+        }
+
+        if (representativeId != null) {
+          for (Map.Entry<ExecutionBlockId, ExecutionBlockId> entry : unionScanMap.entrySet()) {
+            if (entry.getValue().equals(representativeId)) {
+              unionScans.add(entry.getKey());
+            }
+          }
+
+          // add unions
+          LogicalNode left, topUnion = null;
+          left = GlobalPlanner.buildInputExecutor(plan.getLogicalPlan(), plan.getChannel(unionScans.get(0), current.getId()));
+          for (int i = 1; i < unionScans.size(); i++) {
+            // left must not be null
+            UnionNode unionNode = plan.getLogicalPlan().createNode(UnionNode.class);
+            unionNode.setLeftChild(left);
+            unionNode.setRightChild(GlobalPlanner.buildInputExecutor(plan.getLogicalPlan(), plan.getChannel(unionScans.get(i), current.getId())));
+            unionNode.setInSchema(left.getOutSchema());
+            unionNode.setOutSchema(left.getOutSchema());
+            topUnion = unionNode;
+            left = unionNode;
+          }
+
+          ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(plan.getExecBlock(representativeId), current);
+          PlannerUtil.replaceNode(plan.getLogicalPlan(), current.getPlan(), scanForChild, topUnion);
+
+          current.getUnionScanMap().clear();
+          current.setPlan(current.getPlan());
+        }
+      }
+    }
+  }
+
+  private static boolean isFullyBroadcastable(ExecutionBlock block) {
+    return block.getBroadcastRelations().size() == block.getScanNodes().length;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
index e55a258..9148382 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.engine.planner.global.rewriter.rules;
 
+import org.apache.tajo.OverridableConf;
 import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.engine.planner.global.ExecutionBlockCursor;
 import org.apache.tajo.engine.planner.global.MasterPlan;
@@ -38,7 +39,7 @@ public class GlobalPlanEqualityTester implements GlobalPlanRewriteRule {
   }
 
   @Override
-  public boolean isEligible(MasterPlan plan) {
+  public boolean isEligible(OverridableConf queryContext, MasterPlan plan) {
     return true;
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java
new file mode 100644
index 0000000..cc98300
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java
@@ -0,0 +1,216 @@
+/**
+ * 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.engine.planner.global.rewriter.rules;
+
+import org.apache.tajo.engine.planner.global.DataChannel;
+import org.apache.tajo.engine.planner.global.ExecutionBlock;
+import org.apache.tajo.engine.planner.global.MasterPlan;
+import org.apache.tajo.plan.PlanningException;
+import org.apache.tajo.plan.logical.*;
+
+import java.util.List;
+
+public class GlobalPlanRewriteUtil {
+  /**
+   * Merge the parent EB with the child EB.
+   *
+   * @param plan
+   * @param child
+   * @param parent
+   * @return
+   */
+  public static ExecutionBlock mergeExecutionBlocks(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) {
+    for (ScanNode broadcastable : child.getBroadcastRelations()) {
+      parent.addBroadcastRelation(broadcastable);
+    }
+
+    // connect parent and grand children
+    List<ExecutionBlock> grandChilds = plan.getChilds(child);
+    for (ExecutionBlock eachGrandChild : grandChilds) {
+      DataChannel originalChannel = plan.getChannel(eachGrandChild, child);
+      DataChannel newChannel = new DataChannel(eachGrandChild, parent, originalChannel.getShuffleType(),
+          originalChannel.getShuffleOutputNum());
+      newChannel.setSchema(originalChannel.getSchema());
+      newChannel.setShuffleKeys(originalChannel.getShuffleKeys());
+      newChannel.setStoreType(originalChannel.getStoreType());
+      newChannel.setTransmitType(originalChannel.getTransmitType());
+      plan.addConnect(newChannel);
+      plan.disconnect(eachGrandChild, child);
+    }
+
+    plan.disconnect(child, parent);
+    List<DataChannel> channels = plan.getIncomingChannels(child.getId());
+    if (channels == null || channels.size() == 0) {
+      channels = plan.getOutgoingChannels(child.getId());
+      if (channels == null || channels.size() == 0) {
+        plan.removeExecBlock(child.getId());
+      }
+    }
+    return parent;
+  }
+
+  /**
+   * Replace a child of the given parent logical node with the new one.
+   *
+   * @param newChild
+   * @param originalChild
+   * @param parent
+   * @throws PlanningException
+   */
+  public static void replaceChild(LogicalNode newChild, ScanNode originalChild, LogicalNode parent)
+      throws PlanningException {
+    if (parent instanceof UnaryNode) {
+      ((UnaryNode) parent).setChild(newChild);
+    } else if (parent instanceof BinaryNode) {
+      BinaryNode binary = (BinaryNode) parent;
+      if (binary.getLeftChild().equals(originalChild)) {
+        binary.setLeftChild(newChild);
+      } else if (binary.getRightChild().equals(originalChild)) {
+        binary.setRightChild(newChild);
+      } else {
+        throw new PlanningException(originalChild.getPID() + " is not a child of " + parent.getPID());
+      }
+    } else {
+      throw new PlanningException(parent.getPID() + " seems to not have any children");
+    }
+  }
+
+  /**
+   * Find a scan node in the plan of the parent EB corresponding to the output of the child EB.
+   *
+   * @param child
+   * @param parent
+   * @return
+   * @throws PlanningException
+   */
+  public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) throws PlanningException {
+    ScanNode scanForChild = null;
+    for (ScanNode scanNode : parent.getScanNodes()) {
+      if (scanNode.getTableName().equals(child.getId().toString())) {
+        scanForChild = scanNode;
+        break;
+      }
+    }
+    if (scanForChild == null) {
+      throw new PlanningException("Cannot find any scan nodes for " + child.getId() + " in " + parent.getId());
+    }
+    return scanForChild;
+  }
+
+  /**
+   * Get a volume of a table of a partitioned table
+   * @param scanNode ScanNode corresponding to a table
+   * @return table volume (bytes)
+   */
+  public static long getTableVolume(ScanNode scanNode) {
+    if (scanNode.getTableDesc().hasStats()) {
+      long scanBytes = scanNode.getTableDesc().getStats().getNumBytes();
+      if (scanNode.getType() == NodeType.PARTITIONS_SCAN) {
+        PartitionedTableScanNode pScanNode = (PartitionedTableScanNode) scanNode;
+        if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) {
+          scanBytes = 0L;
+        }
+      }
+
+      return scanBytes;
+    } else {
+      return -1;
+    }
+  }
+
+  /**
+   * It calculates the total volume of all descendent relation nodes.
+   */
+  public static long computeDescendentVolume(LogicalNode node) throws PlanningException {
+
+    if (node instanceof RelationNode) {
+      switch (node.getType()) {
+        case SCAN:
+          ScanNode scanNode = (ScanNode) node;
+          if (scanNode.getTableDesc().getStats() == null) {
+            // TODO - this case means that data is not located in HDFS. So, we need additional
+            // broadcast method.
+            return Long.MAX_VALUE;
+          } else {
+            return scanNode.getTableDesc().getStats().getNumBytes();
+          }
+        case PARTITIONS_SCAN:
+          PartitionedTableScanNode pScanNode = (PartitionedTableScanNode) node;
+          if (pScanNode.getTableDesc().getStats() == null) {
+            // TODO - this case means that data is not located in HDFS. So, we need additional
+            // broadcast method.
+            return Long.MAX_VALUE;
+          } else {
+            // if there is no selected partition
+            if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) {
+              return 0;
+            } else {
+              return pScanNode.getTableDesc().getStats().getNumBytes();
+            }
+          }
+        case TABLE_SUBQUERY:
+          return computeDescendentVolume(((TableSubQueryNode) node).getSubQuery());
+        default:
+          throw new IllegalArgumentException("Not RelationNode");
+      }
+    } else if (node instanceof UnaryNode) {
+      return computeDescendentVolume(((UnaryNode) node).getChild());
+    } else if (node instanceof BinaryNode) {
+      BinaryNode binaryNode = (BinaryNode) node;
+      return computeDescendentVolume(binaryNode.getLeftChild()) + computeDescendentVolume(binaryNode.getRightChild());
+    }
+
+    throw new PlanningException("Invalid State");
+  }
+
+  public static class ParentFinder implements LogicalNodeVisitor {
+    private LogicalNode target;
+    private LogicalNode found;
+
+    public void set(LogicalNode child) {
+      this.target = child;
+      this.found = null;
+    }
+
+    public void find(LogicalNode root) {
+      this.visit(root);
+    }
+
+    public LogicalNode getFound() throws PlanningException {
+      if (found == null) {
+        throw new PlanningException("Cannot find the parent of " + target.getPID());
+      }
+      return this.found;
+    }
+
+    @Override
+    public void visit(LogicalNode node) {
+      for (int i = 0; i < node.childNum(); i++) {
+        if (node.getChild(i).equals(target)) {
+          found = node;
+          break;
+        } else {
+          if (found == null) {
+            visit(node.getChild(i));
+          }
+        }
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/CommonHashJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/CommonHashJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/CommonHashJoinExec.java
index ff9b253..588f0fc 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/CommonHashJoinExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/CommonHashJoinExec.java
@@ -125,6 +125,19 @@ public abstract class CommonHashJoinExec<T> extends CommonJoinExec {
         keyTuple.put(i, tuple.get(rightKeyList[i]));
       }
 
+      /*
+       * TODO
+       * Currently, some physical executors can return new instances of tuple, but others not.
+       * This sometimes causes wrong results due to the singleton Tuple instance.
+       * The below line is a temporal solution to fix this problem.
+       * This will be improved at https://issues.apache.org/jira/browse/TAJO-1343.
+       */
+      try {
+        tuple = tuple.clone();
+      } catch (CloneNotSupportedException e) {
+        throw new IOException(e);
+      }
+
       List<Tuple> newValue = map.get(keyTuple);
       if (newValue == null) {
         map.put(keyTuple, newValue = new ArrayList<Tuple>());

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java
index 7c38d36..267bd90 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java
@@ -253,7 +253,7 @@ public class DistinctGroupbyThirdAggregationExec extends UnaryPhysicalExec {
       if (aggrFunctions != null) {
         for (AggregationFunctionCallEval eachFunction: aggrFunctions) {
           eachFunction.bind(context.getEvalContext(), inSchema);
-          eachFunction.setFinalPhase();
+          eachFunction.setLastPhase();
         }
       }
       newFunctionContext();

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
index 6c1399e..45b23f8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
@@ -98,7 +98,7 @@ public class NonForwardQueryResultSystemScanner implements NonForwardQueryResult
     MasterPlan masterPlan = new MasterPlan(queryId, queryContext, logicalPlan);
     GlobalPlanner globalPlanner = new GlobalPlanner(masterContext.getConf(), masterContext.getCatalog());
     try {
-      globalPlanner.build(masterPlan);
+      globalPlanner.build(queryContext, masterPlan);
     } catch (PlanningException e) {
       throw new RuntimeException(e);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index 6ab096f..22b8c4c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -496,7 +496,7 @@ public class QueryExecutor {
     }
 
     MasterPlan masterPlan = new MasterPlan(QueryIdFactory.NULL_QUERY_ID, context, plan);
-    planner.build(masterPlan);
+    planner.build(context, masterPlan);
 
     return masterPlan;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/DefaultTaskScheduler.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/DefaultTaskScheduler.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/DefaultTaskScheduler.java
index 351856f..939de60 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/DefaultTaskScheduler.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/DefaultTaskScheduler.java
@@ -865,7 +865,7 @@ public class DefaultTaskScheduler extends AbstractTaskScheduler {
       }
 
       ExecutionBlock parent = masterPlan.getParent(block);
-      if (masterPlan.isRoot(parent) && parent.hasUnion()) {
+      if (masterPlan.isRoot(parent) && parent.isUnionOnly()) {
         return false;
       }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
index a48f0a0..2809a70 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
@@ -363,7 +363,7 @@ public class QueryMasterTask extends CompositeService {
         }
       }
       MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan);
-      queryMasterContext.getGlobalPlanner().build(masterPlan);
+      queryMasterContext.getGlobalPlanner().build(queryContext, masterPlan);
 
       query = new Query(queryTaskContext, queryId, querySubmitTime,
           "", queryTaskContext.getEventHandler(), masterPlan);


[18/24] tajo git commit: TAJO-1618: [Rest API] queries/{queryId} should set default print type.

Posted by ji...@apache.org.
TAJO-1618: [Rest API] queries/{queryId} should set default print type.

Closes #581

Signed-off-by: Jihoon Son <ji...@apache.org>


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

Branch: refs/heads/index_support
Commit: f124b87e6701481a93299bd283b00778da65710a
Parents: 8fd9ae7
Author: DaeMyung Kang <ch...@naver.com>
Authored: Wed May 27 20:33:18 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed May 27 20:33:48 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../tajo/ws/rs/resources/QueryResource.java     |  45 +++----
 .../ws/rs/resources/QueryResultResource.java    |   2 +-
 .../tajo/ws/rs/resources/TestQueryResource.java |  56 ++++++---
 .../rs/resources/TestQueryResultResource.java   | 122 ++++++++++++++-----
 5 files changed, 151 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index da63606..0d4ae04 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1618: [Rest API] queries/{queryId} should set default print type.
+    (Contributed by DaeMyoung Kang, Committed by jihoon)
+
     TAJO-1553: Improve broadcast join planning. (jihoon)
 
     TAJO-1577: Add test cases to verify join plans. (jihoon)

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
index 99609d7..8f45c7b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
@@ -18,28 +18,6 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.QueryId;
@@ -54,13 +32,18 @@ import org.apache.tajo.querymaster.QueryJobEvent;
 import org.apache.tajo.session.InvalidSessionException;
 import org.apache.tajo.session.Session;
 import org.apache.tajo.util.TajoIdUtils;
-import org.apache.tajo.ws.rs.JerseyResourceDelegate;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateContext;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateContextKey;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateUtil;
-import org.apache.tajo.ws.rs.ResourcesUtil;
+import org.apache.tajo.ws.rs.*;
 import org.apache.tajo.ws.rs.requests.SubmitQueryRequest;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Response.Status;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @Path("/databases/{databaseName}/queries")
 public class QueryResource {
 
@@ -87,7 +70,9 @@ public class QueryResource {
   private static final String submitQueryRequestKeyName = "submitQueryRequest";
   private static final String printTypeKeyName = "printType";
   private static final String queryIdKeyName = "queryId";
-  
+
+  private static final String defaultQueryInfoPrintType = "COMPLICATED";
+
   private void initializeContext() {
     context = new JerseyResourceDelegateContext();
     JerseyResourceDelegateContextKey<UriInfo> uriInfoKey =
@@ -311,7 +296,8 @@ public class QueryResource {
   @GET
   @Path("{queryId}")
   @Produces(MediaType.APPLICATION_JSON)
-  public Response getQuery(@PathParam("queryId") String queryId, @QueryParam("print") String printType) {
+  public Response getQuery(@PathParam("queryId") String queryId,
+													 @DefaultValue(defaultQueryInfoPrintType) @QueryParam("print") String printType) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Client sent a get query request.");
     }
@@ -325,6 +311,7 @@ public class QueryResource {
       context.put(queryIdKey, queryId);
       JerseyResourceDelegateContextKey<String> printTypeKey =
           JerseyResourceDelegateContextKey.valueOf(printTypeKeyName, String.class);
+
       context.put(printTypeKey, printType);
       
       response = JerseyResourceDelegateUtil.runJerseyResourceDelegate(

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
index 0f83189..92b95d2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
@@ -260,7 +260,7 @@ public class QueryResultResource {
   public Response getQueryResultSet(@HeaderParam(QueryResource.tajoSessionIdHeaderName) String sessionId,
       @PathParam("cacheId") String cacheId,
       @DefaultValue("-1") @QueryParam("offset") int offset,
-      @DefaultValue("-1") @QueryParam("count") int count) {
+      @DefaultValue("100") @QueryParam("count") int count) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Client sent a get query result set request.");
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
index 47a7bcb..77c0117 100644
--- a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
+++ b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
@@ -18,18 +18,7 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
+import com.google.gson.internal.StringMap;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
@@ -45,7 +34,16 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.gson.internal.StringMap;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
 
 import static org.junit.Assert.*;
 
@@ -106,7 +104,7 @@ public class TestQueryResource extends QueryTestCaseBase {
   public void testGetAllQueries() throws Exception {
     String sessionId = generateNewSessionAndGetId();
     SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
@@ -143,7 +141,7 @@ public class TestQueryResource extends QueryTestCaseBase {
   public void testSubmitQuery() throws Exception {
     String sessionId = generateNewSessionAndGetId();
     SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
@@ -167,4 +165,32 @@ public class TestQueryResource extends QueryTestCaseBase {
     assertNotNull(queryInfo);
     assertEquals(queryId, queryInfo.getQueryIdStr());
   }
+
+  @Test
+  public void testGetQueryInfoWithDefault() throws Exception {
+    String sessionId = generateNewSessionAndGetId();
+    SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
+
+    Response response = restClient.target(queriesURI)
+      .request().header(tajoSessionIdHeaderName, sessionId)
+      .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
+
+    assertNotNull(response);
+    assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+    String locationHeader = response.getHeaderString("Location");
+    assertTrue(locationHeader != null && !locationHeader.isEmpty());
+
+    String queryId = locationHeader.lastIndexOf('/') >= 0?
+      locationHeader.substring(locationHeader.lastIndexOf('/')+1):null;
+
+    assertTrue(queryId != null && !queryId.isEmpty());
+
+    QueryInfo queryInfo = restClient.target(queriesURI)
+      .path("/{queryId}")
+      .resolveTemplate("queryId", queryId)
+      .request().get(new GenericType<QueryInfo>(QueryInfo.class));
+
+    assertNotNull(queryInfo);
+    assertEquals(queryId, queryInfo.getQueryIdStr());
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
index 1b23966..d83eb60 100644
--- a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
+++ b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
@@ -18,25 +18,7 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.net.URI;
-import java.security.MessageDigest;
-import java.util.List;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
 import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.compress.compressors.CompressorInputStream;
-import org.apache.commons.compress.compressors.CompressorStreamFactory;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
@@ -55,6 +37,21 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.InputStream;
+import java.net.URI;
+import java.security.MessageDigest;
+import java.util.List;
+
 import static org.junit.Assert.*;
 
 public class TestQueryResultResource extends QueryTestCaseBase {
@@ -63,14 +60,14 @@ public class TestQueryResultResource extends QueryTestCaseBase {
   private URI sessionsURI;
   private URI queriesURI;
   private Client restClient;
-  
+
   private static final String tajoSessionIdHeaderName = "X-Tajo-Session";
   private static final String tajoDigestHeaderName = "X-Tajo-Digest";
-  
+
   public TestQueryResultResource() {
     super(TajoConstants.DEFAULT_DATABASE_NAME);
   }
-  
+
   @Before
   public void setUp() throws Exception {
     int restPort = testBase.getTestingCluster().getConfiguration().getIntVar(ConfVars.REST_SERVICE_PORT);
@@ -84,45 +81,45 @@ public class TestQueryResultResource extends QueryTestCaseBase {
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)
         .build();
   }
-  
+
   @After
   public void tearDown() throws Exception {
     restClient.close();
   }
-  
+
   private String generateNewSessionAndGetId() throws Exception {
     NewSessionRequest request = new NewSessionRequest();
     request.setUserName("tajo-user");
     request.setDatabaseName(TajoConstants.DEFAULT_DATABASE_NAME);
-    
+
     NewSessionResponse response = restClient.target(sessionsURI)
         .request().post(Entity.entity(request, MediaType.APPLICATION_JSON), NewSessionResponse.class);
-    
+
     assertNotNull(response);
     assertTrue(ResultCode.OK.equals(response.getResultCode()));
     assertTrue(response.getId() != null && !response.getId().isEmpty());
-    
+
     return response.getId();
   }
-  
+
   private URI sendNewQueryResquest(String sessionId, String query) throws Exception {
-    
+
     SubmitQueryRequest request = new SubmitQueryRequest();
     request.setQuery(query);
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(request, MediaType.APPLICATION_JSON));
-    
+
     assertNotNull(response);
     assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
     String locationHeader = response.getHeaderString("Location");
     assertTrue(locationHeader != null && !locationHeader.isEmpty());
-    
+
     URI queryIdURI = new URI(locationHeader);
 
     assertNotNull(queryIdURI);
-    
+
     return queryIdURI;
   }
 
@@ -284,4 +281,65 @@ public class TestQueryResultResource extends QueryTestCaseBase {
       assertTrue(aTuple.getInt4(response.getSchema().getColumnId("l_orderkey")) > 0);
     }
   }
+
+  @Test
+  public void testGetQueryResultSetWithDefaultCount() throws Exception {
+    String sessionId = generateNewSessionAndGetId();
+    URI queryIdURI = sendNewQueryResquest(sessionId, "select * from lineitem");
+    URI queryResultURI = new URI(queryIdURI + "/result");
+
+    GetQueryResultDataResponse response = restClient.target(queryResultURI)
+        .request().header(tajoSessionIdHeaderName, sessionId)
+        .get(new GenericType<GetQueryResultDataResponse>(GetQueryResultDataResponse.class));
+
+    assertNotNull(response);
+    assertNotNull(response.getResultCode());
+    assertEquals(ResultCode.OK, response.getResultCode());
+    assertNotNull(response.getSchema());
+    assertEquals(16, response.getSchema().getRootColumns().size());
+    assertNotNull(response.getResultset());
+    assertTrue(response.getResultset().getId() != 0);
+    assertNotNull(response.getResultset().getLink());
+
+    URI queryResultSetURI = response.getResultset().getLink();
+
+    Response queryResultSetResponse = restClient.target(queryResultSetURI)
+        .request().header(tajoSessionIdHeaderName, sessionId)
+        .get();
+
+    assertNotNull(queryResultSetResponse);
+    String tajoDigest = queryResultSetResponse.getHeaderString(tajoDigestHeaderName);
+    assertTrue(tajoDigest != null && !tajoDigest.isEmpty());
+
+    DataInputStream queryResultSetInputStream =
+        new DataInputStream(new BufferedInputStream(queryResultSetResponse.readEntity(InputStream.class)));
+
+    assertNotNull(queryResultSetInputStream);
+
+    boolean isFinished = false;
+    List<Tuple> tupleList = TUtil.newList();
+    RowStoreUtil.RowStoreDecoder decoder = RowStoreUtil.createDecoder(response.getSchema());
+    MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
+    while (!isFinished) {
+      try {
+        int length = queryResultSetInputStream.readInt();
+        byte[] dataByteArray = new byte[length];
+        int readBytes = queryResultSetInputStream.read(dataByteArray);
+
+        assertEquals(length, readBytes);
+
+        tupleList.add(decoder.toTuple(dataByteArray));
+        messageDigest.update(dataByteArray);
+      } catch (EOFException eof) {
+        isFinished = true;
+      }
+    }
+
+    assertEquals(5, tupleList.size());
+    assertEquals(tajoDigest, Base64.encodeBase64String(messageDigest.digest()));
+
+    for (Tuple aTuple: tupleList) {
+      assertTrue(aTuple.getInt4(response.getSchema().getColumnId("l_orderkey")) > 0);
+    }
+  }
 }


[13/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort.plan
index 38d9b38..b19c33f 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.supplier
+ 2: type=Broadcast, tables=default.partsupp
+ 3: type=Broadcast, tables=default.region
 
-JOIN(14)(INNER)
-  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-   SCAN(0) on default.part
-     => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)
-     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
-     => target list: default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-     => in schema: {(9) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-      SCAN(2) on default.partsupp
-        => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
-        => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
-        => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
-      SCAN(1) on default.supplier
-        => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
-        => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-        => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
-
-JOIN(15)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
-  => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-  => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
-   SCAN(4) on default.region
-     => target list: default.region.r_regionkey (INT4)
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-   SCAN(3) on default.nation
-     => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
      => target list: default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)
      => out schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
      => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+        => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
         => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-        => in schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
+         SCAN(4) on default.region
+           => target list: default.region.r_regionkey (INT4)
+           => out schema: {(1) default.region.r_regionkey (INT4)}
+           => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+         SCAN(3) on default.nation
+           => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+           => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+        => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
         => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-        => in schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+        => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+         SCAN(0) on default.part
+           => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)
+           => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
+           => target list: default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+           => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+           => in schema: {(9) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+            SCAN(2) on default.partsupp
+              => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
+              => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
+              => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+            SCAN(1) on default.supplier
+              => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+              => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+              => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
      => in schema: {(8) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Hash.plan
index 7ba5577..6da36f7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Sort.plan
index 7ba5577..6da36f7 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin1.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Hash.plan
index 1269493..549fe31 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.nation.n_name (TEXT), default.region.r_name (TEXT)}
      => in schema: {(2) default.nation.n_name (TEXT), default.region.r_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Sort.plan
index 1269493..549fe31 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin2.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.nation.n_name (TEXT), default.region.r_name (TEXT)}
      => in schema: {(2) default.nation.n_name (TEXT), default.region.r_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Hash.plan
index 3f1e25d..458abea 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.region.r_name (TEXT), p1 (INT4), p2 (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.region.r_name (TEXT), p1 (INT4), p2 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Sort.plan
index 3f1e25d..458abea 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin3.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.region.r_name (TEXT), p1 (INT4), p2 (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.region.r_name (TEXT), p1 (INT4), p2 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Hash.plan
index 03a12cf..9ca4d41 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Hash.plan
@@ -39,10 +39,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) ?plus (INT4), default.nation.n_name (TEXT), default.region.r_name (TEXT)}
      => in schema: {(3) ?plus (INT4), default.nation.n_name (TEXT), default.region.r_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Sort.plan
index 03a12cf..9ca4d41 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin4.Sort.plan
@@ -39,10 +39,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.nation.n_name (TEXT) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) ?plus (INT4), default.nation.n_name (TEXT), default.region.r_name (TEXT)}
      => in schema: {(3) ?plus (INT4), default.nation.n_name (TEXT), default.region.r_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Hash.plan
index bdb7466..93829fc 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Hash.plan
@@ -27,32 +27,31 @@ SORT(4)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.part
 
-SORT(12)
+SORT(16)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
    JOIN(10)(INNER)
      => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
@@ -78,21 +77,21 @@ SORT(12)
            => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(4)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
-   SCAN(13) on eb_0000000000000_0000_000003
+   SCAN(17) on eb_0000000000000_0000_000005
      => out schema: {(3) default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
      => in schema: {(3) default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Sort.plan
index bdb7466..93829fc 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin5.Sort.plan
@@ -27,32 +27,31 @@ SORT(4)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.part
 
-SORT(12)
+SORT(16)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
    JOIN(10)(INNER)
      => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
@@ -78,21 +77,21 @@ SORT(12)
            => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(4)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc)
-   SCAN(13) on eb_0000000000000_0000_000003
+   SCAN(17) on eb_0000000000000_0000_000005
      => out schema: {(3) default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
      => in schema: {(3) default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Hash.plan
index 79e3827..73d8693 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Hash.plan
@@ -36,33 +36,32 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000009
+   |-eb_0000000000000_0000_000008
+      |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
+3: eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
- 3: type=Broadcast, tables=default.nation
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.supplier
+ 2: type=Broadcast, tables=default.partsupp
 
-SORT(15)
+SORT(21)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(13)(INNER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
@@ -97,21 +96,21 @@ SORT(15)
               => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000008 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000007
 
 SORT(5)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(16) on eb_0000000000000_0000_000003
+   SCAN(22) on eb_0000000000000_0000_000007
      => out schema: {(4) default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
      => in schema: {(4) default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000009 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Sort.plan
index 79e3827..73d8693 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testWhereClauseJoin6.Sort.plan
@@ -36,33 +36,32 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000009
+   |-eb_0000000000000_0000_000008
+      |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
+3: eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000007 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.supplier
- 1: type=Broadcast, tables=default.partsupp
- 2: type=Broadcast, tables=default.part
- 3: type=Broadcast, tables=default.nation
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.supplier
+ 2: type=Broadcast, tables=default.partsupp
 
-SORT(15)
+SORT(21)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(13)(INNER)
      => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
@@ -97,21 +96,21 @@ SORT(15)
               => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000008 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
+[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000007
 
 SORT(5)
   => Sort Keys: default.supplier.s_acctbal (FLOAT8) (asc),default.supplier.s_name (TEXT) (asc),default.part.p_partkey (INT4) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(16) on eb_0000000000000_0000_000003
+   SCAN(22) on eb_0000000000000_0000_000007
      => out schema: {(4) default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
      => in schema: {(4) default.nation.n_name (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000009 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Hash.plan
index 0c134d5..2b7db47 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Hash.plan
@@ -36,100 +36,25 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000003
-            |-eb_0000000000000_0000_000002
-            |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
-7: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.o_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(4) as default.a
-  => Targets: default.a.o_custkey (INT4), default.a.o_orderkey (INT4)
-  => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-  => in  schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4)
-     => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-     => in  schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(2) on default.orders
-        => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
-        => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
-
-SCAN(0) on default.lineitem
-  => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-  => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.o_orderkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-
-JOIN(11)(INNER)
-  => Join Cond: default.lineitem.l_orderkey (INT4) = default.a.o_orderkey (INT4)
-  => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-  => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-  => in schema: {(4) default.a.o_custkey (INT4), default.a.o_orderkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-   SCAN(15) on eb_0000000000000_0000_000002
-     => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-     => in schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-   SCAN(14) on eb_0000000000000_0000_000001
-     => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-     => in schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-SCAN(1) on default.part
-  => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
-  => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.orders
+ 1: type=Broadcast, tables=default.part
+
 SORT(18)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.a.o_custkey (INT4) (asc),default.part.p_name (TEXT) (asc)
    JOIN(12)(INNER)
@@ -137,12 +62,31 @@ SORT(18)
      => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT)
      => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT)}
      => in schema: {(5) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-      SCAN(17) on eb_0000000000000_0000_000004
+      SCAN(1) on default.part
+        => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
         => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-        => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-      SCAN(16) on eb_0000000000000_0000_000003
+        => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+      JOIN(11)(INNER)
+        => Join Cond: default.lineitem.l_orderkey (INT4) = default.a.o_orderkey (INT4)
+        => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
         => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-        => in schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+        => in schema: {(4) default.a.o_custkey (INT4), default.a.o_orderkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+         SCAN(0) on default.lineitem
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+         TABLE_SUBQUERY(4) as default.a
+           => Targets: default.a.o_custkey (INT4), default.a.o_orderkey (INT4)
+           => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
+           => in  schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
+            PROJECTION(3)
+              => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4)
+              => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+              => in  schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+               SCAN(2) on default.orders
+                 => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
+                 => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+                 => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Sort.plan
index 0c134d5..2b7db47 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery.Sort.plan
@@ -36,100 +36,25 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 |-eb_0000000000000_0000_000007
    |-eb_0000000000000_0000_000006
       |-eb_0000000000000_0000_000005
-         |-eb_0000000000000_0000_000004
-         |-eb_0000000000000_0000_000003
-            |-eb_0000000000000_0000_000002
-            |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000001
-2: eb_0000000000000_0000_000002
-3: eb_0000000000000_0000_000003
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000005
-6: eb_0000000000000_0000_000006
-7: eb_0000000000000_0000_000007
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000001 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.o_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(4) as default.a
-  => Targets: default.a.o_custkey (INT4), default.a.o_orderkey (INT4)
-  => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-  => in  schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-   PROJECTION(3)
-     => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4)
-     => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-     => in  schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(2) on default.orders
-        => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
-        => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000002 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
-
-SCAN(0) on default.lineitem
-  => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-  => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.o_orderkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-
-JOIN(11)(INNER)
-  => Join Cond: default.lineitem.l_orderkey (INT4) = default.a.o_orderkey (INT4)
-  => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-  => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-  => in schema: {(4) default.a.o_custkey (INT4), default.a.o_orderkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-   SCAN(15) on eb_0000000000000_0000_000002
-     => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-     => in schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-   SCAN(14) on eb_0000000000000_0000_000001
-     => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-     => in schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-SCAN(1) on default.part
-  => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
-  => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
 [q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT), num=32)
 
+[Enforcers]
+ 0: type=Broadcast, tables=default.orders
+ 1: type=Broadcast, tables=default.part
+
 SORT(18)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.a.o_custkey (INT4) (asc),default.part.p_name (TEXT) (asc)
    JOIN(12)(INNER)
@@ -137,12 +62,31 @@ SORT(18)
      => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT)
      => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.part.p_name (TEXT)}
      => in schema: {(5) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-      SCAN(17) on eb_0000000000000_0000_000004
+      SCAN(1) on default.part
+        => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
         => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-        => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-      SCAN(16) on eb_0000000000000_0000_000003
+        => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+      JOIN(11)(INNER)
+        => Join Cond: default.lineitem.l_orderkey (INT4) = default.a.o_orderkey (INT4)
+        => target list: default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
         => out schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-        => in schema: {(3) default.a.o_custkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+        => in schema: {(4) default.a.o_custkey (INT4), default.a.o_orderkey (INT4), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+         SCAN(0) on default.lineitem
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+         TABLE_SUBQUERY(4) as default.a
+           => Targets: default.a.o_custkey (INT4), default.a.o_orderkey (INT4)
+           => out schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
+           => in  schema: {(2) default.a.o_custkey (INT4), default.a.o_orderkey (INT4)}
+            PROJECTION(3)
+              => Targets: default.orders.o_orderkey (INT4), default.orders.o_custkey (INT4)
+              => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+              => in  schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+               SCAN(2) on default.orders
+                 => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
+                 => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+                 => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [ROOT]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash.plan
index 7cde4c5..839afaf 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash.plan
@@ -73,22 +73,14 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012)
 |-eb_0000000000000_0000_000012
    |-eb_0000000000000_0000_000011
       |-eb_0000000000000_0000_000010
-         |-eb_0000000000000_0000_000009
-            |-eb_0000000000000_0000_000008
-            |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000004
-            |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
 1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000007
-3: eb_0000000000000_0000_000008
-4: eb_0000000000000_0000_000004
-5: eb_0000000000000_0000_000009
-6: eb_0000000000000_0000_000010
-7: eb_0000000000000_0000_000011
-8: eb_0000000000000_0000_000012
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
+4: eb_0000000000000_0000_000012
 -------------------------------------------------------------------------------
 
 =======================================================
@@ -96,13 +88,12 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
+[q_0000000000000_0000] 3 => 10 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.part
+ 0: type=Broadcast, tables=default.part
 
-GROUP_BY(25)(l_orderkey)
+GROUP_BY(27)(l_orderkey)
   => exprs: (avg(default.e.l_quantity (FLOAT8)))
   => target list: default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)
   => out schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
@@ -130,113 +121,21 @@ GROUP_BY(25)(l_orderkey)
               => in schema: {(16) default.a.l_comment (TEXT), default.a.l_commitdate (TEXT), default.a.l_discount (FLOAT8), default.a.l_extendedprice (FLOAT8), default.a.l_linenumber (INT4), default.a.l_linestatus (TEXT), default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8), default.a.l_receiptdate (TEXT), default.a.l_returnflag (TEXT), default.a.l_shipdate (TEXT), default.a.l_shipinstruct (TEXT), default.a.l_shipmode (TEXT), default.a.l_suppkey (INT4), default.a.l_tax (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 10 (type=HASH_SHUFFLE, key=default.f.l_orderkey (INT4), num=32)
-
-TABLE_SUBQUERY(14) as default.f
-  => Targets: default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)
-  => out schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-  => in  schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-   PROJECTION(13)
-     => Targets: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
-     => out schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-     => in  schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-      GROUP_BY(12)(l_orderkey)
-        => exprs: (avg(?avg_11 (PROTOBUF)))
-        => target list: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
-        => out schema:{(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
-        => in schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-         SCAN(26) on eb_0000000000000_0000_000003
-           => out schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-           => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 9 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.d
- 1: type=Broadcast, tables=default.part
-
-TABLE_SUBQUERY(4) as default.b
-  => Targets: default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)
-  => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-  => in  schema: {(2) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8)}
-   PROJECTION(10)
-     => Targets: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
-     => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-     => in  schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-      JOIN(20)(INNER)
-        => Join Cond: default.d.l_partkey (INT4) = default.part.p_partkey (INT4)
-        => target list: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
-        => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
-        => in schema: {(4) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.part.p_partkey (INT4)}
-         SCAN(8) on default.part
-           => target list: default.part.p_partkey (INT4)
-           => out schema: {(1) default.part.p_partkey (INT4)}
-           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-         SCAN(7) on default.lineitem as d
-           => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
-           => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
-           => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000008 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-SCAN(5) on default.orders as c
-  => filter: default.c.o_orderkey (INT4) > 0
-  => target list: default.c.o_orderkey (INT4)
-  => out schema: {(1) default.c.o_orderkey (INT4)}
-  => in schema: {(9) default.c.o_clerk (TEXT), default.c.o_comment (TEXT), default.c.o_custkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4), default.c.o_orderpriority (TEXT), default.c.o_orderstatus (TEXT), default.c.o_shippriority (INT4), default.c.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000009 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 7 => 9 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32)
-[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
-
-JOIN(22)(INNER)
-  => Join Cond: default.c.o_orderkey (INT4) = default.b.l_orderkey (INT4)
-  => target list: default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)
-  => out schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-  => in schema: {(3) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-   SCAN(28) on eb_0000000000000_0000_000008
-     => out schema: {(1) default.c.o_orderkey (INT4)}
-     => in schema: {(1) default.c.o_orderkey (INT4)}
-   SCAN(27) on eb_0000000000000_0000_000007
-     => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-     => in schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000010 [INTERMEDIATE]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 4 => 10 (type=HASH_SHUFFLE, key=default.f.l_orderkey (INT4), num=32)
-[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.c.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 3 => 10 (type=HASH_SHUFFLE, key=default.e.l_orderkey (INT4), num=32)
 
 [Outgoing]
 [q_0000000000000_0000] 10 => 11 (type=HASH_SHUFFLE, key=, num=1)
 
-GROUP_BY(31)()
+[Enforcers]
+ 0: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.c
+ 2: type=Broadcast, tables=default.d
+
+GROUP_BY(35)()
   => exprs: (sum(default.b.l_quantity (FLOAT8)))
   => target list: ?sum_12 (FLOAT8)
   => out schema:{(1) ?sum_12 (FLOAT8)}
@@ -248,12 +147,53 @@ GROUP_BY(31)()
         => target list: default.b.l_quantity (FLOAT8), default.f.avg_quantity (FLOAT8)
         => out schema: {(2) default.b.l_quantity (FLOAT8), default.f.avg_quantity (FLOAT8)}
         => in schema: {(4) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4), default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-         SCAN(30) on eb_0000000000000_0000_000009
+         JOIN(22)(INNER)
+           => Join Cond: default.c.o_orderkey (INT4) = default.b.l_orderkey (INT4)
+           => target list: default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)
            => out schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-           => in schema: {(2) default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
-         SCAN(29) on eb_0000000000000_0000_000004
+           => in schema: {(3) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8), default.c.o_orderkey (INT4)}
+            SCAN(5) on default.orders as c
+              => filter: default.c.o_orderkey (INT4) > 0
+              => target list: default.c.o_orderkey (INT4)
+              => out schema: {(1) default.c.o_orderkey (INT4)}
+              => in schema: {(9) default.c.o_clerk (TEXT), default.c.o_comment (TEXT), default.c.o_custkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4), default.c.o_orderpriority (TEXT), default.c.o_orderstatus (TEXT), default.c.o_shippriority (INT4), default.c.o_totalprice (FLOAT8)}
+            TABLE_SUBQUERY(4) as default.b
+              => Targets: default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)
+              => out schema: {(2) default.b.l_quantity (FLOAT8), default.b.l_orderkey (INT4)}
+              => in  schema: {(2) default.b.l_orderkey (INT4), default.b.l_quantity (FLOAT8)}
+               PROJECTION(10)
+                 => Targets: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
+                 => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                 => in  schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                  JOIN(20)(INNER)
+                    => Join Cond: default.d.l_partkey (INT4) = default.part.p_partkey (INT4)
+                    => target list: default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)
+                    => out schema: {(2) default.d.l_orderkey (INT4), default.d.l_quantity (FLOAT8)}
+                    => in schema: {(4) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.part.p_partkey (INT4)}
+                     SCAN(8) on default.part
+                       => target list: default.part.p_partkey (INT4)
+                       => out schema: {(1) default.part.p_partkey (INT4)}
+                       => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+                     SCAN(7) on default.lineitem as d
+                       => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
+                       => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
+                       => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
+         TABLE_SUBQUERY(14) as default.f
+           => Targets: default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)
            => out schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
-           => in schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
+           => in  schema: {(2) default.f.avg_quantity (FLOAT8), default.f.l_orderkey (INT4)}
+            PROJECTION(13)
+              => Targets: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
+              => out schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+              => in  schema: {(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+               GROUP_BY(12)(l_orderkey)
+                 => exprs: (avg(?avg_11 (PROTOBUF)))
+                 => target list: default.e.l_orderkey (INT4), avg_quantity (FLOAT8)
+                 => out schema:{(2) avg_quantity (FLOAT8), default.e.l_orderkey (INT4)}
+                 => in schema:{(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
+                  SCAN(28) on eb_0000000000000_0000_000003
+                    => out schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
+                    => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000011 [ROOT]
@@ -267,7 +207,7 @@ GROUP_BY(18)()
   => target list: ?sum (FLOAT8)
   => out schema:{(1) ?sum (FLOAT8)}
   => in schema:{(1) ?sum_12 (FLOAT8)}
-   SCAN(32) on eb_0000000000000_0000_000010
+   SCAN(36) on eb_0000000000000_0000_000010
      => out schema: {(1) ?sum_12 (FLOAT8)}
      => in schema: {(1) ?sum_12 (FLOAT8)}
 


[05/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.plan b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.plan
new file mode 100644
index 0000000..9d713aa
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.plan
@@ -0,0 +1,80 @@
+explain
+-------------------------------
+TABLE_SUBQUERY(7) as default.result
+  => Targets: default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)
+  => out schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+  => in  schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+   UNION(6)
+      PROJECTION(5)
+        => Targets: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), bbc as query
+        => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), query (TEXT)}
+        => in  schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+         SCAN(3) on default.lineitem
+           => filter: default.lineitem.l_orderkey (INT4) = 1
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+      PROJECTION(2)
+        => Targets: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), abc as query
+        => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), query (TEXT)}
+        => in  schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+         SCAN(0) on default.lineitem
+           => filter: default.lineitem.l_orderkey (INT4) = 1
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000003)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000003
+   |-eb_0000000000000_0000_000002
+   |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [ROOT]
+=======================================================
+
+TABLE_SUBQUERY(11) as default.result
+  => Targets: default.result.l_orderkey (INT4) as default.result.l_orderkey, default.result.l_partkey (INT4) as default.result.l_partkey, default.result.query (TEXT) as default.result.query
+  => out schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+  => in  schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+   PROJECTION(2)
+     => Targets: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), abc as query
+     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), query (TEXT)}
+     => in  schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+      SCAN(0) on default.lineitem
+        => filter: default.lineitem.l_orderkey (INT4) = 1
+        => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+        => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [ROOT]
+=======================================================
+
+TABLE_SUBQUERY(12) as default.result
+  => Targets: default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)
+  => out schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+  => in  schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.query (TEXT)}
+   PROJECTION(5)
+     => Targets: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), bbc as query
+     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), query (TEXT)}
+     => in  schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+      SCAN(3) on default.lineitem
+        => filter: default.lineitem.l_orderkey (INT4) = 1
+        => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+        => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.result b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.result
new file mode 100644
index 0000000..cf07e63
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion1.result
@@ -0,0 +1,6 @@
+l_orderkey,l_partkey,query
+-------------------------------
+1,1,abc
+1,1,abc
+1,1,bbc
+1,1,bbc

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.plan b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.plan
new file mode 100644
index 0000000..2e2280d
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.plan
@@ -0,0 +1,116 @@
+explain
+-------------------------------
+TABLE_SUBQUERY(8) as default.result
+  => Targets: default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)
+  => out schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)}
+  => in  schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)}
+   JOIN(11)(INNER)
+     => Join Cond: default.res1.l_partkey (INT4) = default.res2.p_partkey (INT4)
+     => target list: default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)
+     => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+     => in schema: {(4) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT), default.res2.p_partkey (INT4)}
+      TABLE_SUBQUERY(5) as default.res2
+        => Targets: default.res2.p_partkey (INT4)
+        => out schema: {(1) default.res2.p_partkey (INT4)}
+        => in  schema: {(9) default.res2.p_brand (TEXT), default.res2.p_comment (TEXT), default.res2.p_container (TEXT), default.res2.p_mfgr (TEXT), default.res2.p_name (TEXT), default.res2.p_partkey (INT4), default.res2.p_retailprice (FLOAT8), default.res2.p_size (INT4), default.res2.p_type (TEXT)}
+         SCAN(3) on default.part
+           => target list: default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)
+           => out schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+      TABLE_SUBQUERY(2) as default.res1
+        => Targets: default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)
+        => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+        => in  schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+         SCAN(0) on default.lineitem
+           => target list: CASE WHEN default.lineitem.l_partkey (INT4) IS NOT NULL THEN  WHEN default.lineitem.l_orderkey (INT4) = 1 THEN 1 ELSE 2 END as url, default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+           => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), url (TEXT)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000004
+   |-eb_0000000000000_0000_000003
+      |-eb_0000000000000_0000_000002
+      |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.res1.l_partkey (INT4), num=32)
+
+TABLE_SUBQUERY(2) as default.res1
+  => Targets: default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)
+  => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+  => in  schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+   PROJECTION(1)
+     => Targets: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), url (TEXT)
+     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), url (TEXT)}
+     => in  schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), url (TEXT)}
+      SCAN(0) on default.lineitem
+        => target list: CASE WHEN default.lineitem.l_partkey (INT4) IS NOT NULL THEN  WHEN default.lineitem.l_orderkey (INT4) = 1 THEN 1 ELSE 2 END as url, default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+        => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), url (TEXT)}
+        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.res2.p_partkey (INT4), num=32)
+
+TABLE_SUBQUERY(5) as default.res2
+  => Targets: default.res2.p_partkey (INT4)
+  => out schema: {(1) default.res2.p_partkey (INT4)}
+  => in  schema: {(9) default.res2.p_brand (TEXT), default.res2.p_comment (TEXT), default.res2.p_container (TEXT), default.res2.p_mfgr (TEXT), default.res2.p_name (TEXT), default.res2.p_partkey (INT4), default.res2.p_retailprice (FLOAT8), default.res2.p_size (INT4), default.res2.p_type (TEXT)}
+   PROJECTION(4)
+     => Targets: default.part.p_partkey (INT4), default.part.p_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_brand (TEXT), default.part.p_type (TEXT), default.part.p_size (INT4), default.part.p_container (TEXT), default.part.p_retailprice (FLOAT8), default.part.p_comment (TEXT)
+     => out schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+     => in  schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+      SCAN(3) on default.part
+        => target list: default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)
+        => out schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+        => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.res1.l_partkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.res2.p_partkey (INT4), num=32)
+
+TABLE_SUBQUERY(8) as default.result
+  => Targets: default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)
+  => out schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)}
+  => in  schema: {(3) default.result.l_orderkey (INT4), default.result.l_partkey (INT4), default.result.url (TEXT)}
+   PROJECTION(7)
+     => Targets: default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)
+     => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+     => in  schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+      JOIN(11)(INNER)
+        => Join Cond: default.res1.l_partkey (INT4) = default.res2.p_partkey (INT4)
+        => target list: default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)
+        => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+        => in schema: {(4) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT), default.res2.p_partkey (INT4)}
+         SCAN(14) on eb_0000000000000_0000_000002
+           => out schema: {(1) default.res2.p_partkey (INT4)}
+           => in schema: {(1) default.res2.p_partkey (INT4)}
+         SCAN(13) on eb_0000000000000_0000_000001
+           => out schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+           => in schema: {(3) default.res1.l_orderkey (INT4), default.res1.l_partkey (INT4), default.res1.url (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.result b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.result
new file mode 100644
index 0000000..da92d8c
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestUnionQuery/testComplexUnion2.result
@@ -0,0 +1,7 @@
+l_orderkey,l_partkey,url
+-------------------------------
+1,1,
+1,1,
+2,2,
+3,2,
+3,3,

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
index 33d6565..1c29a6d 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
@@ -33,11 +33,12 @@ import org.apache.tajo.util.TUtil;
 import java.io.IOException;
 
 public class AggregationFunctionCallEval extends FunctionEval implements Cloneable {
-  @Expose boolean intermediatePhase = false;
-  @Expose boolean finalPhase = true;
-  @Expose String alias;
 
-//  protected AggFunction instance;
+  // Both firstPhase and lastPhase flags should be true before global planning.
+  @Expose private boolean firstPhase = true;
+  @Expose private boolean lastPhase = true;
+  @Expose private String alias;
+
   @Expose protected FunctionInvokeContext invokeContext;
   protected transient AggFunctionInvoke functionInvoke;
 
@@ -66,8 +67,8 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
     try {
       if (evalContext != null && evalContext.hasScriptEngine(this)) {
         this.invokeContext.setScriptEngine(evalContext.getScriptEngine(this));
-        this.invokeContext.getScriptEngine().setIntermediatePhase(intermediatePhase);
-        this.invokeContext.getScriptEngine().setFinalPhase(finalPhase);
+        this.invokeContext.getScriptEngine().setFirstPhase(firstPhase);
+        this.invokeContext.getScriptEngine().setLastPhase(lastPhase);
       }
       this.functionInvoke.init(invokeContext);
     } catch (IOException e) {
@@ -85,7 +86,7 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
   }
 
   protected void mergeParam(FunctionContext context, Tuple params) {
-    if (!intermediatePhase && !finalPhase) {
+    if (firstPhase) {
       // firstPhase
       functionInvoke.eval(context, params);
     } else {
@@ -102,7 +103,7 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
     if (!isBound) {
       throw new IllegalStateException("bind() must be called before terminate()");
     }
-    if (!finalPhase) {
+    if (!lastPhase) {
       return functionInvoke.getPartialResult(context);
     } else {
       return functionInvoke.terminate(context);
@@ -111,7 +112,7 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
 
   @Override
   public DataType getValueType() {
-    if (!finalPhase) {
+    if (!lastPhase) {
       return functionInvoke.getPartialResultType();
     } else {
       return funcDesc.getReturnType();
@@ -129,8 +130,8 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
   public Object clone() throws CloneNotSupportedException {
     AggregationFunctionCallEval clone = (AggregationFunctionCallEval)super.clone();
 
-    clone.finalPhase = finalPhase;
-    clone.intermediatePhase = intermediatePhase;
+    clone.lastPhase = lastPhase;
+    clone.firstPhase = firstPhase;
     clone.alias = alias;
     clone.invokeContext = (FunctionInvokeContext) invokeContext.clone();
     if (functionInvoke != null) {
@@ -140,35 +141,31 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
     return clone;
   }
 
-  public boolean isIntermediatePhase() {
-    return intermediatePhase;
-  }
-
-  public void setIntermediatePhase(boolean flag) {
-    this.intermediatePhase = flag;
+  public boolean isFirstPhase() {
+    return firstPhase;
   }
 
-  public void setFinalPhase(boolean flag) {
-    this.finalPhase = flag;
+  public boolean isLastPhase() {
+    return lastPhase;
   }
 
-  public boolean isFinalPhase() {
-    return finalPhase;
+  public void setFirstPhase() {
+    this.firstPhase = true;
+    this.lastPhase = false;
   }
 
-  public void setFirstPhase() {
-    this.finalPhase = false;
-    this.intermediatePhase = false;
+  public void setLastPhase() {
+    this.firstPhase = false;
+    this.lastPhase = true;
   }
 
-  public void setFinalPhase() {
-    this.finalPhase = true;
-    this.intermediatePhase = false;
+  public void setFirstAndLastPhase() {
+    this.lastPhase = this.firstPhase = true;
   }
 
   public void setIntermediatePhase() {
-    this.finalPhase = false;
-    this.intermediatePhase = true;
+    this.firstPhase = false;
+    this.lastPhase = false;
   }
 
   @Override
@@ -176,8 +173,8 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
     final int prime = 31;
     int result = super.hashCode();
     result = prime * result + ((alias == null) ? 0 : alias.hashCode());
-    result = prime * result + (finalPhase ? 1231 : 1237);
-    result = prime * result + (intermediatePhase ? 1231 : 1237);
+    result = prime * result + (lastPhase ? 1231 : 1237);
+    result = prime * result + (firstPhase ? 1249 : 1259);
     return result;
   }
 
@@ -187,8 +184,8 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
       AggregationFunctionCallEval other = (AggregationFunctionCallEval) obj;
 
       boolean eq = super.equals(other);
-      eq &= intermediatePhase == other.intermediatePhase;
-      eq &= finalPhase == other.finalPhase;
+      eq &= firstPhase == other.firstPhase;
+      eq &= lastPhase == other.lastPhase;
       eq &= TUtil.checkEquals(alias, other.alias);
       return eq;
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
index 8980de1..0066c39 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
@@ -286,14 +286,14 @@ public class PythonScriptEngine extends TajoScriptEngine {
     setSchema();
   }
 
-  public PythonScriptEngine(FunctionDesc functionDesc, boolean intermediatePhase, boolean finalPhase) {
+  public PythonScriptEngine(FunctionDesc functionDesc, boolean firstPhase, boolean lastPhase) {
     if (!functionDesc.getInvocation().hasPython() && !functionDesc.getInvocation().hasPythonAggregation()) {
       throw new IllegalStateException("Function type must be 'python'");
     }
     functionSignature = functionDesc.getSignature();
     invocationDesc = functionDesc.getInvocation().getPython();
-    this.intermediatePhase = intermediatePhase;
-    this.finalPhase = finalPhase;
+    this.firstPhase = firstPhase;
+    this.lastPhase = lastPhase;
     setSchema();
   }
 
@@ -381,7 +381,7 @@ public class PythonScriptEngine extends TajoScriptEngine {
       outSchema = new Schema(new Column[]{new Column("out", functionSignature.getReturnType())});
     } else {
       // UDAF
-      if (!intermediatePhase && !finalPhase) {
+      if (firstPhase) {
         // first phase
         TajoDataTypes.DataType[] paramTypes = functionSignature.getParamTypes();
         inSchema = new Schema();
@@ -389,11 +389,12 @@ public class PythonScriptEngine extends TajoScriptEngine {
           inSchema.addColumn(new Column("in_" + i, paramTypes[i]));
         }
         outSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
-      } else if (intermediatePhase) {
-        inSchema = outSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
-      } else if (finalPhase) {
+      } else if (lastPhase) {
         inSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
         outSchema = new Schema(new Column[]{new Column("out", functionSignature.getReturnType())});
+      } else {
+        // intermediate phase
+        inSchema = outSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
       }
     }
     projectionCols = new int[outSchema.size()];
@@ -494,7 +495,7 @@ public class PythonScriptEngine extends TajoScriptEngine {
   public void callAggFunc(FunctionContext functionContext, Tuple input) {
 
     String methodName;
-    if (!intermediatePhase && !finalPhase) {
+    if (firstPhase) {
       // eval
       methodName = "eval";
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/TajoScriptEngine.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/TajoScriptEngine.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/TajoScriptEngine.java
index c233fb8..8e35955 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/TajoScriptEngine.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/TajoScriptEngine.java
@@ -19,7 +19,6 @@
 package org.apache.tajo.plan.function.python;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.plan.function.FunctionContext;
 import org.apache.tajo.storage.Tuple;
@@ -32,8 +31,8 @@ import java.net.URI;
  */
 public abstract class TajoScriptEngine {
 
-  protected boolean intermediatePhase = false;
-  protected boolean finalPhase = false;
+  protected boolean firstPhase = false;
+  protected boolean lastPhase = false;
 
   /**
    * Open a stream load a script locally or in the classpath
@@ -92,11 +91,11 @@ public abstract class TajoScriptEngine {
 
   public abstract Datum getFinalResult(FunctionContext functionContext);
 
-  public void setIntermediatePhase(boolean flag) {
-    this.intermediatePhase = flag;
+  public void setFirstPhase(boolean flag) {
+    this.firstPhase = flag;
   }
 
-  public void setFinalPhase(boolean flag) {
-    this.finalPhase = flag;
+  public void setLastPhase(boolean flag) {
+    this.lastPhase = flag;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
index 0976ab5..0ab62d5 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
@@ -36,6 +36,11 @@ public class CreateTableNode extends StoreTableNode implements Cloneable {
     super(pid, NodeType.CREATE_TABLE);
   }
 
+  @Override
+  public int childNum() {
+    return child == null ? 0 : 1;
+  }
+
   public void setTableSchema(Schema schema) {
     this.schema = schema;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
index bad8704..a0d8125 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
@@ -22,28 +22,21 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
-
 import org.apache.tajo.algebra.JoinType;
 import org.apache.tajo.plan.PlanString;
-import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.plan.Target;
 import org.apache.tajo.plan.expr.BinaryEval;
 import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.util.TUtil;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 public class JoinNode extends BinaryNode implements Projectable, Cloneable {
   @Expose private JoinType joinType;
   @Expose private EvalNode joinQual;
   @Expose private Target[] targets;
 
-  // transition states
-  private boolean candidateBroadcast = false;
-  private List<LogicalNode> broadcastCandidateTargets = new ArrayList<LogicalNode>();
-
   public JoinNode(int pid) {
     super(pid, NodeType.JOIN);
   }
@@ -54,18 +47,6 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
     setRightChild(right);
   }
 
-  public boolean isCandidateBroadcast() {
-    return candidateBroadcast;
-  }
-
-  public void setCandidateBroadcast(boolean candidateBroadcast) {
-    this.candidateBroadcast = candidateBroadcast;
-  }
-
-  public List<LogicalNode> getBroadcastCandidateTargets() {
-    return broadcastCandidateTargets;
-  }
-
   public JoinType getJoinType() {
     return this.joinType;
   }
@@ -131,7 +112,6 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
   public int hashCode() {
     final int prime = 31;
     int result = 1;
-    result = prime * result + (candidateBroadcast ? 1231 : 1237);
     result = prime * result + ((joinQual == null) ? 0 : joinQual.hashCode());
     result = prime * result + ((joinType == null) ? 0 : joinType.hashCode());
     result = prime * result + Arrays.hashCode(targets);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
index cc54a22..587baa5 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
@@ -245,6 +245,7 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo
     Set<EvalNode> nonPushableQuals = TUtil.newHashSet();
     // TODO: non-equi theta join quals must not be pushed until TAJO-742 is resolved.
     nonPushableQuals.addAll(extractNonEquiThetaJoinQuals(wherePredicates, block, joinNode));
+    nonPushableQuals.addAll(extractNonEquiThetaJoinQuals(onPredicates, block, joinNode));
 
     // for outer joins
     if (PlannerUtil.isOuterJoin(joinNode.getJoinType())) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
index 80c18cc..72373cf 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
@@ -34,7 +34,6 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.*;
 import org.apache.tajo.exception.InternalException;
 import org.apache.tajo.plan.expr.*;
-import org.apache.tajo.plan.function.AggFunction;
 import org.apache.tajo.plan.function.python.PythonScriptEngine;
 import org.apache.tajo.plan.logical.WindowSpec;
 import org.apache.tajo.plan.serder.PlanProto.WinFunctionEvalSpec;
@@ -191,8 +190,15 @@ public class EvalNodeDeserializer {
                   new AggregationFunctionCallEval(new FunctionDesc(funcProto.getFuncion()), params);
 
               PlanProto.AggFunctionEvalSpec aggFunctionProto = protoNode.getAggFunction();
-              aggFunc.setIntermediatePhase(aggFunctionProto.getIntermediatePhase());
-              aggFunc.setFinalPhase(aggFunctionProto.getFinalPhase());
+              if (aggFunctionProto.getFirstPhase() && aggFunctionProto.getLastPhase()) {
+                aggFunc.setFirstAndLastPhase();
+              } else if (aggFunctionProto.getFirstPhase()) {
+                aggFunc.setFirstPhase();
+              } else if (aggFunctionProto.getLastPhase()) {
+                aggFunc.setLastPhase();
+              } else {
+                aggFunc.setIntermediatePhase();
+              }
               if (aggFunctionProto.hasAlias()) {
                 aggFunc.setAlias(aggFunctionProto.getAlias());
               }
@@ -200,7 +206,7 @@ public class EvalNodeDeserializer {
 
               if (evalContext != null && funcDesc.getInvocation().hasPythonAggregation()) {
                 evalContext.addScriptEngine(current, new PythonScriptEngine(funcDesc,
-                    aggFunc.isIntermediatePhase(), aggFunc.isFinalPhase()));
+                    aggFunc.isFirstPhase()  , aggFunc.isLastPhase()));
               }
 
             } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
index e47d620..a03b637 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
@@ -280,8 +280,8 @@ public class EvalNodeSerializer
       AggregationFunctionCallEval aggFunc = (AggregationFunctionCallEval) function;
 
       PlanProto.AggFunctionEvalSpec.Builder aggFunctionEvalBuilder = PlanProto.AggFunctionEvalSpec.newBuilder();
-      aggFunctionEvalBuilder.setIntermediatePhase(aggFunc.isIntermediatePhase());
-      aggFunctionEvalBuilder.setFinalPhase(aggFunc.isFinalPhase());
+      aggFunctionEvalBuilder.setFirstPhase(aggFunc.isFirstPhase());
+      aggFunctionEvalBuilder.setLastPhase(aggFunc.isLastPhase());
       if (aggFunc.hasAlias()) {
         aggFunctionEvalBuilder.setAlias(aggFunc.getAlias());
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
index 84991bb..694e81c 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
@@ -43,11 +43,6 @@ import java.util.*;
  * It deserializes a list of serialized logical nodes into a logical node tree.
  */
 public class LogicalNodeDeserializer {
-  private static final LogicalNodeDeserializer instance;
-
-  static {
-    instance = new LogicalNodeDeserializer();
-  }
 
   /**
    * Deserialize a list of nodes into a logical node tree.

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
index 60171de..88d831e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
@@ -76,11 +76,11 @@ public class LogicalNodeSerializer extends BasicLogicalPlanVisitor<LogicalNodeSe
 
   private static PlanProto.LogicalNode.Builder createNodeBuilder(SerializeContext context, LogicalNode node) {
     int selfId;
-    if (context.idMap.containsKey(node)) {
-      selfId = context.idMap.get(node);
+    if (context.idMap.containsKey(node.getPID())) {
+      selfId = context.idMap.get(node.getPID());
     } else {
       selfId = context.seqId++;
-      context.idMap.put(node, selfId);
+      context.idMap.put(node.getPID(), selfId);
     }
 
     PlanProto.LogicalNode.Builder nodeBuilder = PlanProto.LogicalNode.newBuilder();
@@ -100,7 +100,7 @@ public class LogicalNodeSerializer extends BasicLogicalPlanVisitor<LogicalNodeSe
 
   public static class SerializeContext {
     private int seqId = 0;
-    private Map<LogicalNode, Integer> idMap = Maps.newHashMap();
+    private Map<Integer, Integer> idMap = Maps.newHashMap(); // map for PID and visit sequence
     private LogicalNodeTree.Builder treeBuilder = LogicalNodeTree.newBuilder();
   }
 
@@ -485,7 +485,6 @@ public class LogicalNodeSerializer extends BasicLogicalPlanVisitor<LogicalNodeSe
   public LogicalNode visitCreateTable(SerializeContext context, LogicalPlan plan, LogicalPlan.QueryBlock block,
                                       CreateTableNode node, Stack<LogicalNode> stack) throws PlanningException {
     super.visitCreateTable(context, plan, block, node, stack);
-
     int [] childIds = registerGetChildIds(context, node);
 
     PlanProto.PersistentStoreNode.Builder persistentStoreBuilder = buildPersistentStoreBuilder(node, childIds);
@@ -629,7 +628,10 @@ public class LogicalNodeSerializer extends BasicLogicalPlanVisitor<LogicalNodeSe
   private static PlanProto.PersistentStoreNode.Builder buildPersistentStoreBuilder(PersistentStoreNode node,
                                                                                    int [] childIds) {
     PlanProto.PersistentStoreNode.Builder persistentStoreBuilder = PlanProto.PersistentStoreNode.newBuilder();
-    persistentStoreBuilder.setChildSeq(childIds[0]);
+    if (childIds.length > 0) {
+      // Simple create table may not have any children. This should be improved at TAJO-1589.
+      persistentStoreBuilder.setChildSeq(childIds[0]);
+    }
     persistentStoreBuilder.setStorageType(node.getStorageType());
     if (node.hasOptions()) {
       persistentStoreBuilder.setTableProperties(node.getOptions().getProto());
@@ -719,8 +721,8 @@ public class LogicalNodeSerializer extends BasicLogicalPlanVisitor<LogicalNodeSe
   private int [] registerGetChildIds(SerializeContext context, LogicalNode node) {
     int [] childIds = new int[node.childNum()];
     for (int i = 0; i < node.childNum(); i++) {
-      if (context.idMap.containsKey(node.getChild(i))) {
-        childIds[i] = context.idMap.get(node.getChild(i));
+      if (node.getChild(i) != null && context.idMap.containsKey(node.getChild(i).getPID())) {
+        childIds[i] = context.idMap.get(node.getChild(i).getPID());
       } else {
         childIds[i] = context.seqId++;
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-plan/src/main/proto/Plan.proto
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/proto/Plan.proto b/tajo-plan/src/main/proto/Plan.proto
index e8172ba..77a21b7 100644
--- a/tajo-plan/src/main/proto/Plan.proto
+++ b/tajo-plan/src/main/proto/Plan.proto
@@ -216,17 +216,17 @@ message PartitionTableScanSpec {
 }
 
 message PersistentStoreNode {
-  required int32 childSeq = 1;
+  optional int32 childSeq = 1; // CreateTableNode may not have any children. This should be improved at TAJO-1589.
   required string storageType = 2;
   required KeyValueSetProto tableProperties = 3;
 }
 
-message StoreTableNodeSpec { // required PersistentStoreSpec
+message StoreTableNodeSpec { // required PersistentStoreNode
   optional string tableName = 1; // 'INSERT INTO LOCATION' does not require 'table name'.
   optional PartitionMethodProto partitionMethod = 2;
 }
 
-message InsertNodeSpec { // required PersistentStoreSpec and StoreTableSpec
+message InsertNodeSpec { // required PersistentStoreNode and StoreTableSpec
   required bool overwrite = 1;
   required SchemaProto tableSchema = 2;
   optional SchemaProto targetSchema = 4;
@@ -234,7 +234,7 @@ message InsertNodeSpec { // required PersistentStoreSpec and StoreTableSpec
   optional string path = 5;
 }
 
-message CreateTableNodeSpec { // required PersistentStoreSpec and StoreTableNodeSpec
+message CreateTableNodeSpec { // required PersistentStoreNode and StoreTableNodeSpec
   required SchemaProto schema = 1;
   required bool external = 2;
   required bool ifNotExists = 3;
@@ -424,8 +424,8 @@ message FunctionEval {
 }
 
 message AggFunctionEvalSpec { // requires FunctionEval
-  required bool intermediatePhase = 1;
-  required bool finalPhase = 2;
+  required bool firstPhase = 1;
+  required bool lastPhase = 2;
   optional string alias = 3;
 }
 


[23/24] tajo git commit: TAJO-1624: Add managed table or external description in Table management section.

Posted by ji...@apache.org.
TAJO-1624: Add managed table or external description in Table management section.

Closes #588


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

Branch: refs/heads/index_support
Commit: 03294e1453586f64fe96458461f149851b443b42
Parents: 39fdadc
Author: Hyunsik Choi <hy...@apache.org>
Authored: Thu May 28 05:19:51 2015 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu May 28 05:19:51 2015 -0700

----------------------------------------------------------------------
 CHANGES                                         |  3 ++
 .../sphinx/table_management/table_overview.rst  | 29 ++++++++++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/03294e14/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 7023419..85c28ce 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1624: Add managed table or external description in Table management 
+    section. (hyunsik)
+
     TAJO-1626: JdbcConnection::setAutoCommit() should not throw an exception.
     (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/03294e14/tajo-docs/src/main/sphinx/table_management/table_overview.rst
----------------------------------------------------------------------
diff --git a/tajo-docs/src/main/sphinx/table_management/table_overview.rst b/tajo-docs/src/main/sphinx/table_management/table_overview.rst
index 3985e19..b63fb69 100644
--- a/tajo-docs/src/main/sphinx/table_management/table_overview.rst
+++ b/tajo-docs/src/main/sphinx/table_management/table_overview.rst
@@ -8,12 +8,37 @@ Overview
 Managed Table
 ================
 
-.. todo::
+``CREATE TABLE`` statement with ``EXTERNAL`` keyword lets you create a table located in the warehouse directory specified by the configuration property ``tajo.warehouse.directory`` or ``${tajo.root}/warehouse`` by default. For example: 
+
+.. code-block:: sql
+
+ CREATE TABLE employee (
+  id int,
+  name text,
+  age
+ );
+
 
 External Table
 ================
 
-.. todo::
+``CREATE EXTERNAL TABLE`` statement lets you create a table located in a specify location so that Tajo does not use a default data warehouse location for the table. External tables are in common used if you already have data generated. LOCATION clause must be required for an external table. 
+
+.. code-block:: sql
+
+ CREATE EXTERNAL TABLE employee (
+  id int,
+  name text,
+  age
+ ) LOCATION 'hdfs://table/path';
+
+
+The location can be a directory located in HDFS, Amazon S3, HBase, or local file system (if a Tajo cluster runs in a single machine). URI examples are as follows:
+
+ * HDFS - ``hdfs://hostname:8020/table1``
+ * Amazon S3 - ``s3://bucket-name/table1``
+ * local file system - ``file:///dir/table1``
+ * Openstack Swift - ``swift://bucket-name/table1``
 
 Table Properties
 ================


[04/24] tajo git commit: TAJO-1623: INSERT INTO with wrong target columns causes NPE.

Posted by ji...@apache.org.
TAJO-1623: INSERT INTO with wrong target columns causes NPE.

Closes #587


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

Branch: refs/heads/index_support
Commit: 4f3a46c3646ca7a551916c57c980b2862a9dbb4e
Parents: 1872df9
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue May 26 21:54:07 2015 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue May 26 21:54:07 2015 -0700

----------------------------------------------------------------------
 CHANGES                                            |  2 ++
 .../java/org/apache/tajo/QueryTestCaseBase.java    | 16 ++++++++++++----
 .../tajo/engine/planner/TestQueryValidation.java   | 17 ++++++++++++-----
 .../java/org/apache/tajo/plan/LogicalPlanner.java  |  6 ++++++
 4 files changed, 32 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/4f3a46c3/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 58944a5..aeda418 100644
--- a/CHANGES
+++ b/CHANGES
@@ -136,6 +136,8 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1623: INSERT INTO with wrong target columns causes NPE. (hyunsik)
+
     TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)
 
     TAJO-1619: JDBC program is stuck after closing. (jihoon)

http://git-wip-us.apache.org/repos/asf/tajo/blob/4f3a46c3/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java b/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
index 8d0ff12..9a92e90 100644
--- a/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
+++ b/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
@@ -306,24 +306,32 @@ public class QueryTestCaseBase {
     return state;
   }
 
-  public void assertValidSQL(String fileName) throws PlanningException, IOException {
-    Path queryFilePath = getQueryFilePath(fileName);
-    String query = FileUtil.readTextFile(new File(queryFilePath.toUri()));
+  public void assertValidSQL(String query) throws PlanningException, IOException {
     VerificationState state = verify(query);
     if (state.getErrorMessages().size() > 0) {
       fail(state.getErrorMessages().get(0));
     }
   }
 
-  public void assertInvalidSQL(String fileName) throws PlanningException, IOException {
+  public void assertValidSQLFromFile(String fileName) throws PlanningException, IOException {
     Path queryFilePath = getQueryFilePath(fileName);
     String query = FileUtil.readTextFile(new File(queryFilePath.toUri()));
+    assertValidSQL(query);
+  }
+
+  public void assertInvalidSQL(String query) throws PlanningException, IOException {
     VerificationState state = verify(query);
     if (state.getErrorMessages().size() == 0) {
       fail(PreLogicalPlanVerifier.class.getSimpleName() + " cannot catch any verification error: " + query);
     }
   }
 
+  public void assertInvalidSQLFromFile(String fileName) throws PlanningException, IOException {
+    Path queryFilePath = getQueryFilePath(fileName);
+    String query = FileUtil.readTextFile(new File(queryFilePath.toUri()));
+    assertInvalidSQL(query);
+  }
+
   public void assertPlanError(String fileName) throws PlanningException, IOException {
     Path queryFilePath = getQueryFilePath(fileName);
     String query = FileUtil.readTextFile(new File(queryFilePath.toUri()));

http://git-wip-us.apache.org/repos/asf/tajo/blob/4f3a46c3/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestQueryValidation.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestQueryValidation.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestQueryValidation.java
index b6827a2..fd60a5e 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestQueryValidation.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestQueryValidation.java
@@ -25,19 +25,26 @@ import org.junit.Test;
 import java.io.IOException;
 
 public class TestQueryValidation extends QueryTestCaseBase {
+
+  @Test
+  public void testInsertWithWrongTargetColumn() throws Exception {
+    executeString("CREATE TABLE T1 (col1 int, col2 int)").close();
+    assertInvalidSQL("INSERT INTO T1 (col1, col3) select l_orderkey, l_partkey from default.lineitem");
+  }
+
   @Test
   public void testLimitClauses() throws PlanningException, IOException {
     // select * from lineitem limit 3;
-    assertValidSQL("valid_limit_1.sql");
+    assertValidSQLFromFile("valid_limit_1.sql");
 
     // select * from lineitem limit l_orderkey;
-    assertInvalidSQL("invalid_limit_1.sql");
+    assertInvalidSQLFromFile("invalid_limit_1.sql");
   }
 
   @Test
   public void testGroupByClauses() throws PlanningException, IOException {
     // select l_orderkey from lineitem group by l_orderkey;
-    assertValidSQL("valid_groupby_1.sql");
+    assertValidSQLFromFile("valid_groupby_1.sql");
 
     // select * from lineitem group by l_orderkey;
     assertPlanError("error_groupby_1.sql");
@@ -48,12 +55,12 @@ public class TestQueryValidation extends QueryTestCaseBase {
   @Test
   public void testCaseWhenExprs() throws PlanningException, IOException {
     // See TAJO-1098
-    assertInvalidSQL("invalid_casewhen_1.sql");
+    assertInvalidSQLFromFile("invalid_casewhen_1.sql");
   }
 
   @Test
   public void testUnsupportedStoreType() throws PlanningException, IOException {
     // See TAJO-1249
-    assertInvalidSQL("invalid_store_format.sql");
+    assertInvalidSQLFromFile("invalid_store_format.sql");
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4f3a46c3/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
index cec0760..5571cdf 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
@@ -1564,6 +1564,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       Schema targetColumns = new Schema();
       for (int i = 0; i < targets.length; i++) {
         Column targetColumn = desc.getLogicalSchema().getColumn(targets[i]);
+
+        if (targetColumn == null) {
+          throw new PlanningException("column \"" + targets[i] + "\" of relation \"" +
+              desc.getName() + "\" does not exist");
+        }
+
         targetColumns.addColumn(targetColumn);
       }
       insertNode.setTargetSchema(targetColumns);


[08/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Hash.plan
index af210c2..6640d69 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Hash.plan
@@ -63,7 +63,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(12)(c_custkey)
+GROUP_BY(14)(c_custkey)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)
   => out schema:{(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
@@ -92,7 +92,7 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t1.c_custkey (INT4), num=32)
 
-GROUP_BY(14)(c_custkey)
+GROUP_BY(16)(c_custkey)
   => exprs: (count())
   => target list: default.t1.c_custkey (INT4), ?count_6 (INT8)
   => out schema:{(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
@@ -110,7 +110,7 @@ GROUP_BY(14)(c_custkey)
            => target list: default.customer.c_custkey (INT4), total1 (INT8), total2 (TEXT), total3 (TEXT)
            => out schema:{(4) default.customer.c_custkey (INT4), total1 (INT8), total2 (TEXT), total3 (TEXT)}
            => in schema:{(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
-            SCAN(13) on eb_0000000000000_0000_000003
+            SCAN(15) on eb_0000000000000_0000_000003
               => out schema: {(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
               => in schema: {(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
 
@@ -124,14 +124,14 @@ Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t1.c_custkey (INT4), num=32)
 
-SORT(16)
+SORT(18)
   => Sort Keys: default.t1.c_custkey (INT4) (asc)
    GROUP_BY(6)(c_custkey)
      => exprs: (count(?count_6 (INT8)))
      => target list: default.t1.c_custkey (INT4), ?count (INT8)
      => out schema:{(2) ?count (INT8), default.t1.c_custkey (INT4)}
      => in schema:{(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
-      SCAN(15) on eb_0000000000000_0000_000004
+      SCAN(17) on eb_0000000000000_0000_000004
         => out schema: {(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
         => in schema: {(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
 
@@ -151,7 +151,7 @@ PROJECTION(8)
   => in  schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
    SORT(7)
      => Sort Keys: default.t1.c_custkey (INT4) (asc)
-      SCAN(17) on eb_0000000000000_0000_000005
+      SCAN(19) on eb_0000000000000_0000_000005
         => out schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
         => in schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Sort.plan
index af210c2..6640d69 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable3.Sort.plan
@@ -63,7 +63,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(12)(c_custkey)
+GROUP_BY(14)(c_custkey)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)
   => out schema:{(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
@@ -92,7 +92,7 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t1.c_custkey (INT4), num=32)
 
-GROUP_BY(14)(c_custkey)
+GROUP_BY(16)(c_custkey)
   => exprs: (count())
   => target list: default.t1.c_custkey (INT4), ?count_6 (INT8)
   => out schema:{(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
@@ -110,7 +110,7 @@ GROUP_BY(14)(c_custkey)
            => target list: default.customer.c_custkey (INT4), total1 (INT8), total2 (TEXT), total3 (TEXT)
            => out schema:{(4) default.customer.c_custkey (INT4), total1 (INT8), total2 (TEXT), total3 (TEXT)}
            => in schema:{(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
-            SCAN(13) on eb_0000000000000_0000_000003
+            SCAN(15) on eb_0000000000000_0000_000003
               => out schema: {(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
               => in schema: {(4) default.customer.c_custkey (INT4), ?sum_3 (INT8), ?max_4 (TEXT), ?max_5 (TEXT)}
 
@@ -124,14 +124,14 @@ Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t1.c_custkey (INT4), num=32)
 
-SORT(16)
+SORT(18)
   => Sort Keys: default.t1.c_custkey (INT4) (asc)
    GROUP_BY(6)(c_custkey)
      => exprs: (count(?count_6 (INT8)))
      => target list: default.t1.c_custkey (INT4), ?count (INT8)
      => out schema:{(2) ?count (INT8), default.t1.c_custkey (INT4)}
      => in schema:{(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
-      SCAN(15) on eb_0000000000000_0000_000004
+      SCAN(17) on eb_0000000000000_0000_000004
         => out schema: {(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
         => in schema: {(2) default.t1.c_custkey (INT4), ?count_6 (INT8)}
 
@@ -151,7 +151,7 @@ PROJECTION(8)
   => in  schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
    SORT(7)
      => Sort Keys: default.t1.c_custkey (INT4) (asc)
-      SCAN(17) on eb_0000000000000_0000_000005
+      SCAN(19) on eb_0000000000000_0000_000005
         => out schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
         => in schema: {(2) ?count (INT8), default.t1.c_custkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
index 3bb8c1d..5ea0fdd 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
@@ -75,7 +75,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-GROUP_BY(15)()
+GROUP_BY(17)()
   => exprs: (max(default.customer.c_custkey (INT4)),sum(default.orders.o_orderkey (INT4)),max(default.orders.o_orderstatus (TEXT)),max(default.orders.o_orderdate (TEXT)))
   => target list: ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)
   => out schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
@@ -106,7 +106,7 @@ GROUP_BY(9)()
   => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
   => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
   => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(16) on eb_0000000000000_0000_000003
+   SCAN(18) on eb_0000000000000_0000_000003
      => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
      => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
 
@@ -120,7 +120,7 @@ Block Id: eb_0000000000000_0000_000007 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(17)()
+GROUP_BY(21)()
   => exprs: (max(default.customer.c_custkey (INT4)),sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)
   => out schema:{(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
@@ -151,7 +151,7 @@ GROUP_BY(10)()
   => target list: ?max_5 (INT4), ?sum_6 (INT8), ?max_7 (TEXT), ?max_8 (TEXT)
   => out schema:{(4) ?max_5 (INT4), ?max_7 (TEXT), ?max_8 (TEXT), ?sum_6 (INT8)}
   => in schema:{(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000007
+   SCAN(22) on eb_0000000000000_0000_000007
      => out schema: {(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
      => in schema: {(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
index 3bb8c1d..5ea0fdd 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
@@ -75,7 +75,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-GROUP_BY(15)()
+GROUP_BY(17)()
   => exprs: (max(default.customer.c_custkey (INT4)),sum(default.orders.o_orderkey (INT4)),max(default.orders.o_orderstatus (TEXT)),max(default.orders.o_orderdate (TEXT)))
   => target list: ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)
   => out schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
@@ -106,7 +106,7 @@ GROUP_BY(9)()
   => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
   => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
   => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(16) on eb_0000000000000_0000_000003
+   SCAN(18) on eb_0000000000000_0000_000003
      => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
      => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
 
@@ -120,7 +120,7 @@ Block Id: eb_0000000000000_0000_000007 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(17)()
+GROUP_BY(21)()
   => exprs: (max(default.customer.c_custkey (INT4)),sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)
   => out schema:{(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
@@ -151,7 +151,7 @@ GROUP_BY(10)()
   => target list: ?max_5 (INT4), ?sum_6 (INT8), ?max_7 (TEXT), ?max_8 (TEXT)
   => out schema:{(4) ?max_5 (INT4), ?max_7 (TEXT), ?max_8 (TEXT), ?sum_6 (INT8)}
   => in schema:{(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000007
+   SCAN(22) on eb_0000000000000_0000_000007
      => out schema: {(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
      => in schema: {(4) ?max_16 (INT4), ?sum_17 (INT8), ?max_18 (TEXT), ?max_19 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Hash.plan
index b7892e4..a0476d1 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Hash.plan
@@ -48,7 +48,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(9)(l_linenumber)
+GROUP_BY(11)(l_linenumber)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)),avg(default.lineitem.l_quantity (FLOAT8)),sum(default.lineitem.l_quantity (FLOAT8)))
   => target list: default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)
   => out schema:{(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
@@ -77,14 +77,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.lineitem.l_linenumber (INT4), num=32)
 
-SORT(11)
+SORT(13)
   => Sort Keys: default.lineitem.l_linenumber (INT4) (asc)
    GROUP_BY(3)(l_linenumber)
      => exprs: (sum(?sum_7 (INT8)),max(?max_8 (TEXT)),max(?max_9 (TEXT)),avg(?avg_10 (PROTOBUF)),sum(?sum_11 (FLOAT8)))
      => target list: default.lineitem.l_linenumber (INT4), ?sum (INT8), ?max_1 (TEXT), ?max_2 (TEXT), ?avg_3 (FLOAT8), ?sum_4 (FLOAT8)
      => out schema:{(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
      => in schema:{(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
         => in schema: {(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
 
@@ -100,7 +100,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT]
 
 SORT(4)
   => Sort Keys: default.lineitem.l_linenumber (INT4) (asc)
-   SCAN(12) on eb_0000000000000_0000_000004
+   SCAN(14) on eb_0000000000000_0000_000004
      => out schema: {(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
      => in schema: {(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Sort.plan
index b7892e4..a0476d1 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable5.Sort.plan
@@ -48,7 +48,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(9)(l_linenumber)
+GROUP_BY(11)(l_linenumber)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)),avg(default.lineitem.l_quantity (FLOAT8)),sum(default.lineitem.l_quantity (FLOAT8)))
   => target list: default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)
   => out schema:{(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
@@ -77,14 +77,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.lineitem.l_linenumber (INT4), num=32)
 
-SORT(11)
+SORT(13)
   => Sort Keys: default.lineitem.l_linenumber (INT4) (asc)
    GROUP_BY(3)(l_linenumber)
      => exprs: (sum(?sum_7 (INT8)),max(?max_8 (TEXT)),max(?max_9 (TEXT)),avg(?avg_10 (PROTOBUF)),sum(?sum_11 (FLOAT8)))
      => target list: default.lineitem.l_linenumber (INT4), ?sum (INT8), ?max_1 (TEXT), ?max_2 (TEXT), ?avg_3 (FLOAT8), ?sum_4 (FLOAT8)
      => out schema:{(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
      => in schema:{(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
         => in schema: {(6) default.lineitem.l_linenumber (INT4), ?sum_7 (INT8), ?max_8 (TEXT), ?max_9 (TEXT), ?avg_10 (PROTOBUF), ?sum_11 (FLOAT8)}
 
@@ -100,7 +100,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT]
 
 SORT(4)
   => Sort Keys: default.lineitem.l_linenumber (INT4) (asc)
-   SCAN(12) on eb_0000000000000_0000_000004
+   SCAN(14) on eb_0000000000000_0000_000004
      => out schema: {(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
      => in schema: {(6) ?avg_3 (FLOAT8), ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), ?sum_4 (FLOAT8), default.lineitem.l_linenumber (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Hash.plan
index 6172720..4de481f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Hash.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderkey (INT4) IS NULL
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Sort.plan
index 6172720..4de481f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull1.Sort.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderkey (INT4) IS NULL
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan
index f92351e..f1e2800 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%'
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan
index f92351e..f1e2800 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%'
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Hash.plan
index 23ef5fe..5bace36 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Hash.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderkey (INT4) = 100
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Sort.plan
index 23ef5fe..5bace36 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull3.Sort.plan
@@ -43,7 +43,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    SELECTION(3)
      => Search Cond: default.orders.o_orderkey (INT4) = 100
@@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
      => in schema: {(4) ?coalesce (TEXT), default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Hash.plan
index e9e2176..7b9c695 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Hash.plan
@@ -27,19 +27,19 @@ SELECTION(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -72,5 +72,5 @@ SELECTION(5)
            => in schema: {(8) default.a.c_acctbal (FLOAT8), default.a.c_address (TEXT), default.a.c_comment (TEXT), default.a.c_custkey (INT4), default.a.c_mktsegment (TEXT), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.a.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Sort.plan
index e9e2176..7b9c695 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testMultipleBroadcastDataFileWithZeroLength2.Sort.plan
@@ -27,19 +27,19 @@ SELECTION(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -72,5 +72,5 @@ SELECTION(5)
            => in schema: {(8) default.a.c_acctbal (FLOAT8), default.a.c_address (TEXT), default.a.c_comment (TEXT), default.a.c_custkey (INT4), default.a.c_mktsegment (TEXT), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.a.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan
index 58ccb3c..08ded3e 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan
@@ -27,31 +27,31 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.b
  1: type=Broadcast, tables=default.c
 
-SORT(11)
+SORT(15)
   => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc)
    JOIN(9)(LEFT_OUTER)
      => Join Cond: default.b.id (INT4) = default.c.id (INT4)
@@ -77,21 +77,21 @@ SORT(11)
            => in schema: {(4) default.a.id (INT4), default.a.name (TEXT), default.a.score (FLOAT4), default.a.type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(5)
   => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc)
-   SCAN(12) on eb_0000000000000_0000_000003
+   SCAN(16) on eb_0000000000000_0000_000005
      => out schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)}
      => in schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan
index 58ccb3c..08ded3e 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan
@@ -27,31 +27,31 @@ SORT(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000005
-   |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+3: eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.b
  1: type=Broadcast, tables=default.c
 
-SORT(11)
+SORT(15)
   => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc)
    JOIN(9)(LEFT_OUTER)
      => Join Cond: default.b.id (INT4) = default.c.id (INT4)
@@ -77,21 +77,21 @@ SORT(11)
            => in schema: {(4) default.a.id (INT4), default.a.name (TEXT), default.a.score (FLOAT4), default.a.type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
+Block Id: eb_0000000000000_0000_000006 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.a.id (INT4), default.a.name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000003
+ 0: sorted input=eb_0000000000000_0000_000005
 
 SORT(5)
   => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc)
-   SCAN(12) on eb_0000000000000_0000_000003
+   SCAN(16) on eb_0000000000000_0000_000005
      => out schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)}
      => in schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Hash.plan
index 98c044a..70507fe 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Hash.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(RIGHT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Sort.plan
index 98c044a..70507fe 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoin1.Sort.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(RIGHT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan
new file mode 100644
index 0000000..e0bb3a0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan
@@ -0,0 +1,101 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
+4: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t1
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(1) on default.jointable12 as t2
+     => target list: default.t2.id (INT4)
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+   SCAN(0) on default.jointable11 as t1
+     => target list: default.t1.id (INT4), default.t1.name (TEXT)
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..735f305
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan
@@ -0,0 +1,128 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+SCAN(1) on default.jointable12 as t2
+  => target list: default.t2.id (INT4)
+  => out schema: {(1) default.t2.id (INT4)}
+  => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(1) default.t2.id (INT4)}
+   SCAN(10) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan
new file mode 100644
index 0000000..e0bb3a0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan
@@ -0,0 +1,101 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000003
+2: eb_0000000000000_0000_000004
+3: eb_0000000000000_0000_000005
+4: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t1
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(1) on default.jointable12 as t2
+     => target list: default.t2.id (INT4)
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+   SCAN(0) on default.jointable11 as t1
+     => target list: default.t1.id (INT4), default.t1.name (TEXT)
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
new file mode 100644
index 0000000..735f305
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
@@ -0,0 +1,128 @@
+explain
+-------------------------------
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(7)(RIGHT_OUTER)
+     => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+      SCAN(1) on default.jointable12 as t2
+        => target list: default.t2.id (INT4)
+        => out schema: {(1) default.t2.id (INT4)}
+        => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+SCAN(1) on default.jointable12 as t2
+  => target list: default.t2.id (INT4)
+  => out schema: {(1) default.t2.id (INT4)}
+  => in schema: {(2) default.t2.id (INT4), default.t2.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+
+JOIN(7)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t2.id (INT4)}
+     => in schema: {(1) default.t2.id (INT4)}
+   SCAN(10) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), default.t2.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32)
+
+JOIN(8)(RIGHT_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4), default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t2.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.result b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.result
new file mode 100644
index 0000000..c5da2c4
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.result
@@ -0,0 +1,4 @@
+id,name,id,id
+-------------------------------
+2,table11-2,2,2
+null,null,null,3

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan
new file mode 100644
index 0000000..22fc8ce
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan
@@ -0,0 +1,76 @@
+explain
+-------------------------------
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t4
+ 1: type=Broadcast, tables=default.t1
+
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..f5486f9
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan
@@ -0,0 +1,132 @@
+explain
+-------------------------------
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+      |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(1) on default.jointable14 as t4
+  => filter: default.t4.id (INT4) > 1
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+JOIN(8)(INNER)
+  => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t4.id (INT4)}
+     => in schema: {(1) default.t4.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(3) on default.jointable13 as t3
+  => filter: default.t3.id (INT4) > 1
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(14) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(13) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan
new file mode 100644
index 0000000..22fc8ce
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan
@@ -0,0 +1,76 @@
+explain
+-------------------------------
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [ROOT]
+=======================================================
+
+[Enforcers]
+ 0: type=Broadcast, tables=default.t4
+ 1: type=Broadcast, tables=default.t1
+
+JOIN(9)(RIGHT_OUTER)
+  => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+  => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+  => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+   SCAN(3) on default.jointable13 as t3
+     => filter: default.t3.id (INT4) > 1
+     => target list: default.t3.id (INT4)
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+   JOIN(8)(INNER)
+     => Join Cond: default.t1.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)
+     => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+     => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t4.id (INT4)}
+      SCAN(1) on default.jointable14 as t4
+        => filter: default.t4.id (INT4) > 1
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      SCAN(0) on default.jointable11 as t1
+        => target list: default.t1.id (INT4), default.t1.name (TEXT)
+        => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+        => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
+=======================================================


[21/24] tajo git commit: TAJO-1630: Test failure after TAJO-1130. (jihoon)

Posted by ji...@apache.org.
TAJO-1630: Test failure after TAJO-1130. (jihoon)

Closes #592


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

Branch: refs/heads/index_support
Commit: f4680a933149bb49237e145afd36d2dc18bacbbe
Parents: c2725a7
Author: Jihoon Son <ji...@apache.org>
Authored: Thu May 28 18:40:05 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu May 28 18:40:05 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 +
 .../tajo/engine/planner/global/MasterPlan.java  |  4 +-
 .../tajo/engine/query/TestOuterJoinQuery.java   | 12 +--
 ...stBroadcastTwoPartJoin.Hash_NoBroadcast.plan | 46 +++++-----
 ...stBroadcastTwoPartJoin.Sort_NoBroadcast.plan | 46 +++++-----
 ...oinOnMultipleDatabases.Hash_NoBroadcast.plan | 46 +++++-----
 ...oinOnMultipleDatabases.Sort_NoBroadcast.plan | 46 +++++-----
 ...nWithMultipleJoinQual1.Hash_NoBroadcast.plan | 46 +++++-----
 ...nWithMultipleJoinQual1.Sort_NoBroadcast.plan | 46 +++++-----
 .../testTPCHQ2Join.Hash_NoBroadcast.plan        | 46 +++++-----
 .../testTPCHQ2Join.Sort_NoBroadcast.plan        | 46 +++++-----
 ...testBroadcastSubquery2.Hash_NoBroadcast.plan | 48 +++++-----
 ...testBroadcastSubquery2.Sort_NoBroadcast.plan | 48 +++++-----
 ...nWithMultipleJoinQual3.Hash_NoBroadcast.plan | 48 +++++-----
 ...nWithMultipleJoinQual3.Sort_NoBroadcast.plan | 48 +++++-----
 ...nWithMultipleJoinQual4.Hash_NoBroadcast.plan | 48 +++++-----
 ...nWithMultipleJoinQual4.Sort_NoBroadcast.plan | 48 +++++-----
 ...FullOuterJoinPredicationCaseByCase1.1.result |  6 +-
 .../testLeftOuterJoinWithEmptyTable4.Hash.plan  | 32 +++----
 ...terJoinWithEmptyTable4.Hash_NoBroadcast.plan | 32 +++----
 .../testLeftOuterJoinWithEmptyTable4.Sort.plan  | 32 +++----
 ...terJoinWithEmptyTable4.Sort_NoBroadcast.plan | 32 +++----
 .../testJoinWithDifferentShuffleKey.1.Hash.plan | 36 ++++----
 ...hDifferentShuffleKey.1.Hash_NoBroadcast.plan | 36 ++++----
 .../testJoinWithDifferentShuffleKey.1.Sort.plan | 36 ++++----
 ...hDifferentShuffleKey.1.Sort_NoBroadcast.plan | 36 ++++----
 .../results/TestTPCH/testQ2FourJoins.plan       | 46 +++++-----
 .../resources/results/TestTPCH/testTPCHQ5.plan  | 92 ++++++++++----------
 28 files changed, 546 insertions(+), 544 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index a2af206..7c79805 100644
--- a/CHANGES
+++ b/CHANGES
@@ -144,6 +144,8 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1630: Test failure after TAJO-1130. (jihoon)
+
     TAJO-1623: INSERT INTO with wrong target columns causes NPE. (hyunsik)
 
     TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
index 22c3751..f8cd1e9 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
@@ -237,13 +237,13 @@ public class MasterPlan {
     sb.append("Order of Execution\n");
     sb.append("-------------------------------------------------------------------------------");
     int order = 1;
-    for (ExecutionBlock currentEB : cursor) {
+    for (ExecutionBlock currentEB : executionOrderCursor) {
       sb.append("\n").append(order).append(": ").append(currentEB.getId());
       order++;
     }
     sb.append("\n-------------------------------------------------------------------------------\n");
 
-    for (ExecutionBlock block : cursor) {
+    for (ExecutionBlock block : executionOrderCursor) {
 
       boolean terminal = false;
       sb.append("\n");

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
index d646202..9445557 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
@@ -220,7 +220,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
           "from jointable11 t1\n" +
@@ -269,7 +269,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
           "from jointable11 t1\n" +
@@ -285,7 +285,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
           "from jointable11 t1\n" +
@@ -301,7 +301,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
           "from jointable11 t1\n" +
@@ -335,7 +335,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id\n" +
           "from jointable11 t1\n" +
@@ -399,7 +399,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
 
   // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t3.id, t4.id\n" +
           "from jointable11 t1\n" +

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash_NoBroadcast.plan
index 635b6d3..cf69c4a 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(2) on default.part
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
-  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
-  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-     => in schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(3) on default.customer
   => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
+  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
+  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+     => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+     => in schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort_NoBroadcast.plan
index 635b6d3..cf69c4a 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(2) on default.part
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
-  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
-  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-     => in schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(3) on default.customer
   => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
+  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
+  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+     => in schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+     => in schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash_NoBroadcast.plan
index 9db97df..59e9b93 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(4) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(1) default.region.r_regionkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-     => in schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(2) on default.partsupp
   => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.region.r_regionkey (INT4)}
+     => in schema: {(1) default.region.r_regionkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+     => in schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort_NoBroadcast.plan
index 9db97df..59e9b93 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Sort_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(4) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(1) default.region.r_regionkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-     => in schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(2) on default.partsupp
   => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(1) default.region.r_regionkey (INT4)}
+     => in schema: {(1) default.region.r_regionkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+     => in schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan
index 7ce54c3..75c5487 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(7) on default.part as p
   => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.ps.ps_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.p.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
-  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-     => in schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-     => in schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.ps.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.p.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
+  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
+  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+     => in schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+     => in schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan
index 7ce54c3..75c5487 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(7) on default.part as p
   => in schema: {(9) default.p.p_brand (TEXT), default.p.p_comment (TEXT), default.p.p_container (TEXT), default.p.p_mfgr (TEXT), default.p.p_name (TEXT), default.p.p_partkey (INT4), default.p.p_retailprice (FLOAT8), default.p.p_size (INT4), default.p.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.ps.ps_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.p.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
-  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
-  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-     => in schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-     => in schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.ps.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.p.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), default.s.s_nationkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.p.p_partkey (INT4) = default.ps.ps_partkey (INT4)
+  => target list: default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)
+  => out schema: {(9) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+  => in schema: {(10) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+     => in schema: {(2) default.p.p_mfgr (TEXT), default.p.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+     => in schema: {(8) default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash_NoBroadcast.plan
index 24ce4fd..818a408 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Hash_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(0) on default.part
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-     => in schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(4) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+     => in schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort_NoBroadcast.plan
index 24ce4fd..818a408 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testTPCHQ2Join.Sort_NoBroadcast.plan
@@ -134,29 +134,6 @@ SCAN(0) on default.part
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-
-JOIN(14)(INNER)
-  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-   SCAN(21) on eb_0000000000000_0000_000004
-     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
-   SCAN(20) on eb_0000000000000_0000_000003
-     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-     => in schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(4) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+  => out schema: {(8) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+  => in schema: {(9) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   SCAN(21) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+     => in schema: {(2) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000003
+     => out schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(7) default.partsupp.ps_partkey (INT4), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash_NoBroadcast.plan
index 0ff2719..797e842 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Hash_NoBroadcast.plan
@@ -160,6 +160,30 @@ GROUP_BY(27)(l_orderkey)
               => in schema: {(3) default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.d.l_partkey (INT4), num=32)
+
+SCAN(7) on default.lineitem as d
+  => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
+  => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
+  => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+SCAN(8) on default.part
+  => target list: default.part.p_partkey (INT4)
+  => out schema: {(1) default.part.p_partkey (INT4)}
+  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 
@@ -187,30 +211,6 @@ TABLE_SUBQUERY(14) as default.f
            => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.d.l_partkey (INT4), num=32)
-
-SCAN(7) on default.lineitem as d
-  => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
-  => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
-  => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-SCAN(8) on default.part
-  => target list: default.part.p_partkey (INT4)
-  => out schema: {(1) default.part.p_partkey (INT4)}
-  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort_NoBroadcast.plan
index 0ff2719..797e842 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testBroadcastSubquery2.Sort_NoBroadcast.plan
@@ -160,6 +160,30 @@ GROUP_BY(27)(l_orderkey)
               => in schema: {(3) default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.d.l_partkey (INT4), num=32)
+
+SCAN(7) on default.lineitem as d
+  => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
+  => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
+  => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+SCAN(8) on default.part
+  => target list: default.part.p_partkey (INT4)
+  => out schema: {(1) default.part.p_partkey (INT4)}
+  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 
@@ -187,30 +211,6 @@ TABLE_SUBQUERY(14) as default.f
            => in schema: {(2) default.e.l_orderkey (INT4), ?avg_11 (PROTOBUF)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.d.l_partkey (INT4), num=32)
-
-SCAN(7) on default.lineitem as d
-  => target list: default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)
-  => out schema: {(3) default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8)}
-  => in schema: {(16) default.d.l_comment (TEXT), default.d.l_commitdate (TEXT), default.d.l_discount (FLOAT8), default.d.l_extendedprice (FLOAT8), default.d.l_linenumber (INT4), default.d.l_linestatus (TEXT), default.d.l_orderkey (INT4), default.d.l_partkey (INT4), default.d.l_quantity (FLOAT8), default.d.l_receiptdate (TEXT), default.d.l_returnflag (TEXT), default.d.l_shipdate (TEXT), default.d.l_shipinstruct (TEXT), default.d.l_shipmode (TEXT), default.d.l_suppkey (INT4), default.d.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-SCAN(8) on default.part
-  => target list: default.part.p_partkey (INT4)
-  => out schema: {(1) default.part.p_partkey (INT4)}
-  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash_NoBroadcast.plan
index f3907b6..06db6a2 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Hash_NoBroadcast.plan
@@ -88,6 +88,30 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
+
+SCAN(5) on default.supplier as s
+  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
+
+SCAN(7) on default.partsupp as ps
+  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
 =======================================================
 
@@ -119,30 +143,6 @@ TABLE_SUBQUERY(4) as default.t
            => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
-
-SCAN(7) on default.partsupp as ps
-  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort_NoBroadcast.plan
index f3907b6..06db6a2 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual3.Sort_NoBroadcast.plan
@@ -88,6 +88,30 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
+
+SCAN(5) on default.supplier as s
+  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
+
+SCAN(7) on default.partsupp as ps
+  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
 =======================================================
 
@@ -119,30 +143,6 @@ TABLE_SUBQUERY(4) as default.t
            => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
-
-SCAN(7) on default.partsupp as ps
-  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash_NoBroadcast.plan
index f9a09db..67c3c65 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Hash_NoBroadcast.plan
@@ -90,6 +90,30 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
+
+SCAN(5) on default.supplier as s
+  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
+
+SCAN(7) on default.partsupp as ps
+  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
 =======================================================
 
@@ -121,30 +145,6 @@ TABLE_SUBQUERY(4) as default.t
            => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
-
-SCAN(7) on default.partsupp as ps
-  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort_NoBroadcast.plan
index f9a09db..67c3c65 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinWithSubQuery/testJoinWithMultipleJoinQual4.Sort_NoBroadcast.plan
@@ -90,6 +90,30 @@ SCAN(1) on default.region as r
   => in schema: {(3) default.r.r_comment (TEXT), default.r.r_name (TEXT), default.r.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
+
+SCAN(5) on default.supplier as s
+  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
+  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
+  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
+
+SCAN(7) on default.partsupp as ps
+  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
+  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
+  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
 =======================================================
 
@@ -121,30 +145,6 @@ TABLE_SUBQUERY(4) as default.t
            => in schema: {(4) default.n.n_comment (TEXT), default.n.n_name (TEXT), default.n.n_nationkey (INT4), default.n.n_regionkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.s.s_suppkey (INT4), num=32)
-
-SCAN(5) on default.supplier as s
-  => target list: default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)
-  => out schema: {(2) default.s.s_nationkey (INT4), default.s.s_suppkey (INT4)}
-  => in schema: {(7) default.s.s_acctbal (FLOAT8), default.s.s_address (TEXT), default.s.s_comment (TEXT), default.s.s_name (TEXT), default.s.s_nationkey (INT4), default.s.s_phone (TEXT), default.s.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000005 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.ps.ps_suppkey (INT4), num=32)
-
-SCAN(7) on default.partsupp as ps
-  => target list: default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)
-  => out schema: {(2) default.ps.ps_availqty (INT4), default.ps.ps_suppkey (INT4)}
-  => in schema: {(5) default.ps.ps_availqty (INT4), default.ps.ps_comment (TEXT), default.ps.ps_partkey (INT4), default.ps.ps_suppkey (INT4), default.ps.ps_supplycost (FLOAT8)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
index 8d9d294..080edf6 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
@@ -1,9 +1,9 @@
 id,name,id,id
 -------------------------------
-null,null,null,1
+1,table11-1,null,null
 2,table11-2,2,2
 3,table11-3,3,3
-null,null,null,4
-1,table11-1,null,null
 4,table11-4,null,null
 5,table11-5,null,null
+null,null,null,1
+null,null,null,4

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
index 5ea0fdd..9b2aeeb 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash.plan
@@ -95,22 +95,6 @@ GROUP_BY(17)()
         => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
-
-GROUP_BY(9)()
-  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
-  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
-  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
-  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000003
-     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000007 [LEAF]
 =======================================================
 
@@ -140,6 +124,22 @@ GROUP_BY(21)()
         => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+GROUP_BY(9)()
+  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
+  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
+  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
+  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [ROOT]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash_NoBroadcast.plan
index 73478b2..21bb1de 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Hash_NoBroadcast.plan
@@ -126,22 +126,6 @@ GROUP_BY(17)()
         => in schema: {(1) default.customer.c_custkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
-
-GROUP_BY(9)()
-  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
-  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
-  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
-  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000003
-     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
@@ -166,6 +150,22 @@ SCAN(5) on default.empty_orders
   => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+GROUP_BY(9)()
+  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
+  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
+  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
+  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
index 5ea0fdd..9b2aeeb 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort.plan
@@ -95,22 +95,6 @@ GROUP_BY(17)()
         => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
-
-GROUP_BY(9)()
-  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
-  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
-  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
-  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000003
-     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000007 [LEAF]
 =======================================================
 
@@ -140,6 +124,22 @@ GROUP_BY(21)()
         => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+GROUP_BY(9)()
+  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
+  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
+  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
+  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [ROOT]
 =======================================================
 


[19/24] tajo git commit: TAJO-1130: Concurrent execution of independent execution blocks.

Posted by ji...@apache.org.
TAJO-1130: Concurrent execution of independent execution blocks.

Closes #423

Signed-off-by: Jihoon Son <ji...@apache.org>


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

Branch: refs/heads/index_support
Commit: c2725a779c9f80d60a906657aaa95aff1a48edd0
Parents: f124b87
Author: navis.ryu <na...@apache.org>
Authored: Thu May 28 14:48:41 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu May 28 14:49:57 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   7 +-
 .../main/java/org/apache/tajo/SessionVars.java  |   3 +
 .../java/org/apache/tajo/conf/TajoConf.java     |   5 +-
 .../tajo/engine/planner/global/DataChannel.java |   4 +
 .../planner/global/ExecutionBlockCursor.java    | 101 ++++++++-------
 .../engine/planner/global/ExecutionQueue.java   |  43 +++++++
 .../tajo/engine/planner/global/MasterPlan.java  |   6 +-
 .../planner/global/ParallelExecutionQueue.java  | 126 +++++++++++++++++++
 .../rules/GlobalPlanEqualityTester.java         |   3 +-
 .../ExplainGlobalPlanPreprocessorForTest.java   |   3 +-
 .../NonForwardQueryResultSystemScanner.java     |   3 +-
 .../apache/tajo/master/rm/WorkerResource.java   |  16 +--
 .../java/org/apache/tajo/querymaster/Query.java |  89 +++++++------
 .../org/apache/tajo/TajoTestingCluster.java     |   9 +-
 .../tajo/master/TestExecutionBlockCursor.java   |   4 +-
 .../TestTajoCli/testHelpSessionVars.result      |   1 +
 16 files changed, 313 insertions(+), 110 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 0d4ae04..a2af206 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,15 +27,18 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1130: Concurrent execution of independent execution blocks.
+    (Contributed by navis, Committed by jihoon)
+
     TAJO-1618: [Rest API] queries/{queryId} should set default print type.
-    (Contributed by DaeMyoung Kang, Committed by jihoon)
+    (Contributed by DaeMyung Kang, Committed by jihoon)
 
     TAJO-1553: Improve broadcast join planning. (jihoon)
 
     TAJO-1577: Add test cases to verify join plans. (jihoon)
 
     TAJO-1607: Tajo Rest Cache-Id should be bigger than zero. (Contributed by 
-    DaeMyoung Kang, Committed by hyunsik)
+    DaeMyung Kang, Committed by hyunsik)
 
     TAJO-1603: Refactor StorageManager. (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
index 0d2319e..031387c 100644
--- a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
+++ b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
@@ -107,6 +107,9 @@ public enum SessionVars implements ConfigKey {
   GROUPBY_MULTI_LEVEL_ENABLED(ConfVars.$GROUPBY_MULTI_LEVEL_ENABLED, "Multiple level groupby enabled", DEFAULT,
       Boolean.class, Validators.bool()),
 
+  QUERY_EXECUTE_PARALLEL(ConfVars.$QUERY_EXECUTE_PARALLEL_MAX, "Maximum parallel running of execution blocks for a query",
+      DEFAULT, Integer.class, Validators.min("0")),
+
   // for physical Executors
   EXTSORT_BUFFER_SIZE(ConfVars.$EXECUTOR_EXTERNAL_SORT_BUFFER_SIZE, "sort buffer size for external sort (mb)", DEFAULT,
       Long.class, Validators.min("0")),

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index e20658b..3f350c3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -305,7 +305,7 @@ public class TajoConf extends Configuration {
     /////////////////////////////////////////////////////////////////////////////////
     // User Session Configuration
     //
-    // All session variables begin with dollor($) sign. They are default configs
+    // All session variables begin with dollar($) sign. They are default configs
     // for session variables. Do not directly use the following configs. Instead,
     // please use QueryContext in order to access session variables.
     //
@@ -330,6 +330,9 @@ public class TajoConf extends Configuration {
 
     $GROUPBY_MULTI_LEVEL_ENABLED("tajo.dist-query.groupby.multi-level-aggr", true),
 
+    // WARN "tajo.yarn-rm.parallel-task-runner-launcher-num" should be set enough to avoid deadlock
+    $QUERY_EXECUTE_PARALLEL_MAX("tajo.query.execute.parallel.max", 1),
+
     // for physical Executors
     $EXECUTOR_EXTERNAL_SORT_BUFFER_SIZE("tajo.executor.external-sort.buffer-mb", 200L),
     $EXECUTOR_HASH_JOIN_SIZE_THRESHOLD("tajo.executor.join.common.in-memory-hash-threshold-bytes",

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
index dc6cd4c..3adc0a3 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
@@ -99,6 +99,10 @@ public class DataChannel {
     return shuffleType;
   }
 
+  public boolean needShuffle() {
+    return shuffleType != ShuffleType.NONE_SHUFFLE;
+  }
+
   public TransmitType getTransmitType() {
     return this.transmitType;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlockCursor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlockCursor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlockCursor.java
index 9f82672..c6864b9 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlockCursor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionBlockCursor.java
@@ -15,6 +15,7 @@
 package org.apache.tajo.engine.planner.global;
 
 import org.apache.tajo.ExecutionBlockId;
+import org.apache.tajo.SessionVars;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -23,10 +24,9 @@ import java.util.concurrent.atomic.AtomicInteger;
  * A distributed execution plan (DEP) is a direct acyclic graph (DAG) of ExecutionBlocks.
  * This class is a pointer to an ExecutionBlock that the query engine should execute.
  */
-public class ExecutionBlockCursor {
+public class ExecutionBlockCursor implements Iterable<ExecutionBlock> {
   private MasterPlan masterPlan;
   private ArrayList<ExecutionBlock> orderedBlocks = new ArrayList<ExecutionBlock>();
-  private int cursor = 0;
 
   private List<BuildOrderItem> executionOrderedBlocks = new ArrayList<BuildOrderItem>();
   private List<BuildOrderItem> notOrderedSiblingBlocks = new ArrayList<BuildOrderItem>();
@@ -45,29 +45,71 @@ public class ExecutionBlockCursor {
     }
   }
 
+  @Override
+  public Iterator<ExecutionBlock> iterator() {
+    return orderedBlocks.iterator();
+  }
+
   public int size() {
     return orderedBlocks.size();
   }
 
+  public ExecutionQueue newCursor() {
+    int parallel = masterPlan.getContext().getInt(SessionVars.QUERY_EXECUTE_PARALLEL);
+    if (parallel > 1) {
+      return new ParallelExecutionQueue(masterPlan, parallel);
+    }
+    return new SimpleExecutionQueue();
+  }
+
+  public class SimpleExecutionQueue implements ExecutionQueue {
+
+    private final Iterator<ExecutionBlock> iterator = iterator();
+    private ExecutionBlock last;
+
+    @Override
+    public int size() {
+      return ExecutionBlockCursor.this.size();
+    }
+
+    @Override
+    public ExecutionBlock[] first() {
+      return iterator.hasNext() ? next(null) : null;
+    }
+
+    @Override
+    public ExecutionBlock[] next(ExecutionBlockId blockId) {
+      return iterator.hasNext() ? new ExecutionBlock[]{last = iterator.next()} : null;
+    }
+
+    public String toString() {
+      StringBuilder sb = new StringBuilder();
+      for (ExecutionBlock block : ExecutionBlockCursor.this) {
+        if (sb.length() > 0) {
+          sb.append(',');
+        }
+        if (block == last) {
+          sb.append('(');
+        }
+        sb.append(block.getId().getId());
+        if (block == last) {
+          sb.append(')');
+        }
+      }
+      return sb.toString();
+    }
+  }
+
   // Add all execution blocks in a depth first and postfix order
   private void buildDepthFirstOrder(ExecutionBlock current) {
-    Stack<ExecutionBlock> stack = new Stack<ExecutionBlock>();
     if (!masterPlan.isLeaf(current.getId())) {
       for (ExecutionBlock execBlock : masterPlan.getChilds(current)) {
-        if (!masterPlan.isLeaf(execBlock)) {
-          buildDepthFirstOrder(execBlock);
-        } else {
-          stack.push(execBlock);
-        }
-      }
-      for (ExecutionBlock execBlock : stack) {
         buildDepthFirstOrder(execBlock);
       }
     }
     orderedBlocks.add(current);
   }
 
-
   private void buildSiblingFirstOrder(ExecutionBlock current) {
     /*
      |-eb_1404887024677_0004_000007
@@ -178,41 +220,4 @@ public class ExecutionBlockCursor {
       return result;
     }
   }
-
-  public boolean hasNext() {
-    return cursor < orderedBlocks.size();
-  }
-
-  public ExecutionBlock nextBlock() {
-    return orderedBlocks.get(cursor++);
-  }
-
-  public ExecutionBlock peek() {
-    return orderedBlocks.get(cursor);
-  }
-
-  public ExecutionBlock peek(int skip) {
-    return  orderedBlocks.get(cursor + skip);
-  }
-
-  public void reset() {
-    cursor = 0;
-  }
-
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < orderedBlocks.size(); i++) {
-      if (i == (cursor == 0 ? 0 : cursor - 1)) {
-        sb.append("(").append(orderedBlocks.get(i).getId().getId()).append(")");
-      } else {
-        sb.append(orderedBlocks.get(i).getId().getId());
-      }
-
-      if (i < orderedBlocks.size() - 1) {
-        sb.append(",");
-      }
-    }
-
-    return sb.toString();
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionQueue.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionQueue.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionQueue.java
new file mode 100644
index 0000000..fa7ca15
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ExecutionQueue.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed 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.engine.planner.global;
+
+import org.apache.tajo.ExecutionBlockId;
+
+// Retrieves execution blocks to run real works
+public interface ExecutionQueue {
+
+  /**
+   * remaining blocks in queue
+   *
+   * @return number of blocks
+   */
+  int size();
+
+  /**
+   * return initial blocks to be run
+   *
+   * @return blocks to be run
+   */
+  ExecutionBlock[] first();
+
+  /**
+   * get next execution blocks to be run
+   *
+   * @param blockId currently finished id of execution block
+   * @return null for finished, can return empty array
+   */
+  ExecutionBlock[] next(ExecutionBlockId blockId);
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
index 6e9b74f..22c3751 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/MasterPlan.java
@@ -237,15 +237,13 @@ public class MasterPlan {
     sb.append("Order of Execution\n");
     sb.append("-------------------------------------------------------------------------------");
     int order = 1;
-    while (executionOrderCursor.hasNext()) {
-      ExecutionBlock currentEB = executionOrderCursor.nextBlock();
+    for (ExecutionBlock currentEB : cursor) {
       sb.append("\n").append(order).append(": ").append(currentEB.getId());
       order++;
     }
     sb.append("\n-------------------------------------------------------------------------------\n");
 
-    while(cursor.hasNext()) {
-      ExecutionBlock block = cursor.nextBlock();
+    for (ExecutionBlock block : cursor) {
 
       boolean terminal = false;
       sb.append("\n");

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ParallelExecutionQueue.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ParallelExecutionQueue.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ParallelExecutionQueue.java
new file mode 100644
index 0000000..1e823be
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/ParallelExecutionQueue.java
@@ -0,0 +1,126 @@
+/**
+ * Licensed 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.engine.planner.global;
+
+import com.google.common.collect.Iterables;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tajo.ExecutionBlockId;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+
+public class ParallelExecutionQueue implements ExecutionQueue, Iterable<ExecutionBlock> {
+
+  private static final Log LOG = LogFactory.getLog(ParallelExecutionQueue.class);
+
+  private final int maximum;
+  private final MasterPlan masterPlan;
+  private final List<Deque<ExecutionBlock>> executable;
+  private final Set<ExecutionBlockId> executed = new HashSet<ExecutionBlockId>();
+
+  public ParallelExecutionQueue(MasterPlan masterPlan, int maximum) {
+    this.masterPlan = masterPlan;
+    this.maximum = maximum;
+    this.executable = toStacks(masterPlan.getRoot());
+  }
+
+  private List<Deque<ExecutionBlock>> toStacks(ExecutionBlock root) {
+    List<Deque<ExecutionBlock>> stacks = new ArrayList<Deque<ExecutionBlock>>();
+    toStacks(root, stacks, new ArrayList<ExecutionBlock>());
+    return stacks;
+  }
+
+  // currently, diamond shaped DAG is not supported in tajo
+  private void toStacks(ExecutionBlock current, List<Deque<ExecutionBlock>> queues,
+                        List<ExecutionBlock> stack) {
+    stack.add(current);
+    if (masterPlan.isLeaf(current.getId())) {
+      queues.add(new ArrayDeque<ExecutionBlock>(stack));
+    } else {
+      List<ExecutionBlock> children = masterPlan.getChilds(current);
+      for (int i = 0; i < children.size(); i++) {
+        toStacks(children.get(i), queues, i == 0 ? stack : new Stack<ExecutionBlock>());
+      }
+    }
+  }
+
+  @Override
+  public synchronized int size() {
+    int size = 0;
+    for (Deque<ExecutionBlock> queue : executable) {
+      size += queue.size();
+    }
+    return size;
+  }
+
+  @Override
+  public synchronized ExecutionBlock[] first() {
+    int max = Math.min(maximum, executable.size());
+    List<ExecutionBlock> result = new ArrayList<ExecutionBlock>();
+    for (Deque<ExecutionBlock> queue : executable) {
+      if (result.size() < max && isExecutableNow(queue.peekLast())) {
+        result.add(queue.removeLast());
+      }
+    }
+    LOG.info("Initial executable blocks " + result);
+    return result.toArray(new ExecutionBlock[result.size()]);
+  }
+
+  @Override
+  public synchronized ExecutionBlock[] next(ExecutionBlockId doneNow) {
+    executed.add(doneNow);
+
+    int remaining = 0;
+    for (Deque<ExecutionBlock> queue : executable) {
+      if (!queue.isEmpty() && isExecutableNow(queue.peekLast())) {
+        LOG.info("Next executable block " + queue.peekLast());
+        return new ExecutionBlock[]{queue.removeLast()};
+      }
+      remaining += queue.size();
+    }
+    return remaining > 0 ? new ExecutionBlock[0] : null;
+  }
+
+  private boolean isExecutableNow(ExecutionBlock current) {
+    ExecutionBlock parent = masterPlan.getParent(current);
+
+    List<ExecutionBlock> dependents = masterPlan.getChilds(current);
+    if (parent != null && masterPlan.getChannel(current.getId(), parent.getId()).needShuffle()) {
+      // add all children of sibling for partitioning
+      dependents = new ArrayList<ExecutionBlock>();
+      for (ExecutionBlock sibling : masterPlan.getChilds(parent)) {
+        dependents.addAll(masterPlan.getChilds(sibling));
+      }
+    }
+    for (ExecutionBlock child : dependents) {
+      if (!executed.contains(child.getId())) {
+        return false;   // there's something should be done before this
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public Iterator<ExecutionBlock> iterator() {
+    return Iterables.concat(executable).iterator();
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
index 9148382..9f27eed 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanEqualityTester.java
@@ -47,8 +47,7 @@ public class GlobalPlanEqualityTester implements GlobalPlanRewriteRule {
   public MasterPlan rewrite(MasterPlan plan) {
     try {
       ExecutionBlockCursor cursor = new ExecutionBlockCursor(plan);
-      while (cursor.hasNext()) {
-        ExecutionBlock eb = cursor.nextBlock();
+      for (ExecutionBlock eb : cursor) {
         LogicalNode node = eb.getPlan();
         if (node != null) {
           PlanProto.LogicalNodeTree tree = LogicalNodeSerializer.serialize(node);

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainGlobalPlanPreprocessorForTest.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainGlobalPlanPreprocessorForTest.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainGlobalPlanPreprocessorForTest.java
index c26e12c..78cd015 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainGlobalPlanPreprocessorForTest.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainGlobalPlanPreprocessorForTest.java
@@ -44,8 +44,7 @@ public class ExplainGlobalPlanPreprocessorForTest {
   public void prepareTest(MasterPlan plan) {
     ExecutionBlockCursor cursor = new ExecutionBlockCursor(plan);
 
-    while (cursor.hasNext()) {
-      ExecutionBlock block = cursor.nextBlock();
+    for (ExecutionBlock block : cursor) {
       List<DataChannel> outgoingChannels = plan.getOutgoingChannels(block.getId());
       if (outgoingChannels != null) {
         for (DataChannel channel : outgoingChannels) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
index 45b23f8..562dbc3 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
@@ -105,8 +105,7 @@ public class NonForwardQueryResultSystemScanner implements NonForwardQueryResult
     
     ExecutionBlockCursor cursor = new ExecutionBlockCursor(masterPlan);
     ExecutionBlock leafBlock = null;
-    while (cursor.hasNext()) {
-      ExecutionBlock block = cursor.nextBlock();
+    for (ExecutionBlock block : cursor) {
       if (masterPlan.isLeaf(block)) {
         leafBlock = block;
         break;

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/master/rm/WorkerResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/rm/WorkerResource.java b/tajo-core/src/main/java/org/apache/tajo/master/rm/WorkerResource.java
index 5f2d33c..c2c0f88 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/rm/WorkerResource.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/rm/WorkerResource.java
@@ -76,8 +76,8 @@ public class WorkerResource {
   }
 
   public int getMemoryMB() {
+    rlock.lock();
     try {
-      rlock.lock();
       return memoryMB;
     } finally {
       rlock.unlock();
@@ -85,8 +85,8 @@ public class WorkerResource {
   }
 
   public void setMemoryMB(int memoryMB) {
+    wlock.lock();
     try {
-      wlock.lock();
       this.memoryMB = memoryMB;
     } finally {
       wlock.unlock();
@@ -112,8 +112,8 @@ public class WorkerResource {
   }
 
   public int getUsedMemoryMB() {
+    rlock.lock();
     try {
-      rlock.lock();
       return usedMemoryMB;
     } finally {
       rlock.unlock();
@@ -121,8 +121,8 @@ public class WorkerResource {
   }
 
   public void setUsedMemoryMB(int usedMemoryMB) {
+    wlock.lock();
     try {
-      wlock.lock();
       this.usedMemoryMB = usedMemoryMB;
     } finally {
       wlock.unlock();
@@ -142,9 +142,10 @@ public class WorkerResource {
   }
 
   public void releaseResource(float diskSlots, int memoryMB) {
+    LOG.info("Disk " + diskSlots + " slot(s), Memory " + memoryMB + " MB");
+    wlock.lock();
     try {
-      wlock.lock();
-      usedMemoryMB = usedMemoryMB - memoryMB;
+      usedMemoryMB -= memoryMB;
       usedDiskSlots -= diskSlots;
       if(usedMemoryMB < 0) {
         LOG.warn("Used memory can't be a minus: " + usedMemoryMB);
@@ -160,8 +161,9 @@ public class WorkerResource {
   }
 
   public void allocateResource(float diskSlots, int memoryMB) {
+    LOG.info("Disk " + diskSlots + " slot(s), Memory " + memoryMB + " MB");
+    wlock.lock();
     try {
-      wlock.lock();
       usedMemoryMB += memoryMB;
       usedDiskSlots += diskSlots;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
index 362dfa6..23808b5 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
@@ -40,6 +40,7 @@ import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.engine.planner.global.ExecutionBlockCursor;
+import org.apache.tajo.engine.planner.global.ExecutionQueue;
 import org.apache.tajo.engine.planner.global.MasterPlan;
 import org.apache.tajo.plan.logical.*;
 import org.apache.tajo.engine.query.QueryContext;
@@ -63,12 +64,13 @@ public class Query implements EventHandler<QueryEvent> {
   // Facilities for Query
   private final TajoConf systemConf;
   private final Clock clock;
-  private String queryStr;
-  private Map<ExecutionBlockId, Stage> stages;
+  private final String queryStr;
+  private final Map<ExecutionBlockId, Stage> stages;
   private final EventHandler eventHandler;
   private final MasterPlan plan;
   QueryMasterTask.QueryMasterTaskContext context;
   private ExecutionBlockCursor cursor;
+  private ExecutionQueue execution;
 
   // Query Status
   private final QueryId id;
@@ -77,7 +79,7 @@ public class Query implements EventHandler<QueryEvent> {
   private long finishTime;
   private TableDesc resultDesc;
   private int completedStagesCount = 0;
-  private int successedStagesCount = 0;
+  private int succeededStagesCount = 0;
   private int killedStagesCount = 0;
   private int failedStagesCount = 0;
   private int erroredStagesCount = 0;
@@ -93,7 +95,7 @@ public class Query implements EventHandler<QueryEvent> {
   private QueryState queryState;
 
   // Transition Handler
-  private static final SingleArcTransition INTERNAL_ERROR_TRANSITION = new InternalErrorTransition();
+  private static final InternalErrorTransition INTERNAL_ERROR_TRANSITION = new InternalErrorTransition();
   private static final DiagnosticsUpdateTransition DIAGNOSTIC_UPDATE_TRANSITION = new DiagnosticsUpdateTransition();
   private static final StageCompletedTransition STAGE_COMPLETED_TRANSITION = new StageCompletedTransition();
   private static final QueryCompletedTransition QUERY_COMPLETED_TRANSITION = new QueryCompletedTransition();
@@ -213,14 +215,12 @@ public class Query implements EventHandler<QueryEvent> {
     StringBuilder sb = new StringBuilder("\n=======================================================");
     sb.append("\nThe order of execution: \n");
     int order = 1;
-    while (cursor.hasNext()) {
-      ExecutionBlock currentEB = cursor.nextBlock();
+    for (ExecutionBlock currentEB : cursor) {
       sb.append("\n").append(order).append(": ").append(currentEB.getId());
       order++;
     }
     sb.append("\n=======================================================");
     LOG.info(sb);
-    cursor.reset();
 
     ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
     this.readLock = readWriteLock.readLock();
@@ -381,6 +381,14 @@ public class Query implements EventHandler<QueryEvent> {
     return cursor;
   }
 
+  public ExecutionQueue newExecutionQueue() {
+    return execution = cursor.newCursor();
+  }
+
+  public ExecutionQueue getExecutionQueue() {
+    return execution;
+  }
+
   public static class StartTransition
       implements SingleArcTransition<Query, QueryEvent> {
 
@@ -388,12 +396,15 @@ public class Query implements EventHandler<QueryEvent> {
     public void transition(Query query, QueryEvent queryEvent) {
 
       query.setStartTime();
-      Stage stage = new Stage(query.context, query.getPlan(),
-          query.getExecutionBlockCursor().nextBlock());
-      stage.setPriority(query.priority--);
-      query.addStage(stage);
-      stage.getEventHandler().handle(new StageEvent(stage.getId(), StageEventType.SQ_INIT));
-      LOG.debug("Schedule unit plan: \n" + stage.getBlock().getPlan());
+      ExecutionQueue executionQueue = query.newExecutionQueue();
+      for (ExecutionBlock executionBlock : executionQueue.first()) {
+        Stage stage = new Stage(query.context, query.getPlan(), executionBlock);
+        stage.setPriority(query.priority--);
+        query.addStage(stage);
+
+        stage.getEventHandler().handle(new StageEvent(stage.getId(), StageEventType.SQ_INIT));
+        LOG.debug("Schedule unit plan: \n" + stage.getBlock().getPlan());
+      }
     }
   }
 
@@ -616,25 +627,31 @@ public class Query implements EventHandler<QueryEvent> {
 
   public static class StageCompletedTransition implements SingleArcTransition<Query, QueryEvent> {
 
-    private boolean hasNext(Query query) {
-      ExecutionBlockCursor cursor = query.getExecutionBlockCursor();
-      ExecutionBlock nextBlock = cursor.peek();
-      return !query.getPlan().isTerminal(nextBlock);
-    }
-
-    private void executeNextBlock(Query query) {
-      ExecutionBlockCursor cursor = query.getExecutionBlockCursor();
-      ExecutionBlock nextBlock = cursor.nextBlock();
-      Stage nextStage = new Stage(query.context, query.getPlan(), nextBlock);
-      nextStage.setPriority(query.priority--);
-      query.addStage(nextStage);
-      nextStage.getEventHandler().handle(new StageEvent(nextStage.getId(), StageEventType.SQ_INIT));
-
-      LOG.info("Scheduling Stage:" + nextStage.getId());
-      if(LOG.isDebugEnabled()) {
-        LOG.debug("Scheduling Stage's Priority: " + nextStage.getPriority());
-        LOG.debug("Scheduling Stage's Plan: \n" + nextStage.getBlock().getPlan());
+    // return true for terminal
+    private synchronized boolean executeNextBlock(Query query, ExecutionBlockId blockId) {
+      ExecutionQueue cursor = query.getExecutionQueue();
+      ExecutionBlock[] nextBlocks = cursor.next(blockId);
+      if (nextBlocks == null || nextBlocks.length == 0) {
+        return nextBlocks == null;
+      }
+      boolean terminal = true;
+      for (ExecutionBlock nextBlock : nextBlocks) {
+        if (query.getPlan().isTerminal(nextBlock)) {
+          continue;
+        }
+        Stage nextStage = new Stage(query.context, query.getPlan(), nextBlock);
+        nextStage.setPriority(query.priority--);
+        query.addStage(nextStage);
+        nextStage.getEventHandler().handle(new StageEvent(nextStage.getId(), StageEventType.SQ_INIT));
+
+        LOG.info("Scheduling Stage:" + nextStage.getId());
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Scheduling Stage's Priority: " + nextStage.getPriority());
+          LOG.debug("Scheduling Stage's Plan: \n" + nextStage.getBlock().getPlan());
+        }
+        terminal = false;
       }
+      return terminal;
     }
 
     @Override
@@ -647,7 +664,7 @@ public class Query implements EventHandler<QueryEvent> {
         StageCompletedEvent castEvent = (StageCompletedEvent) event;
 
         if (castEvent.getState() == StageState.SUCCEEDED) {
-          query.successedStagesCount++;
+          query.succeededStagesCount++;
         } else if (castEvent.getState() == StageState.KILLED) {
           query.killedStagesCount++;
         } else if (castEvent.getState() == StageState.FAILED) {
@@ -663,11 +680,11 @@ public class Query implements EventHandler<QueryEvent> {
         // if a stage is succeeded and a query is running
         if (castEvent.getState() == StageState.SUCCEEDED &&  // latest stage succeeded
             query.getSynchronizedState() == QueryState.QUERY_RUNNING &&     // current state is not in KILL_WAIT, FAILED, or ERROR.
-            hasNext(query)) {                                   // there remains at least one stage.
-          executeNextBlock(query);
-        } else { // if a query is completed due to finished, kill, failure, or error
-          query.eventHandler.handle(new QueryCompletedEvent(castEvent.getExecutionBlockId(), castEvent.getState()));
+            !executeNextBlock(query, castEvent.getExecutionBlockId())) {
+          return;
         }
+         // if a query is completed due to finished, kill, failure, or error
+        query.eventHandler.handle(new QueryCompletedEvent(castEvent.getExecutionBlockId(), castEvent.getState()));
       } catch (Throwable t) {
         LOG.error(t.getMessage(), t);
         query.eventHandler.handle(new QueryEvent(event.getQueryId(), QueryEventType.INTERNAL_ERROR));

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
index f4818f6..9b5980b 100644
--- a/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-core/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -133,7 +133,7 @@ public class TajoTestingCluster {
       Preconditions.checkState(testResourceManager.equals(TajoWorkerResourceManager.class.getCanonicalName()));
       conf.set(ConfVars.RESOURCE_MANAGER_CLASS.varname, System.getProperty(ConfVars.RESOURCE_MANAGER_CLASS.varname));
     }
-    conf.setInt(ConfVars.WORKER_RESOURCE_AVAILABLE_MEMORY_MB.varname, 1024);
+    conf.setInt(ConfVars.WORKER_RESOURCE_AVAILABLE_MEMORY_MB.varname, 2048);
     conf.setFloat(ConfVars.WORKER_RESOURCE_AVAILABLE_DISKS.varname, 2.0f);
 
 
@@ -156,14 +156,15 @@ public class TajoTestingCluster {
     conf.setIntVar(ConfVars.SHUFFLE_RPC_SERVER_WORKER_THREAD_NUM, 2);
 
     // Resource allocator
-    conf.setIntVar(ConfVars.YARN_RM_TASKRUNNER_LAUNCH_PARALLEL_NUM, 2);
+    conf.setIntVar(ConfVars.$QUERY_EXECUTE_PARALLEL_MAX, 3);
+    conf.setIntVar(ConfVars.YARN_RM_TASKRUNNER_LAUNCH_PARALLEL_NUM, 6);   // make twice of parallel_max
 
     // Memory cache termination
     conf.setIntVar(ConfVars.WORKER_HISTORY_EXPIRE_PERIOD, 1);
 
     conf.setStrings(ConfVars.PYTHON_CODE_DIR.varname, getClass().getResource("/python").toString());
 
-    /* Since Travi CI limits the size of standard output log up to 4MB */
+    /* Since Travis CI limits the size of standard output log up to 4MB */
     if (!StringUtils.isEmpty(LOG_LEVEL)) {
       Level defaultLevel = Logger.getRootLogger().getLevel();
       Logger.getLogger("org.apache.tajo").setLevel(Level.toLevel(LOG_LEVEL.toUpperCase(), defaultLevel));
@@ -254,7 +255,7 @@ public class TajoTestingCluster {
     builder.waitSafeMode(true);
     this.dfsCluster = builder.build();
 
-    // Set this just-started cluser as our filesystem.
+    // Set this just-started cluster as our filesystem.
     this.defaultFS = this.dfsCluster.getFileSystem();
     this.conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, defaultFS.getUri().toString());
     this.conf.setVar(TajoConf.ConfVars.ROOT_DIR, defaultFS.getUri() + "/tajo");

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
index c82637d..0f90722 100644
--- a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
+++ b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
@@ -26,6 +26,7 @@ import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.engine.parser.SQLAnalyzer;
+import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -115,8 +116,7 @@ public class TestExecutionBlockCursor {
     ExecutionBlockCursor cursor = new ExecutionBlockCursor(plan);
 
     int count = 0;
-    while(cursor.hasNext()) {
-      cursor.nextBlock();
+    for (ExecutionBlock eb : cursor) {
       count++;
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/c2725a77/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result b/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
index bcd8970..7e741a9 100644
--- a/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
+++ b/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
@@ -26,6 +26,7 @@ Available Session Variables:
 \set GROUPBY_PER_SHUFFLE_SIZE [int value] - shuffle output size for sort (mb)
 \set TABLE_PARTITION_PER_SHUFFLE_SIZE [int value] - shuffle output size for partition table write (mb)
 \set GROUPBY_MULTI_LEVEL_ENABLED [true or false] - Multiple level groupby enabled
+\set QUERY_EXECUTE_PARALLEL [int value] - Maximum parallel running of execution blocks for a query
 \set EXTSORT_BUFFER_SIZE [long value] - sort buffer size for external sort (mb)
 \set HASH_JOIN_SIZE_LIMIT [long value] - limited size for hash join (mb)
 \set INNER_HASH_JOIN_SIZE_LIMIT [long value] - limited size for hash inner join (mb)


[20/24] tajo git commit: TAJO-1630: Test failure after TAJO-1130. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort_NoBroadcast.plan
index 73478b2..21bb1de 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable4.Sort_NoBroadcast.plan
@@ -126,22 +126,6 @@ GROUP_BY(17)()
         => in schema: {(1) default.customer.c_custkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [ROOT]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
-
-GROUP_BY(9)()
-  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
-  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
-  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
-  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000003
-     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [LEAF]
 =======================================================
 
@@ -166,6 +150,22 @@ SCAN(5) on default.empty_orders
   => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+GROUP_BY(9)()
+  => exprs: (max(?max_12 (INT4)),sum(?sum_13 (INT8)),max(?max_14 (TEXT)),max(?max_15 (TEXT)))
+  => target list: ?max (INT4), ?sum_1 (INT8), ?max_2 (TEXT), ?max_3 (TEXT)
+  => out schema:{(4) ?max (INT4), ?max_2 (TEXT), ?max_3 (TEXT), ?sum_1 (INT8)}
+  => in schema:{(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+     => in schema: {(4) ?max_12 (INT4), ?sum_13 (INT8), ?max_14 (TEXT), ?max_15 (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash.plan
index b9b9adf..f33e844 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash.plan
@@ -79,6 +79,24 @@ GROUP_BY(15)(id)
      => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
+
+GROUP_BY(17)(id)
+  => exprs: (count())
+  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
+  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
+  => in schema:{(1) default.jointable_large.id (INT4)}
+   SCAN(4) on default.jointable_large
+     => filter: default.jointable_large.id (INT4) < 200
+     => target list: default.jointable_large.id (INT4)
+     => out schema: {(1) default.jointable_large.id (INT4)}
+     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 =======================================================
 
@@ -106,24 +124,6 @@ TABLE_SUBQUERY(3) as default.a
            => in schema: {(2) default.jointable_large.id (INT4), ?count_4 (INT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
-
-GROUP_BY(17)(id)
-  => exprs: (count())
-  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
-  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
-  => in schema:{(1) default.jointable_large.id (INT4)}
-   SCAN(4) on default.jointable_large
-     => filter: default.jointable_large.id (INT4) < 200
-     => target list: default.jointable_large.id (INT4)
-     => out schema: {(1) default.jointable_large.id (INT4)}
-     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash_NoBroadcast.plan
index b9b9adf..f33e844 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Hash_NoBroadcast.plan
@@ -79,6 +79,24 @@ GROUP_BY(15)(id)
      => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
+
+GROUP_BY(17)(id)
+  => exprs: (count())
+  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
+  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
+  => in schema:{(1) default.jointable_large.id (INT4)}
+   SCAN(4) on default.jointable_large
+     => filter: default.jointable_large.id (INT4) < 200
+     => target list: default.jointable_large.id (INT4)
+     => out schema: {(1) default.jointable_large.id (INT4)}
+     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 =======================================================
 
@@ -106,24 +124,6 @@ TABLE_SUBQUERY(3) as default.a
            => in schema: {(2) default.jointable_large.id (INT4), ?count_4 (INT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
-
-GROUP_BY(17)(id)
-  => exprs: (count())
-  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
-  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
-  => in schema:{(1) default.jointable_large.id (INT4)}
-   SCAN(4) on default.jointable_large
-     => filter: default.jointable_large.id (INT4) < 200
-     => target list: default.jointable_large.id (INT4)
-     => out schema: {(1) default.jointable_large.id (INT4)}
-     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort.plan
index b9b9adf..f33e844 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort.plan
@@ -79,6 +79,24 @@ GROUP_BY(15)(id)
      => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
+
+GROUP_BY(17)(id)
+  => exprs: (count())
+  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
+  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
+  => in schema:{(1) default.jointable_large.id (INT4)}
+   SCAN(4) on default.jointable_large
+     => filter: default.jointable_large.id (INT4) < 200
+     => target list: default.jointable_large.id (INT4)
+     => out schema: {(1) default.jointable_large.id (INT4)}
+     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 =======================================================
 
@@ -106,24 +124,6 @@ TABLE_SUBQUERY(3) as default.a
            => in schema: {(2) default.jointable_large.id (INT4), ?count_4 (INT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
-
-GROUP_BY(17)(id)
-  => exprs: (count())
-  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
-  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
-  => in schema:{(1) default.jointable_large.id (INT4)}
-   SCAN(4) on default.jointable_large
-     => filter: default.jointable_large.id (INT4) < 200
-     => target list: default.jointable_large.id (INT4)
-     => out schema: {(1) default.jointable_large.id (INT4)}
-     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort_NoBroadcast.plan
index b9b9adf..f33e844 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort_NoBroadcast.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testJoinWithDifferentShuffleKey.1.Sort_NoBroadcast.plan
@@ -79,6 +79,24 @@ GROUP_BY(15)(id)
      => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
+
+GROUP_BY(17)(id)
+  => exprs: (count())
+  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
+  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
+  => in schema:{(1) default.jointable_large.id (INT4)}
+   SCAN(4) on default.jointable_large
+     => filter: default.jointable_large.id (INT4) < 200
+     => target list: default.jointable_large.id (INT4)
+     => out schema: {(1) default.jointable_large.id (INT4)}
+     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 =======================================================
 
@@ -106,24 +124,6 @@ TABLE_SUBQUERY(3) as default.a
            => in schema: {(2) default.jointable_large.id (INT4), ?count_4 (INT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.jointable_large.id (INT4), num=32)
-
-GROUP_BY(17)(id)
-  => exprs: (count())
-  => target list: default.jointable_large.id (INT4), ?count_5 (INT8)
-  => out schema:{(2) default.jointable_large.id (INT4), ?count_5 (INT8)}
-  => in schema:{(1) default.jointable_large.id (INT4)}
-   SCAN(4) on default.jointable_large
-     => filter: default.jointable_large.id (INT4) < 200
-     => target list: default.jointable_large.id (INT4)
-     => out schema: {(1) default.jointable_large.id (INT4)}
-     => in schema: {(2) default.jointable_large.id (INT4), default.jointable_large.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
index a2beae2..ef0f8f8 100644
--- a/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
+++ b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
@@ -133,29 +133,6 @@ SCAN(7) on default.part
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-
-JOIN(12)(INNER)
-  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
-  => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-  => in schema: {(12) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-   SCAN(19) on eb_0000000000000_0000_000004
-     => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
-     => in schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
-   SCAN(18) on eb_0000000000000_0000_000003
-     => out schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-     => in schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000006 [LEAF]
 =======================================================
 
@@ -181,6 +158,29 @@ SCAN(0) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(12)(INNER)
+  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+  => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+  => in schema: {(12) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   SCAN(19) on eb_0000000000000_0000_000004
+     => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+     => in schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
 =======================================================
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f4680a93/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
index 95abaf1..a466b20 100644
--- a/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
+++ b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
@@ -122,29 +122,6 @@ SCAN(1) on default.orders
   => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
-[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
-
-JOIN(16)(INNER)
-  => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
-  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)
-  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
-  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.orders.o_orderkey (INT4)}
-   SCAN(23) on eb_0000000000000_0000_000002
-     => out schema: {(1) default.orders.o_orderkey (INT4)}
-     => in schema: {(1) default.orders.o_orderkey (INT4)}
-   SCAN(22) on eb_0000000000000_0000_000001
-     => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
-     => in schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000004 [LEAF]
 =======================================================
 
@@ -169,6 +146,29 @@ SCAN(0) on default.customer
   => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
+
+JOIN(16)(INNER)
+  => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
+  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)
+  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.orders.o_orderkey (INT4)}
+   SCAN(23) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.orders.o_orderkey (INT4)}
+     => in schema: {(1) default.orders.o_orderkey (INT4)}
+   SCAN(22) on eb_0000000000000_0000_000001
+     => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+     => in schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
 =======================================================
 
@@ -192,29 +192,6 @@ JOIN(17)(INNER)
      => in schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 11 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
-
-JOIN(18)(INNER)
-  => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
-  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
-  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
-  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
-   SCAN(27) on eb_0000000000000_0000_000006
-     => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
-     => in schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
-   SCAN(26) on eb_0000000000000_0000_000003
-     => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
-     => in schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000008 [LEAF]
 =======================================================
 
@@ -240,6 +217,29 @@ SCAN(5) on default.region
   => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 
 =======================================================
+Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
+[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 7 => 11 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(18)(INNER)
+  => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
+  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
+  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
+  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+   SCAN(27) on eb_0000000000000_0000_000006
+     => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+     => in schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+   SCAN(26) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+     => in schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+
+=======================================================
 Block Id: eb_0000000000000_0000_000010 [INTERMEDIATE]
 =======================================================
 


[22/24] tajo git commit: TAJO-1626: JdbcConnection::setAutoCommit() should not throw an exception.

Posted by ji...@apache.org.
TAJO-1626: JdbcConnection::setAutoCommit() should not throw an exception.

Closes #589


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

Branch: refs/heads/index_support
Commit: 39fdadcf760729e3b933a033aec52aaeadd7ec03
Parents: f4680a9
Author: Hyunsik Choi <hy...@apache.org>
Authored: Thu May 28 05:06:32 2015 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu May 28 05:06:32 2015 -0700

----------------------------------------------------------------------
 CHANGES                                                          | 3 +++
 tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/39fdadcf/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 7c79805..7023419 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1626: JdbcConnection::setAutoCommit() should not throw an exception.
+    (hyunsik)
+
     TAJO-1130: Concurrent execution of independent execution blocks.
     (Contributed by navis, Committed by jihoon)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/39fdadcf/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
index 959860d..c5d4868 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/JdbcConnection.java
@@ -360,7 +360,7 @@ public class JdbcConnection implements Connection {
 
   @Override
   public void setAutoCommit(boolean autoCommit) throws SQLException {
-    throw new SQLFeatureNotSupportedException("setAutoCommit");
+    LOG.warn("Tajo does not support setAutoCommit, so this invocation is ignored.");
   }
 
   @Override


[06/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Sort.plan
index c4c25da..45b95c2 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinWithSubQuery/testLeftOuterJoinWithEmptySubquery2.1.Sort.plan
@@ -34,82 +34,52 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
 |-eb_0000000000000_0000_000006
    |-eb_0000000000000_0000_000005
-      |-eb_0000000000000_0000_000004
-      |-eb_0000000000000_0000_000003
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
-4: eb_0000000000000_0000_000006
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.lineitem
- 1: type=Broadcast, tables=default.jointable12
-
-TABLE_SUBQUERY(4) as default.a
-  => Targets: default.a.id (INT4)
-  => out schema: {(1) default.a.id (INT4)}
-  => in  schema: {(3) default.a.id (INT4), default.a.name (TEXT), default.a.l_shipdate (TEXT)}
-   PROJECTION(3)
-     => Targets: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
-     => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-     => in  schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-      JOIN(9)(INNER)
-        => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
-        => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
-        => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
-        => in schema: {(4) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
-         SCAN(0) on default.jointable12
-           => filter: default.jointable12.id (INT4) > 10
-           => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT)
-           => out schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-           => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
-         SCAN(1) on default.lineitem
-           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)
-           => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
-           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000004 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
-
-SCAN(5) on default.jointable11 as b
-  => target list: default.b.id (INT4)
-  => out schema: {(1) default.b.id (INT4)}
-  => in schema: {(2) default.b.id (INT4), default.b.name (TEXT)}
-
-=======================================================
 Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
-[Incoming]
-[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.a.id (INT4), num=32)
-[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.id (INT4), num=32)
+[Enforcers]
+ 0: type=Broadcast, tables=default.jointable12
+ 1: type=Broadcast, tables=default.b
 
 JOIN(10)(LEFT_OUTER)
   => Join Cond: default.a.id (INT4) = default.b.id (INT4)
   => target list: default.a.id (INT4), default.b.id (INT4)
   => out schema: {(2) default.a.id (INT4), default.b.id (INT4)}
   => in schema: {(2) default.a.id (INT4), default.b.id (INT4)}
-   SCAN(13) on eb_0000000000000_0000_000004
+   SCAN(5) on default.jointable11 as b
+     => target list: default.b.id (INT4)
      => out schema: {(1) default.b.id (INT4)}
-     => in schema: {(1) default.b.id (INT4)}
-   SCAN(12) on eb_0000000000000_0000_000003
+     => in schema: {(2) default.b.id (INT4), default.b.name (TEXT)}
+   TABLE_SUBQUERY(4) as default.a
+     => Targets: default.a.id (INT4)
      => out schema: {(1) default.a.id (INT4)}
-     => in schema: {(1) default.a.id (INT4)}
+     => in  schema: {(3) default.a.id (INT4), default.a.name (TEXT), default.a.l_shipdate (TEXT)}
+      PROJECTION(3)
+        => Targets: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
+        => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+        => in  schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+         JOIN(9)(INNER)
+           => Join Cond: default.jointable12.id (INT4) = default.lineitem.l_orderkey (INT4)
+           => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)
+           => out schema: {(3) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_shipdate (TEXT)}
+           => in schema: {(4) default.jointable12.id (INT4), default.jointable12.name (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
+            SCAN(0) on default.jointable12
+              => filter: default.jointable12.id (INT4) > 10
+              => target list: default.jointable12.id (INT4), default.jointable12.name (TEXT)
+              => out schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+              => in schema: {(2) default.jointable12.id (INT4), default.jointable12.name (TEXT)}
+            SCAN(1) on default.lineitem
+              => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)
+              => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_shipdate (TEXT)}
+              => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000006 [TERMINAL]

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan b/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
new file mode 100644
index 0000000..17a7658
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
@@ -0,0 +1,112 @@
+explain
+-------------------------------
+SORT(6)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+   TABLE_SUBQUERY(5) as default.l2
+     => Targets: default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)
+     => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+     => in  schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+      TABLE_SUBQUERY(3) as default.l1
+        => Targets: default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)
+        => out schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+        => in  schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+         GROUP_BY(1)(l_orderkey)
+           => exprs: (sum(?multiply (FLOAT8)))
+           => target list: default.lineitem.l_orderkey (INT4), revenue (FLOAT8)
+           => out schema:{(2) default.lineitem.l_orderkey (INT4), revenue (FLOAT8)}
+           => in schema:{(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4)}
+            SCAN(0) on default.lineitem
+              => target list: default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * default.lineitem.l_discount (FLOAT8) as ?multiply
+              => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4)}
+              => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000004
+   |-eb_0000000000000_0000_000003
+      |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 2 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
+
+GROUP_BY(10)(l_orderkey)
+  => exprs: (sum(?multiply (FLOAT8)))
+  => target list: default.lineitem.l_orderkey (INT4), ?sum_1 (FLOAT8)
+  => out schema:{(2) default.lineitem.l_orderkey (INT4), ?sum_1 (FLOAT8)}
+  => in schema:{(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4)}
+   SCAN(0) on default.lineitem
+     => target list: default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * default.lineitem.l_discount (FLOAT8) as ?multiply
+     => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4)}
+     => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 2 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, key=default.l2.l_orderkey (INT4), num=32)
+
+SORT(12)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+   TABLE_SUBQUERY(5) as default.l2
+     => Targets: default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)
+     => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+     => in  schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+      PROJECTION(4)
+        => Targets: default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)
+        => out schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+        => in  schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+         TABLE_SUBQUERY(3) as default.l1
+           => Targets: default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)
+           => out schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+           => in  schema: {(2) default.l1.l_orderkey (INT4), default.l1.revenue (FLOAT8)}
+            PROJECTION(2)
+              => Targets: default.lineitem.l_orderkey (INT4), revenue (FLOAT8)
+              => out schema: {(2) default.lineitem.l_orderkey (INT4), revenue (FLOAT8)}
+              => in  schema: {(2) default.lineitem.l_orderkey (INT4), revenue (FLOAT8)}
+               GROUP_BY(1)(l_orderkey)
+                 => exprs: (sum(?sum_1 (FLOAT8)))
+                 => target list: default.lineitem.l_orderkey (INT4), revenue (FLOAT8)
+                 => out schema:{(2) default.lineitem.l_orderkey (INT4), revenue (FLOAT8)}
+                 => in schema:{(2) default.lineitem.l_orderkey (INT4), ?sum_1 (FLOAT8)}
+                  SCAN(11) on eb_0000000000000_0000_000001
+                    => out schema: {(2) default.lineitem.l_orderkey (INT4), ?sum_1 (FLOAT8)}
+                    => in schema: {(2) default.lineitem.l_orderkey (INT4), ?sum_1 (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, key=default.l2.l_orderkey (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000002
+
+SORT(6)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+   SCAN(13) on eb_0000000000000_0000_000002
+     => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+     => in schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.result b/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.result
new file mode 100644
index 0000000..2b63526
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.result
@@ -0,0 +1,5 @@
+l_orderkey,revenue
+-------------------------------
+1,4985.2136
+2,0.0
+3,7923.13

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.plan b/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
new file mode 100644
index 0000000..4cf1bac
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
@@ -0,0 +1,88 @@
+explain
+-------------------------------
+SORT(2)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc),default.lineitem.l_linestatus (TEXT) (asc)
+   GROUP_BY(1)(l_returnflag,l_linestatus)
+     => exprs: (count())
+     => target list: default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), count_order (INT8)
+     => out schema:{(3) count_order (INT8), default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+     => in schema:{(2) default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+      SCAN(0) on default.lineitem
+        => target list: default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)
+        => out schema: {(2) default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000004
+   |-eb_0000000000000_0000_000003
+      |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 2 (type=HASH_SHUFFLE, key=default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT), num=32)
+
+GROUP_BY(6)(l_linestatus,l_returnflag)
+  => exprs: (count())
+  => target list: default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), ?count (INT8)
+  => out schema:{(3) default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), ?count (INT8)}
+  => in schema:{(2) default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+   SCAN(0) on default.lineitem
+     => target list: default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)
+     => out schema: {(2) default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+     => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 2 (type=HASH_SHUFFLE, key=default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, key=default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT), num=32)
+
+SORT(8)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc),default.lineitem.l_linestatus (TEXT) (asc)
+   GROUP_BY(1)(l_returnflag,l_linestatus)
+     => exprs: (count(?count (INT8)))
+     => target list: default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), count_order (INT8)
+     => out schema:{(3) count_order (INT8), default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+     => in schema:{(3) default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), ?count (INT8)}
+      SCAN(7) on eb_0000000000000_0000_000001
+        => out schema: {(3) default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), ?count (INT8)}
+        => in schema: {(3) default.lineitem.l_returnflag (TEXT), default.lineitem.l_linestatus (TEXT), ?count (INT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, key=default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000002
+
+SORT(2)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc),default.lineitem.l_linestatus (TEXT) (asc)
+   SCAN(9) on eb_0000000000000_0000_000002
+     => out schema: {(3) count_order (INT8), default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+     => in schema: {(3) count_order (INT8), default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.result b/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.result
index 94b5e84..a34b514 100644
--- a/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.result
+++ b/tajo-core/src/test/resources/results/TestTPCH/testQ1OrderBy.result
@@ -1,4 +1,4 @@
 l_returnflag,l_linestatus,count_order
 -------------------------------
 N,O,3
-R,F,2
\ No newline at end of file
+R,F,2

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
new file mode 100644
index 0000000..a2beae2
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
@@ -0,0 +1,228 @@
+explain
+-------------------------------
+JOIN(14)(INNER)
+  => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+  => target list: default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)
+  => out schema: {(12) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
+  => in schema: {(14) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   JOIN(13)(INNER)
+     => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+     => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)
+     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)}
+     => in schema: {(5) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+      SCAN(0) on default.region
+        => filter: default.region.r_name (TEXT) = AMERICA
+        => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
+        => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+        => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+      SCAN(1) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+        => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+   JOIN(12)(INNER)
+     => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+     => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+     => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(12) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+      SCAN(7) on default.part
+        => filter: default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS'
+        => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)
+        => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+        => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+      JOIN(11)(INNER)
+        => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
+        => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+        => out schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+        => in schema: {(10) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+         SCAN(5) on default.partsupp
+           => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)
+           => out schema: {(3) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+           => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+         SCAN(3) on default.supplier
+           => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+           => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+           => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000010)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000010
+   |-eb_0000000000000_0000_000009
+      |-eb_0000000000000_0000_000008
+         |-eb_0000000000000_0000_000007
+         |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+         |-eb_0000000000000_0000_000003
+            |-eb_0000000000000_0000_000002
+            |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000006
+6: eb_0000000000000_0000_000007
+7: eb_0000000000000_0000_000005
+8: eb_0000000000000_0000_000008
+9: eb_0000000000000_0000_000009
+10: eb_0000000000000_0000_000010
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
+
+SCAN(3) on default.supplier
+  => target list: default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)
+  => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+  => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
+
+SCAN(5) on default.partsupp
+  => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)
+  => out schema: {(3) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+  => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
+
+JOIN(11)(INNER)
+  => Join Cond: default.supplier.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
+  => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+  => out schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+  => in schema: {(10) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+   SCAN(17) on eb_0000000000000_0000_000002
+     => out schema: {(3) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+     => in schema: {(3) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+   SCAN(16) on eb_0000000000000_0000_000001
+     => out schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+     => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+SCAN(7) on default.part
+  => filter: default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS'
+  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)
+  => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.partsupp.ps_partkey (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(12)(INNER)
+  => Join Cond: default.part.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+  => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)
+  => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+  => in schema: {(12) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   SCAN(19) on eb_0000000000000_0000_000004
+     => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+     => in schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
+   SCAN(18) on eb_0000000000000_0000_000003
+     => out schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(8) default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 8 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+
+SCAN(1) on default.nation
+  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+  => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 7 => 8 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+SCAN(0) on default.region
+  => filter: default.region.r_name (TEXT) = AMERICA
+  => target list: default.region.r_name (TEXT), default.region.r_regionkey (INT4)
+  => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+  => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 6 => 8 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 7 => 8 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
+
+JOIN(13)(INNER)
+  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)
+  => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)}
+  => in schema: {(5) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+   SCAN(21) on eb_0000000000000_0000_000007
+     => out schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+     => in schema: {(2) default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+   SCAN(20) on eb_0000000000000_0000_000006
+     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+     => in schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000009 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 5 => 9 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 8 => 9 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
+
+JOIN(14)(INNER)
+  => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+  => target list: default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)
+  => out schema: {(12) default.nation.n_name (TEXT), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_phone (TEXT)}
+  => in schema: {(14) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.region.r_name (TEXT), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+   SCAN(23) on eb_0000000000000_0000_000008
+     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)}
+     => in schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.region.r_name (TEXT)}
+   SCAN(22) on eb_0000000000000_0000_000005
+     => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+     => in schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000010 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.result b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.result
index 7c81978..64d8e12 100644
--- a/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.result
+++ b/tajo-core/src/test/resources/results/TestTPCH/testQ2FourJoins.result
@@ -1,3 +1,3 @@
 s_acctbal,s_name,n_name,p_partkey,p_mfgr,s_address,s_phone,s_comment,ps_supplycost,r_name,p_type,p_size
 -------------------------------
-4192.4,Supplier#000000003,ARGENTINA,2,Manufacturer#1,q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3,11-383-516-1199,blithely silent requests after the express dependencies are sl,1.01,AMERICA,LARGE BRUSHED BRASS,15
\ No newline at end of file
+4192.4,Supplier#000000003,ARGENTINA,2,Manufacturer#1,q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3,11-383-516-1199,blithely silent requests after the express dependencies are sl,1.01,AMERICA,LARGE BRUSHED BRASS,15

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.plan b/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.plan
new file mode 100644
index 0000000..8a716eb
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.plan
@@ -0,0 +1,119 @@
+explain
+-------------------------------
+PROJECTION(3)
+  => Targets: 100.0 * ?sum_1 (FLOAT8) / ?sum_3 (FLOAT8) as promo_revenue
+  => out schema: {(1) promo_revenue (FLOAT8)}
+  => in  schema: {(2) ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)}
+   GROUP_BY(5)()
+     => exprs: (sum(?casewhen (FLOAT8)),sum(?multiply_2 (FLOAT8)))
+     => target list: ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)
+     => out schema:{(2) ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)}
+     => in schema:{(2) ?casewhen (FLOAT8), ?multiply_2 (FLOAT8)}
+      JOIN(7)(INNER)
+        => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+        => target list: CASE WHEN default.part.p_type (TEXT)LIKE'PROMO%' THEN default.lineitem.l_extendedprice (FLOAT8) ELSE 0.0 END as ?casewhen, ?multiply_2 (FLOAT8)
+        => out schema: {(2) ?casewhen (FLOAT8), ?multiply_2 (FLOAT8)}
+        => in schema: {(5) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4), default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+         SCAN(1) on default.part
+           => target list: default.part.p_partkey (INT4), default.part.p_type (TEXT)
+           => out schema: {(2) default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+         SCAN(0) on default.lineitem
+           => target list: default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * 1.0 - default.lineitem.l_discount (FLOAT8) as ?multiply_2
+           => out schema: {(3) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4)}
+           => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000005
+   |-eb_0000000000000_0000_000004
+      |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
+
+SCAN(0) on default.lineitem
+  => target list: default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * 1.0 - default.lineitem.l_discount (FLOAT8) as ?multiply_2
+  => out schema: {(3) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+SCAN(1) on default.part
+  => target list: default.part.p_partkey (INT4), default.part.p_type (TEXT)
+  => out schema: {(2) default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+  => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_partkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+GROUP_BY(11)()
+  => exprs: (sum(?casewhen (FLOAT8)),sum(?multiply_2 (FLOAT8)))
+  => target list: ?sum_6 (FLOAT8), ?sum_7 (FLOAT8)
+  => out schema:{(2) ?sum_6 (FLOAT8), ?sum_7 (FLOAT8)}
+  => in schema:{(2) ?casewhen (FLOAT8), ?multiply_2 (FLOAT8)}
+   JOIN(7)(INNER)
+     => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+     => target list: CASE WHEN default.part.p_type (TEXT)LIKE'PROMO%' THEN default.lineitem.l_extendedprice (FLOAT8) ELSE 0.0 END as ?casewhen, ?multiply_2 (FLOAT8)
+     => out schema: {(2) ?casewhen (FLOAT8), ?multiply_2 (FLOAT8)}
+     => in schema: {(5) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4), default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+      SCAN(10) on eb_0000000000000_0000_000002
+        => out schema: {(2) default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+        => in schema: {(2) default.part.p_partkey (INT4), default.part.p_type (TEXT)}
+      SCAN(9) on eb_0000000000000_0000_000001
+        => out schema: {(3) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4)}
+        => in schema: {(3) ?multiply_2 (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_partkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=, num=1)
+
+PROJECTION(3)
+  => Targets: 100.0 * ?sum_1 (FLOAT8) / ?sum_3 (FLOAT8) as promo_revenue
+  => out schema: {(1) promo_revenue (FLOAT8)}
+  => in  schema: {(2) ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)}
+   GROUP_BY(5)()
+     => exprs: (sum(?sum_6 (FLOAT8)),sum(?sum_7 (FLOAT8)))
+     => target list: ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)
+     => out schema:{(2) ?sum_1 (FLOAT8), ?sum_3 (FLOAT8)}
+     => in schema:{(2) ?sum_6 (FLOAT8), ?sum_7 (FLOAT8)}
+      SCAN(12) on eb_0000000000000_0000_000003
+        => out schema: {(2) ?sum_6 (FLOAT8), ?sum_7 (FLOAT8)}
+        => in schema: {(2) ?sum_6 (FLOAT8), ?sum_7 (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.result b/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.result
index 6bc69cc..ace2a07 100644
--- a/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.result
+++ b/tajo-core/src/test/resources/results/TestTPCH/testTPCH14Expr.result
@@ -1,3 +1,3 @@
 promo_revenue
 -------------------------------
-33.610645634855025
\ No newline at end of file
+33.610645634855025

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
new file mode 100644
index 0000000..95abaf1
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.plan
@@ -0,0 +1,332 @@
+explain
+-------------------------------
+SORT(8)
+  => Sort Keys: revenue (FLOAT8) (desc)
+   GROUP_BY(7)(n_name)
+     => exprs: (sum(?multiply (FLOAT8)))
+     => target list: default.nation.n_name (TEXT), revenue (FLOAT8)
+     => out schema:{(2) default.nation.n_name (TEXT), revenue (FLOAT8)}
+     => in schema:{(2) ?multiply (FLOAT8), default.nation.n_name (TEXT)}
+      JOIN(20)(INNER)
+        => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+        => target list: ?multiply (FLOAT8), default.nation.n_name (TEXT)
+        => out schema: {(2) ?multiply (FLOAT8), default.nation.n_name (TEXT)}
+        => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.supplier.s_nationkey (INT4)}
+         JOIN(19)(INNER)
+           => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+           => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
+           => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+           => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
+            SCAN(5) on default.region
+              => filter: default.region.r_name (TEXT) = ASIA
+              => target list: default.region.r_regionkey (INT4)
+              => out schema: {(1) default.region.r_regionkey (INT4)}
+              => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+            SCAN(4) on default.nation
+              => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+         JOIN(18)(INNER)
+           => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
+           => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
+           => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
+           => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+            JOIN(17)(INNER)
+              => Join Cond: default.customer.c_nationkey (INT4) = default.supplier.s_nationkey (INT4)
+              => target list: default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)
+              => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+              => in schema: {(3) default.customer.c_nationkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+               SCAN(0) on default.customer
+                 => target list: default.customer.c_nationkey (INT4)
+                 => out schema: {(1) default.customer.c_nationkey (INT4)}
+                 => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+               SCAN(3) on default.supplier
+                 => target list: default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)
+                 => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+                 => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+            JOIN(16)(INNER)
+              => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
+              => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)
+              => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+              => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.orders.o_orderkey (INT4)}
+               SCAN(1) on default.orders
+                 => filter: default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01
+                 => target list: default.orders.o_orderkey (INT4)
+                 => out schema: {(1) default.orders.o_orderkey (INT4)}
+                 => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+               SCAN(2) on default.lineitem
+                 => target list: default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * 1.0 - default.lineitem.l_discount (FLOAT8) as ?multiply
+                 => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+                 => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000014)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000014
+   |-eb_0000000000000_0000_000013
+      |-eb_0000000000000_0000_000012
+         |-eb_0000000000000_0000_000011
+            |-eb_0000000000000_0000_000010
+               |-eb_0000000000000_0000_000009
+               |-eb_0000000000000_0000_000008
+            |-eb_0000000000000_0000_000007
+               |-eb_0000000000000_0000_000006
+                  |-eb_0000000000000_0000_000005
+                  |-eb_0000000000000_0000_000004
+               |-eb_0000000000000_0000_000003
+                  |-eb_0000000000000_0000_000002
+                  |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000004
+4: eb_0000000000000_0000_000005
+5: eb_0000000000000_0000_000003
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000008
+8: eb_0000000000000_0000_000009
+9: eb_0000000000000_0000_000007
+10: eb_0000000000000_0000_000010
+11: eb_0000000000000_0000_000011
+12: eb_0000000000000_0000_000012
+13: eb_0000000000000_0000_000013
+14: eb_0000000000000_0000_000014
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
+
+SCAN(2) on default.lineitem
+  => target list: default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.lineitem.l_extendedprice (FLOAT8) * 1.0 - default.lineitem.l_discount (FLOAT8) as ?multiply
+  => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
+
+SCAN(1) on default.orders
+  => filter: default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01
+  => target list: default.orders.o_orderkey (INT4)
+  => out schema: {(1) default.orders.o_orderkey (INT4)}
+  => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
+
+JOIN(16)(INNER)
+  => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
+  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)
+  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.orders.o_orderkey (INT4)}
+   SCAN(23) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.orders.o_orderkey (INT4)}
+     => in schema: {(1) default.orders.o_orderkey (INT4)}
+   SCAN(22) on eb_0000000000000_0000_000001
+     => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+     => in schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+SCAN(3) on default.supplier
+  => target list: default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)
+  => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+  => in schema: {(7) default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT), default.supplier.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.customer.c_nationkey (INT4), num=32)
+
+SCAN(0) on default.customer
+  => target list: default.customer.c_nationkey (INT4)
+  => out schema: {(1) default.customer.c_nationkey (INT4)}
+  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.customer.c_nationkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
+
+JOIN(17)(INNER)
+  => Join Cond: default.customer.c_nationkey (INT4) = default.supplier.s_nationkey (INT4)
+  => target list: default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)
+  => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+  => in schema: {(3) default.customer.c_nationkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+   SCAN(25) on eb_0000000000000_0000_000005
+     => out schema: {(1) default.customer.c_nationkey (INT4)}
+     => in schema: {(1) default.customer.c_nationkey (INT4)}
+   SCAN(24) on eb_0000000000000_0000_000004
+     => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+     => in schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32)
+[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 7 => 11 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+
+JOIN(18)(INNER)
+  => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
+  => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
+  => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
+  => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+   SCAN(27) on eb_0000000000000_0000_000006
+     => out schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+     => in schema: {(2) default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
+   SCAN(26) on eb_0000000000000_0000_000003
+     => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+     => in schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000008 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 8 => 10 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+
+SCAN(4) on default.nation
+  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+  => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000009 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+SCAN(5) on default.region
+  => filter: default.region.r_name (TEXT) = ASIA
+  => target list: default.region.r_regionkey (INT4)
+  => out schema: {(1) default.region.r_regionkey (INT4)}
+  => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000010 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 8 => 10 (type=HASH_SHUFFLE, key=default.nation.n_regionkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=HASH_SHUFFLE, key=default.region.r_regionkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 10 => 11 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
+
+JOIN(19)(INNER)
+  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+  => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
+  => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+  => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
+   SCAN(29) on eb_0000000000000_0000_000009
+     => out schema: {(1) default.region.r_regionkey (INT4)}
+     => in schema: {(1) default.region.r_regionkey (INT4)}
+   SCAN(28) on eb_0000000000000_0000_000008
+     => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+     => in schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000011 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 7 => 11 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
+[q_0000000000000_0000] 10 => 11 (type=HASH_SHUFFLE, key=default.nation.n_nationkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 11 => 12 (type=HASH_SHUFFLE, key=default.nation.n_name (TEXT), num=32)
+
+GROUP_BY(32)(n_name)
+  => exprs: (sum(?multiply (FLOAT8)))
+  => target list: default.nation.n_name (TEXT), ?sum_7 (FLOAT8)
+  => out schema:{(2) default.nation.n_name (TEXT), ?sum_7 (FLOAT8)}
+  => in schema:{(2) ?multiply (FLOAT8), default.nation.n_name (TEXT)}
+   JOIN(20)(INNER)
+     => Join Cond: default.supplier.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+     => target list: ?multiply (FLOAT8), default.nation.n_name (TEXT)
+     => out schema: {(2) ?multiply (FLOAT8), default.nation.n_name (TEXT)}
+     => in schema: {(6) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.supplier.s_nationkey (INT4)}
+      SCAN(31) on eb_0000000000000_0000_000010
+        => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+        => in schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+      SCAN(30) on eb_0000000000000_0000_000007
+        => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
+        => in schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000012 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 11 => 12 (type=HASH_SHUFFLE, key=default.nation.n_name (TEXT), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 12 => 13 (type=RANGE_SHUFFLE, key=revenue (FLOAT8), num=32)
+
+SORT(34)
+  => Sort Keys: revenue (FLOAT8) (desc)
+   GROUP_BY(7)(n_name)
+     => exprs: (sum(?sum_7 (FLOAT8)))
+     => target list: default.nation.n_name (TEXT), revenue (FLOAT8)
+     => out schema:{(2) default.nation.n_name (TEXT), revenue (FLOAT8)}
+     => in schema:{(2) default.nation.n_name (TEXT), ?sum_7 (FLOAT8)}
+      SCAN(33) on eb_0000000000000_0000_000011
+        => out schema: {(2) default.nation.n_name (TEXT), ?sum_7 (FLOAT8)}
+        => in schema: {(2) default.nation.n_name (TEXT), ?sum_7 (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000013 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 12 => 13 (type=RANGE_SHUFFLE, key=revenue (FLOAT8), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000012
+
+SORT(8)
+  => Sort Keys: revenue (FLOAT8) (desc)
+   SCAN(35) on eb_0000000000000_0000_000012
+     => out schema: {(2) default.nation.n_name (TEXT), revenue (FLOAT8)}
+     => in schema: {(2) default.nation.n_name (TEXT), revenue (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000014 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.result b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.result
new file mode 100644
index 0000000..f15c366
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestTPCH/testTPCHQ5.result
@@ -0,0 +1,2 @@
+n_name,revenue
+-------------------------------


[09/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort.plan
new file mode 100644
index 0000000..fa727c0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort.plan
@@ -0,0 +1,153 @@
+explain
+-------------------------------
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(3) on default.jointable14 as t4
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      JOIN(8)(FULL_OUTER)
+        => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+        => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+         SCAN(1) on default.jointable13 as t3
+           => target list: default.t3.id (INT4)
+           => out schema: {(1) default.t3.id (INT4)}
+           => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+         SCAN(0) on default.jointable11 as t1
+           => target list: default.t1.id (INT4), default.t1.name (TEXT)
+           => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+           => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+         |-eb_0000000000000_0000_000003
+            |-eb_0000000000000_0000_000002
+            |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(1) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(FULL_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(3) on default.jointable14 as t4
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SORT(15)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000004
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(1) default.t4.id (INT4)}
+      SCAN(13) on eb_0000000000000_0000_000003
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000005
+
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   SCAN(16) on eb_0000000000000_0000_000005
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
new file mode 100644
index 0000000..fa727c0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan
@@ -0,0 +1,153 @@
+explain
+-------------------------------
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(3) on default.jointable14 as t4
+        => target list: default.t4.id (INT4)
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+      JOIN(8)(FULL_OUTER)
+        => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+        => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+         SCAN(1) on default.jointable13 as t3
+           => target list: default.t3.id (INT4)
+           => out schema: {(1) default.t3.id (INT4)}
+           => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+         SCAN(0) on default.jointable11 as t1
+           => target list: default.t1.id (INT4), default.t1.name (TEXT)
+           => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+           => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007)
+-------------------------------------------------------------------------------
+|-eb_0000000000000_0000_000007
+   |-eb_0000000000000_0000_000006
+      |-eb_0000000000000_0000_000005
+         |-eb_0000000000000_0000_000004
+         |-eb_0000000000000_0000_000003
+            |-eb_0000000000000_0000_000002
+            |-eb_0000000000000_0000_000001
+-------------------------------------------------------------------------------
+Order of Execution
+-------------------------------------------------------------------------------
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
+6: eb_0000000000000_0000_000006
+7: eb_0000000000000_0000_000007
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000001 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+
+SCAN(0) on default.jointable11 as t1
+  => target list: default.t1.id (INT4), default.t1.name (TEXT)
+  => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+  => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+SCAN(1) on default.jointable13 as t3
+  => target list: default.t3.id (INT4)
+  => out schema: {(1) default.t3.id (INT4)}
+  => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+
+JOIN(8)(FULL_OUTER)
+  => Join Cond: default.t1.id (INT4) = default.t3.id (INT4)
+  => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)
+  => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+  => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+   SCAN(12) on eb_0000000000000_0000_000002
+     => out schema: {(1) default.t3.id (INT4)}
+     => in schema: {(1) default.t3.id (INT4)}
+   SCAN(11) on eb_0000000000000_0000_000001
+     => out schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+     => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SCAN(3) on default.jointable14 as t4
+  => target list: default.t4.id (INT4)
+  => out schema: {(1) default.t4.id (INT4)}
+  => in schema: {(2) default.t4.id (INT4), default.t4.name (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), num=32)
+[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+SORT(15)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   JOIN(9)(FULL_OUTER)
+     => Join Cond: default.t3.id (INT4) = default.t4.id (INT4)
+     => target list: default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+      SCAN(14) on eb_0000000000000_0000_000004
+        => out schema: {(1) default.t4.id (INT4)}
+        => in schema: {(1) default.t4.id (INT4)}
+      SCAN(13) on eb_0000000000000_0000_000003
+        => out schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+        => in schema: {(3) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000006 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 5 => 6 (type=RANGE_SHUFFLE, key=default.t4.id (INT4), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000005
+
+SORT(5)
+  => Sort Keys: default.t4.id (INT4) (asc)
+   SCAN(16) on eb_0000000000000_0000_000005
+     => out schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+     => in schema: {(4) default.t1.id (INT4), default.t1.name (TEXT), default.t3.id (INT4), default.t4.id (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000007 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
new file mode 100644
index 0000000..8d9d294
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinPredicationCaseByCase1.1.result
@@ -0,0 +1,9 @@
+id,name,id,id
+-------------------------------
+null,null,null,1
+2,table11-2,2,2
+3,table11-3,3,3
+null,null,null,4
+1,table11-1,null,null
+4,table11-4,null,null
+5,table11-5,null,null

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Hash.plan
index 38ffa15..580a217 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Hash.plan
@@ -23,40 +23,66 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000001 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.empty_orders.o_orderkey (INT4), num=32)
 
-[Enforcers]
- 0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
+SCAN(0) on default.empty_orders
+  => target list: default.empty_orders.o_orderkey (INT4)
+  => out schema: {(1) default.empty_orders.o_orderkey (INT4)}
+  => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+SCAN(1) on default.customer
+  => target list: default.customer.c_custkey (INT4)
+  => out schema: {(1) default.customer.c_custkey (INT4)}
+  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
 
-SORT(8)
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.empty_orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4), num=32)
+
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(FULL_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
      => target list: default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
-      SCAN(1) on default.customer
-        => target list: default.customer.c_custkey (INT4)
+      SCAN(9) on eb_0000000000000_0000_000002
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-      SCAN(0) on default.empty_orders
-        => target list: default.empty_orders.o_orderkey (INT4)
+        => in schema: {(1) default.customer.c_custkey (INT4)}
+      SCAN(8) on eb_0000000000000_0000_000001
         => out schema: {(1) default.empty_orders.o_orderkey (INT4)}
-        => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
+        => in schema: {(1) default.empty_orders.o_orderkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]
@@ -70,7 +96,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Sort.plan
index 38ffa15..580a217 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testFullOuterJoinWithEmptyTable1.Sort.plan
@@ -23,40 +23,66 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
 |-eb_0000000000000_0000_000005
    |-eb_0000000000000_0000_000004
       |-eb_0000000000000_0000_000003
+         |-eb_0000000000000_0000_000002
+         |-eb_0000000000000_0000_000001
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
-3: eb_0000000000000_0000_000005
+1: eb_0000000000000_0000_000001
+2: eb_0000000000000_0000_000002
+3: eb_0000000000000_0000_000003
+4: eb_0000000000000_0000_000004
+5: eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000001 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.empty_orders.o_orderkey (INT4), num=32)
 
-[Enforcers]
- 0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
+SCAN(0) on default.empty_orders
+  => target list: default.empty_orders.o_orderkey (INT4)
+  => out schema: {(1) default.empty_orders.o_orderkey (INT4)}
+  => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000002 [LEAF]
+=======================================================
+
+[Outgoing]
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+SCAN(1) on default.customer
+  => target list: default.customer.c_custkey (INT4)
+  => out schema: {(1) default.customer.c_custkey (INT4)}
+  => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
+=======================================================
 
-SORT(8)
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.empty_orders.o_orderkey (INT4), num=32)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4), num=32)
+
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(FULL_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
      => target list: default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
-      SCAN(1) on default.customer
-        => target list: default.customer.c_custkey (INT4)
+      SCAN(9) on eb_0000000000000_0000_000002
         => out schema: {(1) default.customer.c_custkey (INT4)}
-        => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-      SCAN(0) on default.empty_orders
-        => target list: default.empty_orders.o_orderkey (INT4)
+        => in schema: {(1) default.customer.c_custkey (INT4)}
+      SCAN(8) on eb_0000000000000_0000_000001
         => out schema: {(1) default.empty_orders.o_orderkey (INT4)}
-        => in schema: {(9) default.empty_orders.o_clerk (TEXT), default.empty_orders.o_comment (TEXT), default.empty_orders.o_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderpriority (TEXT), default.empty_orders.o_orderstatus (TEXT), default.empty_orders.o_shippriority (INT4), default.empty_orders.o_totalprice (FLOAT8)}
+        => in schema: {(1) default.empty_orders.o_orderkey (INT4)}
 
 =======================================================
 Block Id: eb_0000000000000_0000_000004 [ROOT]
@@ -70,7 +96,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan
index 21e7d4f..91199f6 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.nation
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan
index 21e7d4f..91199f6 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.nation
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Hash.plan
index 539f3da..ae40796 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Hash.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderstatus (TEXT)}
      => in schema: {(4) default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderstatus (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Sort.plan
index 539f3da..ae40796 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin1.Sort.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderstatus (TEXT)}
      => in schema: {(4) default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderstatus (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan
index 3ebc3e4..997d761 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan
@@ -34,19 +34,19 @@ JOIN(11)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -87,5 +87,5 @@ JOIN(11)(LEFT_OUTER)
            => in schema: {(16) default.a.l_comment (TEXT), default.a.l_commitdate (TEXT), default.a.l_discount (FLOAT8), default.a.l_extendedprice (FLOAT8), default.a.l_linenumber (INT4), default.a.l_linestatus (TEXT), default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8), default.a.l_receiptdate (TEXT), default.a.l_returnflag (TEXT), default.a.l_shipdate (TEXT), default.a.l_shipinstruct (TEXT), default.a.l_shipmode (TEXT), default.a.l_suppkey (INT4), default.a.l_tax (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan
index 3ebc3e4..997d761 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan
@@ -34,19 +34,19 @@ JOIN(11)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -87,5 +87,5 @@ JOIN(11)(LEFT_OUTER)
            => in schema: {(16) default.a.l_comment (TEXT), default.a.l_commitdate (TEXT), default.a.l_discount (FLOAT8), default.a.l_extendedprice (FLOAT8), default.a.l_linenumber (INT4), default.a.l_linestatus (TEXT), default.a.l_orderkey (INT4), default.a.l_partkey (INT4), default.a.l_quantity (FLOAT8), default.a.l_receiptdate (TEXT), default.a.l_returnflag (TEXT), default.a.l_shipdate (TEXT), default.a.l_shipinstruct (TEXT), default.a.l_shipmode (TEXT), default.a.l_suppkey (INT4), default.a.l_tax (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan
index 1a8f3b5..2418b98 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan
@@ -52,26 +52,26 @@ JOIN(17)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000012
+   |-eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000011
+2: eb_0000000000000_0000_000012
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000011 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.c
- 2: type=Broadcast, tables=default.d
- 3: type=Broadcast, tables=default.e
+ 0: type=Broadcast, tables=default.e
+ 1: type=Broadcast, tables=default.b
+ 2: type=Broadcast, tables=default.c
+ 3: type=Broadcast, tables=default.d
  4: type=Broadcast, tables=default.f
 
 JOIN(17)(LEFT_OUTER)
@@ -125,5 +125,5 @@ JOIN(17)(LEFT_OUTER)
                  => in schema: {(8) default.a.c_acctbal (FLOAT8), default.a.c_address (TEXT), default.a.c_comment (TEXT), default.a.c_custkey (INT4), default.a.c_mktsegment (TEXT), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.a.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000012 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan
index 1a8f3b5..2418b98 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan
@@ -52,26 +52,26 @@ JOIN(17)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000012
+   |-eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000011
+2: eb_0000000000000_0000_000012
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000011 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.c
- 2: type=Broadcast, tables=default.d
- 3: type=Broadcast, tables=default.e
+ 0: type=Broadcast, tables=default.e
+ 1: type=Broadcast, tables=default.b
+ 2: type=Broadcast, tables=default.c
+ 3: type=Broadcast, tables=default.d
  4: type=Broadcast, tables=default.f
 
 JOIN(17)(LEFT_OUTER)
@@ -125,5 +125,5 @@ JOIN(17)(LEFT_OUTER)
                  => in schema: {(8) default.a.c_acctbal (FLOAT8), default.a.c_address (TEXT), default.a.c_comment (TEXT), default.a.c_custkey (INT4), default.a.c_mktsegment (TEXT), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.a.c_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000012 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan
index b6064cc..ea058ca 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan
@@ -25,19 +25,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -68,5 +68,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan
index b6064cc..ea058ca 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan
@@ -25,19 +25,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -68,5 +68,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan
index 0a22bad..f5e0586 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan
@@ -34,24 +34,24 @@ JOIN(11)(INNER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.t2
- 1: type=Broadcast, tables=default.t3
+ 0: type=Broadcast, tables=default.t3
+ 1: type=Broadcast, tables=default.t2
  2: type=Broadcast, tables=default.t4
 
 JOIN(11)(INNER)
@@ -87,5 +87,5 @@ JOIN(11)(INNER)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan
index 0a22bad..f5e0586 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan
@@ -34,24 +34,24 @@ JOIN(11)(INNER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.t2
- 1: type=Broadcast, tables=default.t3
+ 0: type=Broadcast, tables=default.t3
+ 1: type=Broadcast, tables=default.t2
  2: type=Broadcast, tables=default.t4
 
 JOIN(11)(INNER)
@@ -87,5 +87,5 @@ JOIN(11)(INNER)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Hash.plan
index ab1b487..a35e200 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Hash.plan
@@ -37,26 +37,25 @@ JOIN(12)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.t1
- 1: type=Broadcast, tables=default.t4
- 2: type=Broadcast, tables=default.t3
- 3: type=Broadcast, tables=default.t2
+ 0: type=Broadcast, tables=default.t4
+ 1: type=Broadcast, tables=default.t3
+ 2: type=Broadcast, tables=default.t2
 
 JOIN(12)(LEFT_OUTER)
   => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
@@ -94,5 +93,5 @@ JOIN(12)(LEFT_OUTER)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Sort.plan
index ab1b487..a35e200 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2_1.1.Sort.plan
@@ -37,26 +37,25 @@ JOIN(12)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000008
+   |-eb_0000000000000_0000_000007
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000007
+2: eb_0000000000000_0000_000008
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000007 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.t1
- 1: type=Broadcast, tables=default.t4
- 2: type=Broadcast, tables=default.t3
- 3: type=Broadcast, tables=default.t2
+ 0: type=Broadcast, tables=default.t4
+ 1: type=Broadcast, tables=default.t3
+ 2: type=Broadcast, tables=default.t2
 
 JOIN(12)(LEFT_OUTER)
   => Join Cond: default.t1.id (INT4) = default.t2.id (INT4)
@@ -94,5 +93,5 @@ JOIN(12)(LEFT_OUTER)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000008 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan
index 50c41c9..79ce689 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan
@@ -25,19 +25,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -68,5 +68,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan
index 50c41c9..79ce689 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan
@@ -25,19 +25,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -68,5 +68,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Hash.plan
index 1e2809e..ad27e6f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Hash.plan
@@ -26,19 +26,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -70,5 +70,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Sort.plan
index 1e2809e..ad27e6f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase4.1.Sort.plan
@@ -26,19 +26,19 @@ JOIN(8)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -70,5 +70,5 @@ JOIN(8)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Hash.plan
index 88a955f..88cf366 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Hash.plan
@@ -26,19 +26,19 @@ JOIN(9)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -70,5 +70,5 @@ JOIN(9)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Sort.plan
index 88a955f..88cf366 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase5.1.Sort.plan
@@ -26,19 +26,19 @@ JOIN(9)(LEFT_OUTER)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -70,5 +70,5 @@ JOIN(9)(LEFT_OUTER)
         => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Hash.plan
index d9e214c..b23896b 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Hash.plan
@@ -27,19 +27,19 @@ SELECTION(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -72,5 +72,5 @@ SELECTION(5)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Sort.plan
index d9e214c..b23896b 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase6.1.Sort.plan
@@ -27,19 +27,19 @@ SELECTION(5)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000006)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000004
-   |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000006
+   |-eb_0000000000000_0000_000005
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000004
+1: eb_0000000000000_0000_000005
+2: eb_0000000000000_0000_000006
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [ROOT]
+Block Id: eb_0000000000000_0000_000005 [ROOT]
 =======================================================
 
 [Enforcers]
@@ -72,5 +72,5 @@ SELECTION(5)
            => in schema: {(2) default.t1.id (INT4), default.t1.name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000004 [TERMINAL]
+Block Id: eb_0000000000000_0000_000006 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Hash.plan
index cc8a491..9ce925e 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Hash.plan
@@ -45,7 +45,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -77,7 +77,7 @@ PROJECTION(4)
   => in  schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
    SORT(3)
      => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-      SCAN(9) on eb_0000000000000_0000_000003
+      SCAN(11) on eb_0000000000000_0000_000003
         => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
         => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Sort.plan
index cc8a491..9ce925e 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithConstantExpr1.Sort.plan
@@ -45,7 +45,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4)
@@ -77,7 +77,7 @@ PROJECTION(4)
   => in  schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
    SORT(3)
      => Sort Keys: default.customer.c_custkey (INT4) (asc),default.orders.o_orderkey (INT4) (asc)
-      SCAN(9) on eb_0000000000000_0000_000003
+      SCAN(11) on eb_0000000000000_0000_000003
         => out schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
         => in schema: {(2) default.customer.c_custkey (INT4), default.orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Hash.plan
index e35e6a5..8861bab 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Hash.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.customer.c_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderstatus (TEXT)}
      => in schema: {(4) default.customer.c_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderstatus (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Sort.plan
index e35e6a5..8861bab 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable1.Sort.plan
@@ -41,7 +41,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(6)(LEFT_OUTER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -69,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.customer.c_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderstatus (TEXT)}
      => in schema: {(4) default.customer.c_custkey (INT4), default.empty_orders.o_orderdate (TEXT), default.empty_orders.o_orderkey (INT4), default.empty_orders.o_orderstatus (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Hash.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Hash.plan
index bca8356..1fa968f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Hash.plan
@@ -48,7 +48,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(9)(c_custkey)
+GROUP_BY(11)(c_custkey)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)
   => out schema:{(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
@@ -77,14 +77,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
 
-SORT(11)
+SORT(13)
   => Sort Keys: default.customer.c_custkey (INT4) (asc)
    GROUP_BY(3)(c_custkey)
      => exprs: (sum(?sum_5 (INT8)),max(?max_6 (TEXT)),max(?max_7 (TEXT)))
      => target list: default.customer.c_custkey (INT4), ?sum (INT8), ?max_1 (TEXT), ?max_2 (TEXT)
      => out schema:{(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
      => in schema:{(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
         => in schema: {(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
 
@@ -100,7 +100,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc)
-   SCAN(12) on eb_0000000000000_0000_000004
+   SCAN(14) on eb_0000000000000_0000_000004
      => out schema: {(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
      => in schema: {(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Sort.plan b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Sort.plan
index bca8356..1fa968f 100644
--- a/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithEmptyTable2.Sort.plan
@@ -48,7 +48,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
 
-GROUP_BY(9)(c_custkey)
+GROUP_BY(11)(c_custkey)
   => exprs: (sum(default.empty_orders.o_orderkey (INT4)),max(default.empty_orders.o_orderstatus (TEXT)),max(default.empty_orders.o_orderdate (TEXT)))
   => target list: default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)
   => out schema:{(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
@@ -77,14 +77,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
 
-SORT(11)
+SORT(13)
   => Sort Keys: default.customer.c_custkey (INT4) (asc)
    GROUP_BY(3)(c_custkey)
      => exprs: (sum(?sum_5 (INT8)),max(?max_6 (TEXT)),max(?max_7 (TEXT)))
      => target list: default.customer.c_custkey (INT4), ?sum (INT8), ?max_1 (TEXT), ?max_2 (TEXT)
      => out schema:{(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
      => in schema:{(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
         => in schema: {(4) default.customer.c_custkey (INT4), ?sum_5 (INT8), ?max_6 (TEXT), ?max_7 (TEXT)}
 
@@ -100,7 +100,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT]
 
 SORT(4)
   => Sort Keys: default.customer.c_custkey (INT4) (asc)
-   SCAN(12) on eb_0000000000000_0000_000004
+   SCAN(14) on eb_0000000000000_0000_000004
      => out schema: {(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
      => in schema: {(4) ?max_1 (TEXT), ?max_2 (TEXT), ?sum (INT8), default.customer.c_custkey (INT4)}
 


[24/24] tajo git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support

Posted by ji...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support


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

Branch: refs/heads/index_support
Commit: 8ec099c8d048cbc741d74b329619a899dca8c04e
Parents: 4d01fca 03294e1
Author: Jihoon Son <ji...@apache.org>
Authored: Sat May 30 13:04:47 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat May 30 13:04:47 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  26 +-
 .../apache/tajo/client/SessionConnection.java   |  14 +
 .../main/java/org/apache/tajo/SessionVars.java  |   3 +
 .../java/org/apache/tajo/conf/TajoConf.java     |  14 +-
 tajo-common/src/main/proto/tajo_protos.proto    |   6 +
 tajo-core/pom.xml                               |   1 +
 .../BroadcastJoinMarkCandidateVisitor.java      |  72 ----
 .../planner/BroadcastJoinPlanVisitor.java       |  60 ----
 .../tajo/engine/planner/global/DataChannel.java |   4 +
 .../engine/planner/global/ExecutionBlock.java   | 117 ++++++-
 .../planner/global/ExecutionBlockCursor.java    | 101 +++---
 .../engine/planner/global/ExecutionQueue.java   |  43 +++
 .../engine/planner/global/GlobalPlanner.java    | 263 +-------------
 .../tajo/engine/planner/global/MasterPlan.java  |  25 +-
 .../planner/global/ParallelExecutionQueue.java  | 126 +++++++
 .../global/builder/DistinctGroupbyBuilder.java  |   9 +-
 .../BaseGlobalPlanRewriteRuleProvider.java      |   6 +-
 .../rewriter/GlobalPlanRewriteEngine.java       |   5 +-
 .../global/rewriter/GlobalPlanRewriteRule.java  |   9 +-
 .../rewriter/rules/BroadcastJoinRule.java       | 348 +++++++++++++++++++
 .../rules/GlobalPlanEqualityTester.java         |   6 +-
 .../rewriter/rules/GlobalPlanRewriteUtil.java   | 216 ++++++++++++
 .../planner/physical/CommonHashJoinExec.java    |  13 +
 .../DistinctGroupbyThirdAggregationExec.java    |   2 +-
 .../apache/tajo/engine/utils/ThreadUtil.java    | 149 --------
 .../org/apache/tajo/ha/HdfsServiceTracker.java  |  13 +-
 .../ExplainGlobalPlanPreprocessorForTest.java   |   3 +-
 .../NonForwardQueryResultSystemScanner.java     |   5 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   2 +-
 .../tajo/master/rm/TajoResourceTracker.java     |   9 +
 .../apache/tajo/master/rm/WorkerResource.java   |  16 +-
 .../tajo/querymaster/DefaultTaskScheduler.java  |   2 +-
 .../java/org/apache/tajo/querymaster/Query.java |  89 +++--
 .../tajo/querymaster/QueryMasterTask.java       |   2 +-
 .../apache/tajo/querymaster/Repartitioner.java  |  62 +---
 .../java/org/apache/tajo/querymaster/Stage.java |   7 +-
 .../resource/DefaultResourceCalculator.java     | 109 ++++++
 .../org/apache/tajo/resource/NodeResource.java  | 188 ++++++++++
 .../org/apache/tajo/resource/NodeResources.java | 195 +++++++++++
 .../tajo/resource/ResourceCalculator.java       | 169 +++++++++
 .../apache/tajo/worker/NodeResourceManager.java | 148 ++++++++
 .../apache/tajo/worker/NodeStatusUpdater.java   | 274 +++++++++++++++
 .../tajo/worker/WorkerHeartbeatService.java     |   1 +
 .../worker/event/NodeResourceAllocateEvent.java |  46 +++
 .../event/NodeResourceDeallocateEvent.java      |  40 +++
 .../worker/event/NodeResourceManagerEvent.java  |  34 ++
 .../tajo/worker/event/NodeStatusEvent.java      |  40 +++
 .../tajo/ws/rs/resources/QueryResource.java     |  45 +--
 .../ws/rs/resources/QueryResultResource.java    |   2 +-
 .../main/proto/ResourceTrackerProtocol.proto    |  27 ++
 .../src/main/proto/TajoWorkerProtocol.proto     |  16 +
 .../java/org/apache/tajo/QueryTestCaseBase.java |  16 +-
 .../org/apache/tajo/TajoTestingCluster.java     |  10 +-
 .../org/apache/tajo/benchmark/TestTPCH.java     |  25 +-
 .../engine/planner/TestQueryValidation.java     |  17 +-
 .../tajo/engine/query/TestGroupByQuery.java     |   6 +-
 .../engine/query/TestInnerJoinWithSubQuery.java |   7 +
 .../tajo/engine/query/TestOuterJoinQuery.java   |  20 +-
 .../apache/tajo/engine/query/TestSortQuery.java |   7 +
 .../tajo/engine/query/TestUnionQuery.java       |  13 +
 .../tajo/master/TestExecutionBlockCursor.java   |   6 +-
 .../apache/tajo/master/TestGlobalPlanner.java   | 347 ------------------
 .../apache/tajo/querymaster/TestKillQuery.java  |   4 +-
 .../org/apache/tajo/resource/TestResources.java |  48 +++
 .../tajo/worker/MockNodeStatusUpdater.java      | 105 ++++++
 .../tajo/worker/TestNodeResourceManager.java    | 235 +++++++++++++
 .../tajo/worker/TestNodeStatusUpdater.java      | 115 ++++++
 .../tajo/ws/rs/resources/TestQueryResource.java |  56 ++-
 .../rs/resources/TestQueryResultResource.java   | 122 +++++--
 .../testBroadcastTwoPartJoin.sql                |   2 +-
 .../testThetaJoinKeyPairs.sql                   |  20 ++
 .../testSubQuerySortAfterGroupMultiBlocks.sql   |   5 +
 .../resources/queries/TestTPCH/testTPCHQ5.sql   |  24 ++
 .../TestUnionQuery/testComplexUnion1.sql        |  27 ++
 .../TestUnionQuery/testComplexUnion2.sql        |  35 ++
 .../queries/default/complex_union_1.sql         |  29 --
 .../queries/default/complex_union_2.sql         |  35 --
 .../testBroadcastTwoPartJoin.Hash.plan          | 135 +++----
 ...stBroadcastTwoPartJoin.Hash_NoBroadcast.plan |  46 +--
 .../testBroadcastTwoPartJoin.Sort.plan          | 135 +++----
 ...stBroadcastTwoPartJoin.Sort_NoBroadcast.plan |  46 +--
 .../testComplexJoinCondition1.Hash.plan         |   5 +-
 .../testComplexJoinCondition1.Sort.plan         |   5 +-
 .../testComplexJoinCondition2.Hash.plan         |   5 +-
 .../testComplexJoinCondition2.Sort.plan         |   5 +-
 .../testComplexJoinCondition3.Hash.plan         |   5 +-
 .../testComplexJoinCondition3.Sort.plan         |   5 +-
 .../testComplexJoinCondition4.Hash.plan         |   5 +-
 .../testComplexJoinCondition4.Sort.plan         |   5 +-
 .../testCrossJoin.1.Hash.plan                   |   7 +-
 .../testCrossJoin.1.Sort.plan                   |   7 +-
 .../testCrossJoin.2.Hash.plan                   |   1 -
 .../testCrossJoin.2.Sort.plan                   |   1 -
 .../testCrossJoin.3.Hash.plan                   |   3 +-
 .../testCrossJoin.3.Sort.plan                   |   3 +-
 .../testCrossJoin.4.Hash.plan                   |   3 +-
 .../testCrossJoin.4.Sort.plan                   |   3 +-
 .../testCrossJoin.5.Hash.plan                   |   7 +-
 .../testCrossJoin.5.Sort.plan                   |   7 +-
 .../testCrossJoinAndCaseWhen.Hash.plan          |   5 +-
 .../testCrossJoinAndCaseWhen.Sort.plan          |   5 +-
 .../testCrossJoinWithAsterisk1.Hash.plan        |   5 +-
 .../testCrossJoinWithAsterisk1.Sort.plan        |   5 +-
 .../testCrossJoinWithAsterisk2.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk2.Sort.plan        |   7 +-
 .../testCrossJoinWithAsterisk3.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk3.Sort.plan        |   7 +-
 .../testCrossJoinWithAsterisk4.Hash.plan        |   7 +-
 .../testCrossJoinWithAsterisk4.Sort.plan        |   7 +-
 .../testCrossJoinWithEmptyTable1.Hash.plan      |   5 +-
 .../testCrossJoinWithEmptyTable1.Sort.plan      |   5 +-
 ...sJoinWithThetaJoinConditionInWhere.Hash.plan |   1 -
 ...sJoinWithThetaJoinConditionInWhere.Sort.plan |   1 -
 .../testDifferentTypesJoinCondition.Hash.plan   |   1 -
 .../testDifferentTypesJoinCondition.Sort.plan   |   1 -
 .../testInnerJoinAndCaseWhen.Hash.plan          |   5 +-
 .../testInnerJoinAndCaseWhen.Sort.plan          |   5 +-
 .../testInnerJoinWithEmptyTable.Hash.plan       |   5 +-
 .../testInnerJoinWithEmptyTable.Sort.plan       |   5 +-
 ...rJoinWithThetaJoinConditionInWhere.Hash.plan |   3 +-
 ...rJoinWithThetaJoinConditionInWhere.Sort.plan |   3 +-
 .../testJoinAsterisk.Hash.plan                  |   1 -
 .../testJoinAsterisk.Sort.plan                  |   1 -
 .../testJoinCoReferredEvals1.Hash.plan          |   5 +-
 .../testJoinCoReferredEvals1.Sort.plan          |   5 +-
 ...tJoinCoReferredEvalsWithSameExprs1.Hash.plan |   7 +-
 ...tJoinCoReferredEvalsWithSameExprs1.Sort.plan |   7 +-
 ...tJoinCoReferredEvalsWithSameExprs2.Hash.plan |  11 +-
 ...tJoinCoReferredEvalsWithSameExprs2.Sort.plan |  11 +-
 .../testJoinOnMultipleDatabases.Hash.plan       | 135 +++----
 ...oinOnMultipleDatabases.Hash_NoBroadcast.plan |  46 +--
 .../testJoinOnMultipleDatabases.Sort.plan       | 135 +++----
 ...oinOnMultipleDatabases.Sort_NoBroadcast.plan |  46 +--
 .../testJoinWithMultipleJoinQual1.Hash.plan     | 137 +++-----
 ...nWithMultipleJoinQual1.Hash_NoBroadcast.plan |  46 +--
 .../testJoinWithMultipleJoinQual1.Sort.plan     | 137 +++-----
 ...nWithMultipleJoinQual1.Sort_NoBroadcast.plan |  46 +--
 .../testJoinWithOrPredicates.Hash.plan          |   7 +-
 .../testJoinWithOrPredicates.Sort.plan          |   7 +-
 .../testNaturalJoin.Hash.plan                   |   7 +-
 .../testNaturalJoin.Sort.plan                   |   7 +-
 .../TestInnerJoinQuery/testTPCHQ2Join.Hash.plan | 137 +++-----
 .../testTPCHQ2Join.Hash_NoBroadcast.plan        |  46 +--
 .../TestInnerJoinQuery/testTPCHQ2Join.Sort.plan | 137 +++-----
 .../testTPCHQ2Join.Sort_NoBroadcast.plan        |  46 +--
 .../testWhereClauseJoin1.Hash.plan              |   5 +-
 .../testWhereClauseJoin1.Sort.plan              |   5 +-
 .../testWhereClauseJoin2.Hash.plan              |   5 +-
 .../testWhereClauseJoin2.Sort.plan              |   5 +-
 .../testWhereClauseJoin3.Hash.plan              |   5 +-
 .../testWhereClauseJoin3.Sort.plan              |   5 +-
 .../testWhereClauseJoin4.Hash.plan              |   7 +-
 .../testWhereClauseJoin4.Sort.plan              |   7 +-
 .../testWhereClauseJoin5.Hash.plan              |  33 +-
 .../testWhereClauseJoin5.Sort.plan              |  33 +-
 .../testWhereClauseJoin6.Hash.plan              |  37 +-
 .../testWhereClauseJoin6.Sort.plan              |  37 +-
 .../testBroadcastSubquery.Hash.plan             | 118 ++-----
 .../testBroadcastSubquery.Sort.plan             | 118 ++-----
 .../testBroadcastSubquery2.Hash.plan            | 180 ++++------
 ...testBroadcastSubquery2.Hash_NoBroadcast.plan |  48 +--
 .../testBroadcastSubquery2.Sort.plan            | 180 ++++------
 ...testBroadcastSubquery2.Sort_NoBroadcast.plan |  48 +--
 .../testComplexJoinCondition5.Hash.plan         |  69 ++--
 .../testComplexJoinCondition5.Sort.plan         |  69 ++--
 .../testComplexJoinCondition6.Hash.plan         |  94 ++---
 .../testComplexJoinCondition6.Sort.plan         |  94 ++---
 .../testComplexJoinCondition7.Hash.plan         |  94 ++---
 .../testComplexJoinCondition7.Sort.plan         |  94 ++---
 .../testJoinWithMultipleJoinQual2.Hash.plan     |  88 ++---
 .../testJoinWithMultipleJoinQual2.Sort.plan     |  88 ++---
 .../testJoinWithMultipleJoinQual3.Hash.plan     | 109 ++----
 ...nWithMultipleJoinQual3.Hash_NoBroadcast.plan |  48 +--
 .../testJoinWithMultipleJoinQual3.Sort.plan     | 109 ++----
 ...nWithMultipleJoinQual3.Sort_NoBroadcast.plan |  48 +--
 .../testJoinWithMultipleJoinQual4.Hash.plan     | 109 ++----
 ...nWithMultipleJoinQual4.Hash_NoBroadcast.plan |  48 +--
 .../testJoinWithMultipleJoinQual4.Sort.plan     | 109 ++----
 ...nWithMultipleJoinQual4.Sort_NoBroadcast.plan |  48 +--
 .../testThetaJoinKeyPairs.Hash.plan             | 142 ++++++++
 .../testThetaJoinKeyPairs.Hash_NoBroadcast.plan | 196 +++++++++++
 .../testThetaJoinKeyPairs.Sort.plan             | 142 ++++++++
 .../testThetaJoinKeyPairs.Sort_NoBroadcast.plan | 196 +++++++++++
 .../testThetaJoinKeyPairs.result                |  27 ++
 .../testComplexJoinsWithCaseWhen.Hash.plan      |  33 +-
 .../testComplexJoinsWithCaseWhen.Sort.plan      |  33 +-
 .../testComplexJoinsWithCaseWhen2.Hash.plan     |  91 ++---
 .../testComplexJoinsWithCaseWhen2.Sort.plan     |  91 ++---
 .../testInnerAndOuterWithEmpty.1.Hash.plan      |  17 +-
 .../testInnerAndOuterWithEmpty.1.Sort.plan      |  17 +-
 .../testJoinWithMultipleJoinTypes.Hash.plan     | 108 ++----
 .../testJoinWithMultipleJoinTypes.Sort.plan     | 108 ++----
 .../testFullOuterJoin1.Hash.plan                |  58 +++-
 .../testFullOuterJoin1.Sort.plan                |  58 +++-
 ...lOuterJoinPredicationCaseByCase1.1.Hash.plan | 153 ++++++++
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan | 153 ++++++++
 ...lOuterJoinPredicationCaseByCase1.1.Sort.plan | 153 ++++++++
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan | 153 ++++++++
 ...FullOuterJoinPredicationCaseByCase1.1.result |   9 +
 .../testFullOuterJoinWithEmptyTable1.Hash.plan  |  58 +++-
 .../testFullOuterJoinWithEmptyTable1.Sort.plan  |  58 +++-
 ...testJoinFilterOfRowPreservedTable1.Hash.plan |   4 +-
 ...testJoinFilterOfRowPreservedTable1.Sort.plan |   4 +-
 .../testLeftOuterJoin1.Hash.plan                |   4 +-
 .../testLeftOuterJoin1.Sort.plan                |   4 +-
 .../testLeftOuterJoin2.Hash.plan                |  14 +-
 .../testLeftOuterJoin2.Sort.plan                |  14 +-
 .../testLeftOuterJoin3.Hash.plan                |  22 +-
 .../testLeftOuterJoin3.Sort.plan                |  22 +-
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |  18 +-
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |  18 +-
 ...uterJoinPredicationCaseByCase2_1.1.Hash.plan |  21 +-
 ...uterJoinPredicationCaseByCase2_1.1.Sort.plan |  21 +-
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase4.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase4.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase5.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase5.1.Sort.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase6.1.Hash.plan |  14 +-
 ...tOuterJoinPredicationCaseByCase6.1.Sort.plan |  14 +-
 ...testLeftOuterJoinWithConstantExpr1.Hash.plan |   4 +-
 ...testLeftOuterJoinWithConstantExpr1.Sort.plan |   4 +-
 .../testLeftOuterJoinWithEmptyTable1.Hash.plan  |   4 +-
 .../testLeftOuterJoinWithEmptyTable1.Sort.plan  |   4 +-
 .../testLeftOuterJoinWithEmptyTable2.Hash.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable2.Sort.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable3.Hash.plan  |  12 +-
 .../testLeftOuterJoinWithEmptyTable3.Sort.plan  |  12 +-
 .../testLeftOuterJoinWithEmptyTable4.Hash.plan  |  38 +-
 ...terJoinWithEmptyTable4.Hash_NoBroadcast.plan |  32 +-
 .../testLeftOuterJoinWithEmptyTable4.Sort.plan  |  38 +-
 ...terJoinWithEmptyTable4.Sort_NoBroadcast.plan |  32 +-
 .../testLeftOuterJoinWithEmptyTable5.Hash.plan  |   8 +-
 .../testLeftOuterJoinWithEmptyTable5.Sort.plan  |   8 +-
 .../testLeftOuterJoinWithNull1.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull1.Sort.plan        |   4 +-
 .../testLeftOuterJoinWithNull2.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull2.Sort.plan        |   4 +-
 .../testLeftOuterJoinWithNull3.Hash.plan        |   4 +-
 .../testLeftOuterJoinWithNull3.Sort.plan        |   4 +-
 ...leBroadcastDataFileWithZeroLength2.Hash.plan |  14 +-
 ...leBroadcastDataFileWithZeroLength2.Sort.plan |  14 +-
 .../testOuterJoinAndCaseWhen1.Hash.plan         |  30 +-
 .../testOuterJoinAndCaseWhen1.Sort.plan         |  30 +-
 .../testRightOuterJoin1.Hash.plan               |   4 +-
 .../testRightOuterJoin1.Sort.plan               |   4 +-
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan | 101 ++++++
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan | 128 +++++++
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan | 101 ++++++
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan | 128 +++++++
 ...ightOuterJoinPredicationCaseByCase1.1.result |   4 +
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |  76 ++++
 ...edicationCaseByCase2.1.Hash_NoBroadcast.plan | 132 +++++++
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |  76 ++++
 ...edicationCaseByCase2.1.Sort_NoBroadcast.plan | 132 +++++++
 ...ightOuterJoinPredicationCaseByCase2.1.result |   4 +
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan | 101 ++++++
 ...edicationCaseByCase3.1.Hash_NoBroadcast.plan | 128 +++++++
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan | 101 ++++++
 ...edicationCaseByCase3.1.Sort_NoBroadcast.plan | 128 +++++++
 ...ightOuterJoinPredicationCaseByCase3.1.result |   4 +
 .../testRightOuterJoinWithEmptyTable1.Hash.plan |   4 +-
 .../testRightOuterJoinWithEmptyTable1.Sort.plan |   4 +-
 .../testJoinWithDifferentShuffleKey.1.Hash.plan |  36 +-
 ...hDifferentShuffleKey.1.Hash_NoBroadcast.plan |  36 +-
 .../testJoinWithDifferentShuffleKey.1.Sort.plan |  36 +-
 ...hDifferentShuffleKey.1.Sort_NoBroadcast.plan |  36 +-
 ...testLeftOuterJoinWithConstantExpr2.Hash.plan |  69 ++--
 ...testLeftOuterJoinWithConstantExpr2.Sort.plan |  69 ++--
 ...tLeftOuterJoinWithEmptySubquery1.1.Hash.plan |  96 ++---
 ...tLeftOuterJoinWithEmptySubquery1.1.Sort.plan |  96 ++---
 ...tLeftOuterJoinWithEmptySubquery2.1.Hash.plan |  88 ++---
 ...tLeftOuterJoinWithEmptySubquery2.1.Sort.plan |  88 ++---
 .../testSubQuerySortAfterGroupMultiBlocks.plan  | 112 ++++++
 ...testSubQuerySortAfterGroupMultiBlocks.result |   5 +
 .../results/TestTPCH/testQ1OrderBy.plan         |  88 +++++
 .../results/TestTPCH/testQ1OrderBy.result       |   2 +-
 .../results/TestTPCH/testQ2FourJoins.plan       | 228 ++++++++++++
 .../results/TestTPCH/testQ2FourJoins.result     |   2 +-
 .../results/TestTPCH/testTPCH14Expr.plan        | 119 +++++++
 .../results/TestTPCH/testTPCH14Expr.result      |   2 +-
 .../resources/results/TestTPCH/testTPCHQ5.plan  | 332 ++++++++++++++++++
 .../results/TestTPCH/testTPCHQ5.result          |   2 +
 .../TestTajoCli/testHelpSessionVars.result      |   1 +
 .../TestUnionQuery/testComplexUnion1.plan       |  80 +++++
 .../TestUnionQuery/testComplexUnion1.result     |   6 +
 .../TestUnionQuery/testComplexUnion2.plan       | 116 +++++++
 .../TestUnionQuery/testComplexUnion2.result     |   7 +
 .../sphinx/table_management/table_overview.rst  |  29 +-
 .../org/apache/tajo/jdbc/JdbcConnection.java    |   6 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |   6 +
 .../plan/expr/AggregationFunctionCallEval.java  |  63 ++--
 .../function/python/PythonScriptEngine.java     |  17 +-
 .../plan/function/python/TajoScriptEngine.java  |  13 +-
 .../tajo/plan/logical/CreateTableNode.java      |   5 +
 .../org/apache/tajo/plan/logical/JoinNode.java  |  22 +-
 .../plan/rewrite/rules/FilterPushDownRule.java  |   1 +
 .../tajo/plan/serder/EvalNodeDeserializer.java  |  14 +-
 .../tajo/plan/serder/EvalNodeSerializer.java    |   4 +-
 .../plan/serder/LogicalNodeDeserializer.java    |   5 -
 .../tajo/plan/serder/LogicalNodeSerializer.java |  18 +-
 tajo-plan/src/main/proto/Plan.proto             |  12 +-
 .../java/org/apache/tajo/storage/DiskUtil.java  |   4 +-
 306 files changed, 9531 insertions(+), 4912 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/CHANGES
----------------------------------------------------------------------
diff --cc CHANGES
index bad7753,85c28ce..9f6795d
--- a/CHANGES
+++ b/CHANGES
@@@ -136,10 -150,14 +150,18 @@@ Release 0.11.0 - unrelease
  
    BUG FIXES
  
 +    TAJO-1608: Fix test failure in index_support branch. (jihoon)
 +
 +    TAJO-1594: Catalog schema is invalid for some databases. (jihoon)
 +
+     TAJO-1630: Test failure after TAJO-1130. (jihoon)
+ 
+     TAJO-1623: INSERT INTO with wrong target columns causes NPE. (hyunsik)
+ 
+     TAJO-1621: Compilation error with hadoop 2.7.0. (jinho)
+ 
+     TAJO-1619: JDBC program is stuck after closing. (jihoon)
+ 
      TAJO-1620: random() in an SQL should generate RANDOM numbers.
      (Contributed by Jongyoung Park, Committed by jihoon)
  

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
index c149f2f,89e887a..bb2d9ad
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
@@@ -1619,44 -1408,5 +1417,19 @@@ public class GlobalPlanner 
  
        return node;
      }
 +
 +    @Override
 +    public LogicalNode visitCreateIndex(GlobalPlanContext context, LogicalPlan plan, LogicalPlan.QueryBlock queryBlock,
 +                                        CreateIndexNode node, Stack<LogicalNode> stack) throws PlanningException {
 +      LogicalNode child = super.visitCreateIndex(context, plan, queryBlock, node, stack);
 +
 +      // Don't separate execution block. CreateIndex is pushed to the first execution block.
 +      ExecutionBlock childBlock = context.execBlockMap.remove(child.getPID());
 +      node.setChild(childBlock.getPlan());
 +      childBlock.setPlan(node);
 +      context.execBlockMap.put(node.getPID(), childBlock);
 +
 +      return node;
 +    }
    }
- 
-   @SuppressWarnings("unused")
-   private static class ConsecutiveUnionFinder extends BasicLogicalPlanVisitor<List<UnionNode>, LogicalNode> {
-     @Override
-     public LogicalNode visitUnion(List<UnionNode> unionNodeList, LogicalPlan plan, LogicalPlan.QueryBlock queryBlock,
-                                   UnionNode node, Stack<LogicalNode> stack)
-         throws PlanningException {
-       if (node.getType() == NodeType.UNION) {
-         unionNodeList.add(node);
-       }
- 
-       stack.push(node);
-       TableSubQueryNode leftSubQuery = node.getLeftChild();
-       TableSubQueryNode rightSubQuery = node.getRightChild();
-       if (leftSubQuery.getSubQuery().getType() == NodeType.UNION) {
-         visit(unionNodeList, plan, queryBlock, leftSubQuery, stack);
-       }
-       if (rightSubQuery.getSubQuery().getType() == NodeType.UNION) {
-         visit(unionNodeList, plan, queryBlock, rightSubQuery, stack);
-       }
-       stack.pop();
- 
-       return node;
-     }
-   }
  }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
index 8441922,2809a70..0737422
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
@@@ -362,17 -361,9 +362,17 @@@ public class QueryMasterTask extends Co
              tableDescMap.put(scanNode.getCanonicalName(), scanNode.getTableDesc());
            }
          }
 +
 +        scanNodes = PlannerUtil.findAllNodes(block.getRoot(), NodeType.INDEX_SCAN);
 +        if (scanNodes != null) {
 +          for (LogicalNode eachScanNode : scanNodes) {
 +            ScanNode scanNode = (ScanNode) eachScanNode;
 +            tableDescMap.put(scanNode.getCanonicalName(), scanNode.getTableDesc());
 +          }
 +        }
        }
        MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan);
-       queryMasterContext.getGlobalPlanner().build(masterPlan);
+       queryMasterContext.getGlobalPlanner().build(queryContext, masterPlan);
  
        query = new Query(queryTaskContext, queryId, querySubmitTime,
            "", queryTaskContext.getEventHandler(), masterPlan);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/8ec099c8/tajo-plan/src/main/proto/Plan.proto
----------------------------------------------------------------------


[16/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
index 0e1b501..4fe150b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
@@ -38,6 +38,7 @@ import org.apache.tajo.engine.planner.global.DataChannel;
 import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.engine.planner.global.GlobalPlanner;
 import org.apache.tajo.engine.planner.global.MasterPlan;
+import org.apache.tajo.engine.planner.global.rewriter.rules.GlobalPlanRewriteUtil;
 import org.apache.tajo.engine.utils.TupleUtil;
 import org.apache.tajo.exception.InternalException;
 import org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.MultipleAggregationStage;
@@ -107,7 +108,7 @@ public class Repartitioner {
         fragments[i] = new FileFragment(scans[i].getCanonicalName(), tablePath, 0, 0, new String[]{UNKNOWN_HOST});
       } else {
         try {
-          stats[i] = GlobalPlanner.computeDescendentVolume(scans[i]);
+          stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]);
         } catch (PlanningException e) {
           throw new IOException(e);
         }
@@ -188,37 +189,7 @@ public class Repartitioner {
     }
 
     // Assigning either fragments or fetch urls to query units
-    boolean isAllBroadcastTable = true;
-    for (int i = 0; i < scans.length; i++) {
-      if (!execBlock.isBroadcastTable(scans[i].getCanonicalName())) {
-        isAllBroadcastTable = false;
-        break;
-      }
-    }
-
-
-    if (isAllBroadcastTable) { // if all relations of this EB are broadcasted
-      // set largest table to normal mode
-      long maxStats = Long.MIN_VALUE;
-      int maxStatsScanIdx = -1;
-      for (int i = 0; i < scans.length; i++) {
-        // finding largest table.
-        // If stats == 0, can't be base table.
-        if (stats[i] > 0 && stats[i] > maxStats) {
-          maxStats = stats[i];
-          maxStatsScanIdx = i;
-        }
-      }
-      if (maxStatsScanIdx == -1) {
-        maxStatsScanIdx = 0;
-      }
-      int baseScanIdx = maxStatsScanIdx;
-      scans[baseScanIdx].setBroadcastTable(false);
-      execBlock.removeBroadcastTable(scans[baseScanIdx].getCanonicalName());
-      LOG.info(String.format("[Distributed Join Strategy] : Broadcast Join with all tables, base_table=%s, base_volume=%d",
-          scans[baseScanIdx].getCanonicalName(), stats[baseScanIdx]));
-      scheduleLeafTasksWithBroadcastTable(schedulerContext, stage, baseScanIdx, fragments);
-    } else if (!execBlock.getBroadcastTables().isEmpty()) { // If some relations of this EB are broadcasted
+    if (execBlock.hasBroadcastRelation()) { // If some relations of this EB are broadcasted
       boolean hasNonLeafNode = false;
       List<Integer> largeScanIndexList = new ArrayList<Integer>();
       List<Integer> broadcastIndexList = new ArrayList<Integer>();
@@ -235,7 +206,7 @@ public class Repartitioner {
           nonLeafScanNamesBuilder.append(namePrefix).append(scans[i].getCanonicalName());
           namePrefix = ",";
         }
-        if (execBlock.isBroadcastTable(scans[i].getCanonicalName())) {
+        if (execBlock.isBroadcastRelation(scans[i])) {
           broadcastIndexList.add(i);
         } else {
           // finding largest table.
@@ -269,31 +240,31 @@ public class Repartitioner {
         }
 
         //select intermediate scan and stats
-        ScanNode[] intermediateScans = new ScanNode[largeScanIndexList.size()];
         long[] intermediateScanStats = new long[largeScanIndexList.size()];
         Fragment[] intermediateFragments = new Fragment[largeScanIndexList.size()];
         int index = 0;
         for (Integer eachIdx : largeScanIndexList) {
-          intermediateScans[index] = scans[eachIdx];
           intermediateScanStats[index] = stats[eachIdx];
           intermediateFragments[index++] = fragments[eachIdx];
         }
         Fragment[] broadcastFragments = new Fragment[broadcastIndexList.size()];
         ScanNode[] broadcastScans = new ScanNode[broadcastIndexList.size()];
+        long[] broadcastStats = new long[broadcastIndexList.size()];
         index = 0;
         for (Integer eachIdx : broadcastIndexList) {
           scans[eachIdx].setBroadcastTable(true);
           broadcastScans[index] = scans[eachIdx];
+          broadcastStats[index] = stats[eachIdx];
           broadcastFragments[index] = fragments[eachIdx];
           index++;
         }
         LOG.info(String.format("[Distributed Join Strategy] : Broadcast Join, join_node=%s", nonLeafScanNames));
         scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage,
-            intermediateScans, intermediateScanStats, intermediateFragments, broadcastScans, broadcastFragments);
+            intermediateScanStats, intermediateFragments, broadcastScans, broadcastStats, broadcastFragments);
       }
     } else {
       LOG.info("[Distributed Join Strategy] : Symmetric Repartition Join");
-      scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage, scans, stats, fragments, null, null);
+      scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage, stats, fragments, null, null, null);
     }
   }
 
@@ -302,7 +273,6 @@ public class Repartitioner {
    * @param masterContext
    * @param schedulerContext
    * @param stage
-   * @param scans
    * @param stats
    * @param fragments
    * @throws IOException
@@ -310,10 +280,10 @@ public class Repartitioner {
   private static void scheduleSymmetricRepartitionJoin(QueryMasterTask.QueryMasterTaskContext masterContext,
                                                        TaskSchedulerContext schedulerContext,
                                                        Stage stage,
-                                                       ScanNode[] scans,
                                                        long[] stats,
                                                        Fragment[] fragments,
                                                        ScanNode[] broadcastScans,
+                                                       long[] broadcastStats,
                                                        Fragment[] broadcastFragments) throws IOException {
     MasterPlan masterPlan = stage.getMasterPlan();
     ExecutionBlock execBlock = stage.getBlock();
@@ -375,18 +345,20 @@ public class Repartitioner {
     // hashEntries can be zero if there are no input data.
     // In the case, it will cause the zero divided exception.
     // it avoids this problem.
+    long leftStats = stats[0];
+    long rightStats = stats.length == 2 ? stats[1] : broadcastStats[0];
     int[] avgSize = new int[2];
-    avgSize[0] = hashEntries.size() == 0 ? 0 : (int) (stats[0] / hashEntries.size());
-    avgSize[1] = hashEntries.size() == 0 ? 0 : (int) (stats[1] / hashEntries.size());
+    avgSize[0] = hashEntries.size() == 0 ? 0 : (int) (leftStats / hashEntries.size());
+    avgSize[1] = hashEntries.size() == 0 ? 0 : (int) (stats.length == 2 ? (rightStats / hashEntries.size()) : rightStats);
     int bothFetchSize = avgSize[0] + avgSize[1];
 
     // Getting the desire number of join tasks according to the volumn
     // of a larger table
-    int largerIdx = stats[0] >= stats[1] ? 0 : 1;
+    long largerStat = leftStats >= rightStats ? leftStats : rightStats;
     int desireJoinTaskVolumn = stage.getMasterPlan().getContext().getInt(SessionVars.JOIN_TASK_INPUT_SIZE);
 
     // calculate the number of tasks according to the data size
-    int mb = (int) Math.ceil((double) stats[largerIdx] / 1048576);
+    int mb = (int) Math.ceil((double) largerStat / 1048576);
     LOG.info("Larger intermediate data is approximately " + mb + " MB");
     // determine the number of task per 64MB
     int maxTaskNum = (int) Math.ceil((double) mb / desireJoinTaskVolumn);
@@ -398,7 +370,9 @@ public class Repartitioner {
     LOG.info("The determined number of join tasks is " + joinTaskNum);
 
     List<Fragment> rightFragments = new ArrayList<Fragment>();
-    rightFragments.add(fragments[1]);
+    if (fragments.length == 2) {
+      rightFragments.add(fragments[1]);
+    }
 
     if (broadcastFragments != null) {
       //In this phase a ScanNode has a single fragment.

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
index 160bfaa..5a0fc38 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
@@ -712,7 +712,7 @@ public class Stage implements EventHandler<StageEvent> {
    */
   private void finalizeStats() {
     TableStats[] statsArray;
-    if (block.hasUnion()) {
+    if (block.isUnionOnly()) {
       statsArray = computeStatFromUnionBlock(this);
     } else {
       statsArray = computeStatFromTasks();
@@ -784,7 +784,7 @@ public class Stage implements EventHandler<StageEvent> {
 
       try {
         // Union operator does not require actual query processing. It is performed logically.
-        if (execBlock.hasUnion()) {
+        if (execBlock.isUnionOnly()) {
           // Though union operator does not be processed at all, but it should handle the completion event.
           stage.complete();
           state = StageState.SUCCEEDED;
@@ -883,7 +883,7 @@ public class Stage implements EventHandler<StageEvent> {
       }
 
       // We assume this execution block the first stage of join if two or more tables are included in this block,
-      if (parent != null && parent.getScanNodes().length >= 2) {
+      if (parent != null && (parent.getNonBroadcastRelNum()) >= 2) {
         List<ExecutionBlock> childs = masterPlan.getChilds(parent);
 
         // for outer
@@ -990,6 +990,7 @@ public class Stage implements EventHandler<StageEvent> {
       MasterPlan masterPlan = stage.getMasterPlan();
       ExecutionBlock execBlock = stage.getBlock();
       if (stage.getMasterPlan().isLeaf(execBlock.getId()) && execBlock.getScanNodes().length == 1) { // Case 1: Just Scan
+        // Some execution blocks can have broadcast table even though they don't have any join nodes
         scheduleFragmentsForLeafQuery(stage);
       } else if (execBlock.getScanNodes().length > 1) { // Case 2: Join
         Repartitioner.scheduleFragmentsForJoinQuery(stage.schedulerContext, stage);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
index 4ca9b3e..9b7db2d 100644
--- a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
+++ b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
@@ -34,23 +34,30 @@ public class TestTPCH extends QueryTestCaseBase {
   }
 
   @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
   public void testQ1OrderBy() throws Exception {
-    ResultSet res = executeQuery();
-    assertResultSet(res);
-    cleanupQuery(res);
+    runSimpleTests();
   }
 
   @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
   public void testQ2FourJoins() throws Exception {
-    ResultSet res = executeQuery();
-    assertResultSet(res);
-    cleanupQuery(res);
+    runSimpleTests();
   }
 
   @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
   public void testTPCH14Expr() throws Exception {
-    ResultSet res = executeQuery();
-    assertResultSet(res);
-    cleanupQuery(res);
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
+  public void testTPCHQ5() throws Exception {
+    runSimpleTests();
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
index 4f90386..3055362 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
@@ -835,7 +835,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     cleanupQuery(res);
   }
 
-  // TODO: this test cannot be executed due to the bug of logical planner
+  // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588)
 //  @Test
   public final void testPythonUdafWithHaving() throws Exception {
     ResultSet res = executeQuery();
@@ -850,7 +850,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     cleanupQuery(res);
   }
 
-  // TODO: this test cannot be executed due to the bug of logical planner
+  // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588)
 //  @Test
   public final void testComplexTargetWithPythonUdaf() throws Exception {
     ResultSet res = executeQuery();
@@ -858,7 +858,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     cleanupQuery(res);
   }
 
-  // TODO: this test cannot be executed due to the bug of logical planner
+  // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588)
 //  @Test
   public final void testDistinctPythonUdafWithUnion1() throws Exception {
     ResultSet res = executeQuery();

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java
index a8e2a3b..2bcb5d9 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java
@@ -122,4 +122,11 @@ public class TestInnerJoinWithSubQuery extends TestJoinQuery {
   public final void testBroadcastSubquery2() throws Exception {
     runSimpleTests();
   }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public final void testThetaJoinKeyPairs() throws Exception {
+    runSimpleTests();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
index 077b7d2..d646202 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java
@@ -349,7 +349,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553
-//  @Test
+  @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
@@ -364,7 +364,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553
-//  @Test
+  @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t3.id, t4.id\n" +
@@ -383,7 +383,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553
-//  @Test
+  @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" +
@@ -398,7 +398,7 @@ public class TestOuterJoinQuery extends TestJoinQuery {
   }
 
   // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553
-//  @Test
+  @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest(queries = {
       @QuerySpec("select t1.id, t1.name, t3.id, t4.id\n" +

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
index fa77fda..24b525d 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
@@ -370,4 +370,11 @@ public class TestSortQuery extends QueryTestCaseBase {
     assertResultSet(res);
     cleanupQuery(res);
   }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest()
+  public final void testSubQuerySortAfterGroupMultiBlocks() throws Exception {
+    runSimpleTests();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
index 03a80d1..03c9c24 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
@@ -512,4 +512,17 @@ public class TestUnionQuery extends QueryTestCaseBase {
     res.close();
   }
 
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
+  public void testComplexUnion1() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true)
+  @SimpleTest
+  public void testComplexUnion2() throws Exception {
+    runSimpleTests();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
index 0a473b5..c82637d 100644
--- a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
+++ b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
@@ -110,7 +110,7 @@ public class TestExecutionBlockCursor {
     optimizer.optimize(logicalPlan);
     QueryContext queryContext = new QueryContext(conf);
     MasterPlan plan = new MasterPlan(LocalTajoTestingUtility.newQueryId(), queryContext, logicalPlan);
-    planner.build(plan);
+    planner.build(queryContext, plan);
 
     ExecutionBlockCursor cursor = new ExecutionBlockCursor(plan);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
deleted file mode 100644
index 8591f88..0000000
--- a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
+++ /dev/null
@@ -1,347 +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.master;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.algebra.Expr;
-import org.apache.tajo.benchmark.TPCH;
-import org.apache.tajo.catalog.*;
-import org.apache.tajo.catalog.partition.PartitionMethodDesc;
-import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.catalog.statistics.TableStats;
-import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.engine.function.FunctionLoader;
-import org.apache.tajo.engine.parser.SQLAnalyzer;
-import org.apache.tajo.engine.planner.global.DataChannel;
-import org.apache.tajo.engine.planner.global.ExecutionBlock;
-import org.apache.tajo.engine.planner.global.GlobalPlanner;
-import org.apache.tajo.engine.planner.global.MasterPlan;
-import org.apache.tajo.engine.query.QueryContext;
-import org.apache.tajo.plan.*;
-import org.apache.tajo.plan.expr.BinaryEval;
-import org.apache.tajo.plan.expr.EvalType;
-import org.apache.tajo.plan.expr.FieldEval;
-import org.apache.tajo.plan.util.PlannerUtil;
-import org.apache.tajo.util.CommonTestingUtil;
-import org.apache.tajo.util.FileUtil;
-import org.apache.tajo.util.TUtil;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-public class TestGlobalPlanner {
-  private static Log LOG = LogFactory.getLog(TestGlobalPlanner.class);
-
-  private static TajoTestingCluster util;
-  private static CatalogService catalog;
-  private static SQLAnalyzer sqlAnalyzer;
-  private static LogicalPlanner planner;
-  private static LogicalOptimizer optimizer;
-  private static TPCH tpch;
-  private static GlobalPlanner globalPlanner;
-
-  @BeforeClass
-  public static void setUp() throws Exception {
-    util = new TajoTestingCluster();
-    util.startCatalogCluster();
-    catalog = util.getMiniCatalogCluster().getCatalog();
-    for (FunctionDesc funcDesc : FunctionLoader.findLegacyFunctions()) {
-      catalog.createFunction(funcDesc);
-    }
-    catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
-    catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
-
-    // TPC-H Schema for Complex Queries
-    String [] tables = {
-        "part", "supplier", "partsupp", "nation", "region", "lineitem", "orders", "customer", "customer_parts"
-    };
-    int [] volumes = {
-        100, 200, 50, 5, 5, 800, 300, 100, 707
-    };
-    tpch = new TPCH();
-    tpch.loadSchemas();
-    tpch.loadOutSchema();
-    for (int i = 0; i < tables.length; i++) {
-      TableMeta m = CatalogUtil.newTableMeta("CSV");
-      TableStats stats = new TableStats();
-      stats.setNumBytes(volumes[i]);
-      TableDesc d = CatalogUtil.newTableDesc(
-          CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, tables[i]), tpch.getSchema(tables[i]), m,
-          CommonTestingUtil.getTestDir());
-      d.setStats(stats);
-
-      if (tables[i].equals(TPCH.CUSTOMER_PARTS)) {
-        Schema expressionSchema = new Schema();
-        expressionSchema.addColumn("c_nationkey", TajoDataTypes.Type.INT4);
-        PartitionMethodDesc partitionMethodDesc = new PartitionMethodDesc(
-            DEFAULT_DATABASE_NAME,
-            tables[i],
-            CatalogProtos.PartitionType.COLUMN,
-            "c_nationkey",
-            expressionSchema);
-
-        d.setPartitionMethod(partitionMethodDesc);
-      }
-      catalog.createTable(d);
-    }
-
-    sqlAnalyzer = new SQLAnalyzer();
-    planner = new LogicalPlanner(catalog);
-    optimizer = new LogicalOptimizer(util.getConfiguration());
-    globalPlanner = new GlobalPlanner(util.getConfiguration(), catalog);
-  }
-
-  @AfterClass
-  public static void tearDown() {
-    util.shutdownCatalogCluster();
-  }
-
-  private MasterPlan buildPlan(String sql) throws PlanningException, IOException {
-    Expr expr = sqlAnalyzer.parse(sql);
-    QueryContext context = LocalTajoTestingUtility.createDummyContext(util.getConfiguration());
-    LogicalPlan plan = planner.createPlan(context, expr);
-    optimizer.optimize(context, plan);
-    MasterPlan masterPlan = new MasterPlan(LocalTajoTestingUtility.newQueryId(), context, plan);
-    globalPlanner.build(masterPlan);
-    return masterPlan;
-  }
-
-  @Test
-  public void testSelectDistinct() throws Exception {
-    buildPlan("select distinct l_orderkey from lineitem");
-  }
-
-  @Test
-  public void testSortAfterGroupBy() throws Exception {
-    buildPlan("select max(l_quantity) as max_quantity, l_orderkey from lineitem group by l_orderkey order by max_quantity");
-  }
-
-  @Test
-  public void testSortLimit() throws Exception {
-    buildPlan("select max(l_quantity) as max_quantity, l_orderkey from lineitem group by l_orderkey order by max_quantity limit 3");
-  }
-
-  @Test
-  public void testJoin() throws Exception {
-    buildPlan("select n_name, r_name, n_regionkey, r_regionkey from nation, region");
-  }
-
-  @Test
-  public void testThetaJoinKeyPairs() throws Exception {
-    StringBuilder sb = new StringBuilder();
-    sb.append("select n_nationkey, n_name, n_regionkey, t.cnt");
-    sb.append(" from nation n");
-    sb.append(" join");
-    sb.append(" (");
-    sb.append("   select r_regionkey, count(*) as cnt");
-    sb.append("   from nation n");
-    sb.append("   join region r on (n.n_regionkey = r.r_regionkey)");
-    sb.append("   group by r_regionkey");
-    sb.append(" ) t  on  (n.n_regionkey = t.r_regionkey)");
-    sb.append(" and n.n_nationkey > t.cnt ");
-    sb.append(" order by n_nationkey");
-
-    MasterPlan plan = buildPlan(sb.toString());
-    ExecutionBlock root = plan.getRoot();
-
-    Map<BinaryEval, Boolean> evalMap = TUtil.newHashMap();
-    BinaryEval eval1 = new BinaryEval(EvalType.EQUAL
-        , new FieldEval(new Column("default.n.n_regionkey", TajoDataTypes.Type.INT4))
-        , new FieldEval(new Column("default.t.r_regionkey", TajoDataTypes.Type.INT4))
-    );
-    evalMap.put(eval1, Boolean.FALSE);
-
-    BinaryEval eval2 = new BinaryEval(EvalType.EQUAL
-        , new FieldEval(new Column("default.n.n_nationkey", TajoDataTypes.Type.INT4))
-        , new FieldEval(new Column("default.t.cnt", TajoDataTypes.Type.INT4))
-    );
-    evalMap.put(eval2, Boolean.FALSE);
-
-    visitChildExecutionBLock(plan, root, evalMap);
-
-    // Find required shuffleKey.
-    assertTrue(evalMap.get(eval1).booleanValue());
-
-    // Find that ShuffleKeys only includes equi-join conditions
-    assertFalse(evalMap.get(eval2).booleanValue());
-  }
-
-  private void visitChildExecutionBLock(MasterPlan plan, ExecutionBlock parentBlock,
-                                        Map<BinaryEval, Boolean> qualMap) throws Exception {
-    boolean isExistLeftField, isExistRightField;
-
-    for (Map.Entry<BinaryEval, Boolean> entry : qualMap.entrySet()) {
-      FieldEval leftField = (FieldEval)entry.getKey().getLeftExpr();
-      FieldEval rightField = (FieldEval)entry.getKey().getRightExpr();
-
-      for (ExecutionBlock block : plan.getChilds(parentBlock))  {
-        isExistLeftField = false;
-        isExistRightField = false;
-
-        if (plan.getIncomingChannels(block.getId()) != null) {
-          for (DataChannel channel :plan.getIncomingChannels(block.getId())) {
-            if (channel.getShuffleKeys() != null) {
-              for (Column column : channel.getShuffleKeys()) {
-                if (column.getQualifiedName().equals(leftField.getColumnRef().getQualifiedName())) {
-                  isExistLeftField = true;
-                } else if (column.getQualifiedName().
-                    equals(rightField.getColumnRef().getQualifiedName())) {
-                  isExistRightField = true;
-                }
-              }
-            }
-          }
-
-          if(isExistLeftField && isExistRightField) {
-            qualMap.put(entry.getKey(), Boolean.TRUE);
-          }
-        }
-
-        visitChildExecutionBLock(plan, block, qualMap);
-      }
-    }
-  }
-
-  @Test
-  public void testUnion() throws IOException, PlanningException {
-    buildPlan("select o_custkey as num from orders union select c_custkey as num from customer union select p_partkey as num from part");
-  }
-
-  @Test
-  public void testSubQuery() throws IOException, PlanningException {
-    buildPlan("select l.l_orderkey from (select * from lineitem) l");
-  }
-
-  @Test
-  public void testSubQueryJoin() throws IOException, PlanningException {
-    buildPlan("select l.l_orderkey from (select * from lineitem) l join (select * from orders) o on l.l_orderkey = o.o_orderkey");
-  }
-
-  @Test
-  public void testSubQueryGroupBy() throws IOException, PlanningException {
-    buildPlan("select sum(l_extendedprice*l_discount) as revenue from (select * from lineitem) as l");
-  }
-
-  @Test
-  public void testSubQueryGroupBy2() throws IOException, PlanningException {
-    buildPlan("select l_orderkey, sum(l_extendedprice*l_discount)  as revenue from (select * from lineitem) as l group by l_orderkey");
-  }
-
-  @Test
-  public void testSubQuerySortAfterGroup() throws IOException, PlanningException {
-    buildPlan("select l_orderkey, sum(l_extendedprice*l_discount)  as revenue from (select * from lineitem) as l group by l_orderkey order by l_orderkey");
-  }
-
-  @Test
-  public void testSubQuerySortAfterGroupMultiBlocks() throws IOException, PlanningException {
-    buildPlan(
-        "select l_orderkey, revenue from (" +
-          "select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey"
-        +") l1"
-
-    );
-  }
-
-  @Test
-  public void testSubQuerySortAfterGroupMultiBlocks2() throws IOException, PlanningException {
-    buildPlan(
-        "select l_orderkey, revenue from (" +
-          "select l_orderkey, revenue from (" +
-              "select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey"
-              +") l1" +
-          ") l2 order by l_orderkey"
-
-    );
-  }
-
-  @Test
-  public void testComplexUnion1() throws Exception {
-    buildPlan(FileUtil.readTextFile(new File("src/test/resources/queries/default/complex_union_1.sql")));
-  }
-
-  @Test
-  public void testComplexUnion2() throws Exception {
-    buildPlan(FileUtil.readTextFile(new File("src/test/resources/queries/default/complex_union_2.sql")));
-  }
-
-  @Test
-  public void testUnionGroupBy1() throws Exception {
-    buildPlan("select l_orderkey, sum(l_extendedprice*l_discount) as revenue from (" +
-        "select * from lineitem " +
-        "union " +
-        "select * from lineitem ) l group by l_orderkey");
-  }
-
-  @Test
-  public void testTPCH_Q5() throws Exception {
-    buildPlan(FileUtil.readTextFile(new File("benchmark/tpch/q5.sql")));
-  }
-
-  @Test
-  public void testCheckIfSimpleQuery() throws Exception {
-    MasterPlan plan = buildPlan("select * from customer");
-    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    //partition table
-    plan = buildPlan("select * from customer_parts");
-    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    plan = buildPlan("select * from customer where c_nationkey = 1");
-    assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    // c_nationkey is partition column
-    plan = buildPlan("select * from customer_parts where c_nationkey = 1");
-    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    // same column order
-    plan = buildPlan("select c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment" +
-        " from customer");
-    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    plan = buildPlan("select c_custkey, c_name, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " +
-        " from customer_parts");
-    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    // different column order
-    plan = buildPlan("select c_name, c_custkey, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment" +
-        " from customer");
-    assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    plan = buildPlan("select c_name, c_custkey, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " +
-        " from customer_parts");
-    assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-
-    plan = buildPlan("insert into customer_parts " +
-        " select c_name, c_custkey, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " +
-        " from customer");
-    assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java b/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java
index b1a27fa..eca7f6d 100644
--- a/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java
@@ -105,7 +105,7 @@ public class TestKillQuery {
     QueryContext queryContext = new QueryContext(conf);
     MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan);
     GlobalPlanner globalPlanner = new GlobalPlanner(conf, catalog);
-    globalPlanner.build(masterPlan);
+    globalPlanner.build(queryContext, masterPlan);
 
     CountDownLatch barrier  = new CountDownLatch(1);
     MockAsyncDispatch dispatch = new MockAsyncDispatch(barrier, StageEventType.SQ_INIT);
@@ -169,7 +169,7 @@ public class TestKillQuery {
     QueryContext queryContext = new QueryContext(conf);
     MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan);
     GlobalPlanner globalPlanner = new GlobalPlanner(conf, catalog);
-    globalPlanner.build(masterPlan);
+    globalPlanner.build(queryContext, masterPlan);
 
     CountDownLatch barrier  = new CountDownLatch(1);
     MockAsyncDispatch dispatch = new MockAsyncDispatch(barrier, TajoProtos.QueryState.QUERY_RUNNING);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql b/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql
index 5cf3eb7..36c53cd 100644
--- a/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql
+++ b/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql
@@ -16,4 +16,4 @@ where
 order by
     l_orderkey,
     p_name,
-    n_name
\ No newline at end of file
+    n_name

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql b/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql
new file mode 100644
index 0000000..802e2b0
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql
@@ -0,0 +1,20 @@
+select
+  n_nationkey, n_name, n_regionkey, t.cnt
+from
+  nation n
+  join
+  (
+    select
+      r_regionkey, count(*) as cnt
+    from
+      nation n
+      join
+      region r
+    on (n.n_regionkey = r.r_regionkey)
+    group by
+      r_regionkey
+  ) t
+on
+  (n.n_regionkey = t.r_regionkey) and n.n_nationkey > t.cnt
+order by
+  n_nationkey
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql b/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql
new file mode 100644
index 0000000..3e7eaab
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql
@@ -0,0 +1,5 @@
+select l_orderkey, revenue from (
+  select l_orderkey, revenue from (
+    select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey
+  ) l1
+) l2 order by l_orderkey
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql b/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql
new file mode 100644
index 0000000..e7d3d56
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql
@@ -0,0 +1,24 @@
+select
+	n_name,
+	sum(l_extendedprice * (1 - l_discount)) as revenue
+from
+	customer,
+	orders,
+	lineitem,
+	supplier,
+	nation,
+	region
+where
+	c_custkey = o_custkey and
+	l_orderkey = o_orderkey and
+	l_suppkey = s_suppkey and
+	c_nationkey = s_nationkey and
+	s_nationkey = n_nationkey and
+	n_regionkey = r_regionkey and
+	r_name = 'ASIA' and
+	o_orderdate >= '1994-01-01' and
+	o_orderdate < '1995-01-01'
+group by
+	n_name
+order by
+	revenue desc
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql
new file mode 100644
index 0000000..0ba2909
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql
@@ -0,0 +1,27 @@
+SELECT
+  l_orderkey,
+  l_partkey,
+  query
+FROM
+  (
+  SELECT
+    l_orderkey,
+    l_partkey,
+    'abc' as query
+  FROM
+    lineitem
+  WHERE
+    l_orderkey = 1
+
+  UNION ALL
+
+  SELECT
+    l_orderkey,
+    l_partkey,
+    'bbc' as query
+  FROM
+    lineitem
+  WHERE
+    l_orderkey = 1
+) result
+

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql
new file mode 100644
index 0000000..d54ed27
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql
@@ -0,0 +1,35 @@
+SELECT *
+FROM
+(
+    SELECT
+        l_orderkey,
+        l_partkey,
+        url
+    FROM
+        (
+          SELECT
+            l_orderkey,
+            l_partkey,
+            CASE
+              WHEN
+                l_partkey IS NOT NULL THEN ''
+              WHEN l_orderkey = 1 THEN '1'
+            ELSE
+              '2'
+            END AS url
+          FROM
+            lineitem
+        ) res1
+        JOIN
+        (
+          SELECT
+            *
+          FROM
+            part
+        ) res2
+        ON l_partkey = p_partkey
+) result
+
+
+
+

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/default/complex_union_1.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/default/complex_union_1.sql b/tajo-core/src/test/resources/queries/default/complex_union_1.sql
deleted file mode 100644
index 9020ad7..0000000
--- a/tajo-core/src/test/resources/queries/default/complex_union_1.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-create table xdr_url as
-
-SELECT
-  l_orderkey,
-  l_partkey,
-  query
-FROM
-  (
-  SELECT
-    l_orderkey,
-    l_partkey,
-    'abc' as query
-  FROM
-    lineitem
-  WHERE
-    l_orderkey = 1
-
-  UNION ALL
-
-  SELECT
-    l_orderkey,
-    l_partkey,
-    'bbc' as query
-  FROM
-    lineitem
-  WHERE
-    l_orderkey = 1
-) result
-

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/default/complex_union_2.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/default/complex_union_2.sql b/tajo-core/src/test/resources/queries/default/complex_union_2.sql
deleted file mode 100644
index d54ed27..0000000
--- a/tajo-core/src/test/resources/queries/default/complex_union_2.sql
+++ /dev/null
@@ -1,35 +0,0 @@
-SELECT *
-FROM
-(
-    SELECT
-        l_orderkey,
-        l_partkey,
-        url
-    FROM
-        (
-          SELECT
-            l_orderkey,
-            l_partkey,
-            CASE
-              WHEN
-                l_partkey IS NOT NULL THEN ''
-              WHEN l_orderkey = 1 THEN '1'
-            ELSE
-              '2'
-            END AS url
-          FROM
-            lineitem
-        ) res1
-        JOIN
-        (
-          SELECT
-            *
-          FROM
-            part
-        ) res2
-        ON l_partkey = p_partkey
-) result
-
-
-
-

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan
index a308b15..fa8c71e 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.orders
- 1: type=Broadcast, tables=default.lineitem
- 2: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.part
+ 2: type=Broadcast, tables=default.lineitem
+ 3: type=Broadcast, tables=default.customer
 
-JOIN(14)(INNER)
-  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
-  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
-  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(2) on default.part
-     => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
-     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
-     => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)
-     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-     => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(0) on default.lineitem
-        => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-        => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-      SCAN(1) on default.orders
-        => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
-        => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.customer
-
-JOIN(15)(INNER)
-  => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4)
-  => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT)
-  => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-  => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-   SCAN(3) on default.customer
-     => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)
-     => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)}
-     => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-   SCAN(4) on default.nation
-     => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
-     => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.orders.o_custkey (INT4) = default.customer.c_custkey (INT4)
      => target list: default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)
      => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
      => in schema: {(5) default.customer.c_custkey (INT4), default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4)
+        => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT)
         => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-        => in schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+         SCAN(3) on default.customer
+           => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)
+           => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)}
+           => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+         SCAN(4) on default.nation
+           => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
+           => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+        => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
         => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-        => in schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
+        => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+         SCAN(2) on default.part
+           => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
+           => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)
+           => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+           => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+            SCAN(0) on default.lineitem
+              => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+              => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+              => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+            SCAN(1) on default.orders
+              => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
+              => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+              => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
      => in schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan
index a308b15..fa8c71e 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=default.orders
- 1: type=Broadcast, tables=default.lineitem
- 2: type=Broadcast, tables=default.part
+ 1: type=Broadcast, tables=default.part
+ 2: type=Broadcast, tables=default.lineitem
+ 3: type=Broadcast, tables=default.customer
 
-JOIN(14)(INNER)
-  => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
-  => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
-  => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-  => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-   SCAN(2) on default.part
-     => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
-     => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
-     => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
-   JOIN(13)(INNER)
-     => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
-     => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)
-     => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
-     => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-      SCAN(0) on default.lineitem
-        => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
-        => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
-        => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
-      SCAN(1) on default.orders
-        => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
-        => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
-        => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.customer
-
-JOIN(15)(INNER)
-  => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4)
-  => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT)
-  => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-  => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-   SCAN(3) on default.customer
-     => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)
-     => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)}
-     => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
-   SCAN(4) on default.nation
-     => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
-     => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
-     => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
    JOIN(16)(INNER)
      => Join Cond: default.orders.o_custkey (INT4) = default.customer.c_custkey (INT4)
      => target list: default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)
      => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
      => in schema: {(5) default.customer.c_custkey (INT4), default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4)
+        => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT)
         => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-        => in schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+         SCAN(3) on default.customer
+           => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)
+           => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)}
+           => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+         SCAN(4) on default.nation
+           => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)
+           => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)}
+           => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+      JOIN(14)(INNER)
+        => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4)
+        => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)
         => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
-        => in schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)}
+        => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+         SCAN(2) on default.part
+           => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4)
+           => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)}
+           => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
+         JOIN(13)(INNER)
+           => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4)
+           => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)
+           => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)}
+           => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+            SCAN(0) on default.lineitem
+              => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)
+              => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)}
+              => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+            SCAN(1) on default.orders
+              => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
+              => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
+              => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
      => in schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan
index 2210ad9..e5b8455 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_name (TEXT) = ?upper_1 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan
index 2210ad9..e5b8455 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_name (TEXT) = ?upper_1 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan
index 51a0645..7c88933 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_name (TEXT) = name (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan
index 51a0645..7c88933 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_name (TEXT) = name (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan
index 97fd030..f35d486 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: ?lower_1 (TEXT) = ?lower_2 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan
index 97fd030..f35d486 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: ?lower_1 (TEXT) = ?lower_2 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
      => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan
index 41127e8..fb73ee5 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: name1 (TEXT) = name2 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
      => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan
index 41127e8..fb73ee5 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.n1
- 1: type=Broadcast, tables=default.n2
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
    JOIN(6)(INNER)
      => Join Cond: name1 (TEXT) = name2 (TEXT)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.n1.n_nationkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
      => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan
index c11b4c8..0fb22b3 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
    JOIN(6)(CROSS)
      => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan
index c11b4c8..0fb22b3 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
    JOIN(6)(CROSS)
      => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan
index ed77747..453e12f 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan
@@ -32,7 +32,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.customer
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan
index ed77747..453e12f 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan
@@ -32,7 +32,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.customer
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)


[02/24] tajo git commit: TAJO-1599: Implement NodeResourceManager and Status updater. (jinho)

Posted by ji...@apache.org.
TAJO-1599: Implement NodeResourceManager and Status updater. (jinho)

Closes #577


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

Branch: refs/heads/index_support
Commit: 25bd5cb44a03ee425b02e2bc2553f7d0f8affff5
Parents: 4b2ab61
Author: Jinho Kim <jh...@apache.org>
Authored: Tue May 26 16:46:17 2015 +0900
Committer: Jinho Kim <jh...@apache.org>
Committed: Tue May 26 16:46:17 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 .../java/org/apache/tajo/conf/TajoConf.java     |   9 +-
 tajo-common/src/main/proto/tajo_protos.proto    |   6 +
 .../tajo/master/rm/TajoResourceTracker.java     |   9 +
 .../resource/DefaultResourceCalculator.java     | 109 ++++++++
 .../org/apache/tajo/resource/NodeResource.java  | 188 +++++++++++++
 .../org/apache/tajo/resource/NodeResources.java | 195 +++++++++++++
 .../tajo/resource/ResourceCalculator.java       | 169 ++++++++++++
 .../apache/tajo/worker/NodeResourceManager.java | 148 ++++++++++
 .../apache/tajo/worker/NodeStatusUpdater.java   | 274 +++++++++++++++++++
 .../tajo/worker/WorkerHeartbeatService.java     |   1 +
 .../worker/event/NodeResourceAllocateEvent.java |  46 ++++
 .../event/NodeResourceDeallocateEvent.java      |  40 +++
 .../worker/event/NodeResourceManagerEvent.java  |  34 +++
 .../tajo/worker/event/NodeStatusEvent.java      |  40 +++
 .../main/proto/ResourceTrackerProtocol.proto    |  27 ++
 .../src/main/proto/TajoWorkerProtocol.proto     |  16 ++
 .../org/apache/tajo/resource/TestResources.java |  48 ++++
 .../tajo/worker/MockNodeStatusUpdater.java      | 105 +++++++
 .../tajo/worker/TestNodeResourceManager.java    | 235 ++++++++++++++++
 .../tajo/worker/TestNodeStatusUpdater.java      | 115 ++++++++
 .../java/org/apache/tajo/storage/DiskUtil.java  |   4 +-
 22 files changed, 1816 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 0d71d2f..c79a185 100644
--- a/CHANGES
+++ b/CHANGES
@@ -310,6 +310,8 @@ Release 0.11.0 - unreleased
 
   SUB TASKS
 
+    TAJO-1599: Implement NodeResourceManager and Status updater. (jinho)
+
     TAJO-1613: Rename StorageManager to Tablespace. (hyunsik)
 
     TAJO-1359: Add nested field projector and language extension to project 

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index 59b1f43..e20658b 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -171,9 +171,14 @@ public class TajoConf extends Configuration {
     WORKER_TEMPORAL_DIR_CLEANUP("tajo.worker.tmpdir.cleanup-at-startup", false, Validators.bool()),
 
     // Tajo Worker Resources
-    WORKER_RESOURCE_AVAILABLE_CPU_CORES("tajo.worker.resource.cpu-cores", 1, Validators.min("1")),
+    WORKER_RESOURCE_AVAILABLE_CPU_CORES("tajo.worker.resource.cpu-cores",
+        Runtime.getRuntime().availableProcessors(), Validators.min("1")),
     WORKER_RESOURCE_AVAILABLE_MEMORY_MB("tajo.worker.resource.memory-mb", 1024, Validators.min("64")),
+    @Deprecated
     WORKER_RESOURCE_AVAILABLE_DISKS("tajo.worker.resource.disks", 1.0f),
+    WORKER_RESOURCE_AVAILABLE_DISKS_NUM("tajo.worker.resource.disks.num", 1, Validators.min("1")),
+    WORKER_RESOURCE_AVAILABLE_DISK_PARALLEL_NUM("tajo.worker.resource.disk.parallel-execution.num", 2,
+        Validators.min("1")),
     WORKER_EXECUTION_MAX_SLOTS("tajo.worker.parallel-execution.max-num", 2),
     WORKER_RESOURCE_DFS_DIR_AWARE("tajo.worker.resource.dfs-dir-aware", false, Validators.bool()),
 
@@ -186,7 +191,7 @@ public class TajoConf extends Configuration {
     WORKER_HISTORY_EXPIRE_PERIOD("tajo.worker.history.expire-interval-minutes", 60), // 1 hours
     QUERYMASTER_HISTORY_EXPIRE_PERIOD("tajo.qm.history.expire-interval-minutes", 6 * 60), // 6 hours
 
-    WORKER_HEARTBEAT_TIMEOUT("tajo.worker.heartbeat.timeout", 120 * 1000),  // 120 sec
+    WORKER_HEARTBEAT_INTERVAL("tajo.worker.heartbeat.interval", 10 * 1000),  // 10 sec
 
     // Resource Manager
     RESOURCE_MANAGER_CLASS("tajo.resource.manager", "org.apache.tajo.master.rm.TajoWorkerResourceManager",

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-common/src/main/proto/tajo_protos.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/tajo_protos.proto b/tajo-common/src/main/proto/tajo_protos.proto
index b6cd9ef..8474f54 100644
--- a/tajo-common/src/main/proto/tajo_protos.proto
+++ b/tajo-common/src/main/proto/tajo_protos.proto
@@ -62,4 +62,10 @@ message WorkerConnectionInfoProto {
     optional int32 queryMasterPort = 5;
     required int32 clientPort = 6;
     required int32 httpInfoPort = 7;
+}
+
+message NodeResourceProto {
+  optional int32 memory = 1;
+  optional int32 virtual_cores = 2;
+  optional int32 disks = 3;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/master/rm/TajoResourceTracker.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/rm/TajoResourceTracker.java b/tajo-core/src/main/java/org/apache/tajo/master/rm/TajoResourceTracker.java
index 4f3b66a..af28886 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/rm/TajoResourceTracker.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/rm/TajoResourceTracker.java
@@ -20,10 +20,12 @@ package org.apache.tajo.master.rm;
 
 import com.google.protobuf.RpcCallback;
 import com.google.protobuf.RpcController;
+import com.google.protobuf.ServiceException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.service.AbstractService;
+import org.apache.tajo.common.exception.NotImplementedException;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.ipc.QueryCoordinatorProtocol.TajoHeartbeatResponse;
 import org.apache.tajo.ipc.TajoResourceTrackerProtocol;
@@ -182,6 +184,13 @@ public class TajoResourceTracker extends AbstractService implements TajoResource
     }
   }
 
+  @Override
+  public void nodeHeartbeat(RpcController controller, TajoResourceTrackerProtocol.NodeHeartbeatRequestProto request,
+                            RpcCallback<TajoResourceTrackerProtocol.NodeHeartbeatResponseProto> done) {
+    //TODO implement with ResourceManager for scheduler
+    throw new RuntimeException(new ServiceException(new NotImplementedException().getMessage()));
+  }
+
   private Worker createWorkerResource(NodeHeartbeat request) {
     WorkerResource workerResource = new WorkerResource();
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/resource/DefaultResourceCalculator.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/resource/DefaultResourceCalculator.java b/tajo-core/src/main/java/org/apache/tajo/resource/DefaultResourceCalculator.java
new file mode 100644
index 0000000..58b8a26
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/resource/DefaultResourceCalculator.java
@@ -0,0 +1,109 @@
+/**
+* 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.resource;
+
+
+public class DefaultResourceCalculator extends ResourceCalculator {
+  
+  @Override
+  public int compare(NodeResource unused, NodeResource lhs, NodeResource rhs) {
+    return lhs.compareTo(rhs);
+  }
+
+  @Override
+  public int computeAvailableContainers(NodeResource available, NodeResource required) {
+    return Math.min(Math.min(
+        available.getMemory() / required.getMemory(),
+        available.getDisks() / required.getDisks()),
+        available.getVirtualCores() / required.getVirtualCores());
+  }
+
+  @Override
+  public float divide(NodeResource unused,
+                      NodeResource numerator, NodeResource denominator) {
+    return ratio(numerator, denominator);
+  }
+  
+  public boolean isInvalidDivisor(NodeResource r) {
+    if (r.getMemory() == 0.0f) {
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public float ratio(NodeResource a, NodeResource b) {
+    return (float)a.getMemory() / b.getMemory();
+  }
+
+  @Override
+  public NodeResource divideAndCeil(NodeResource numerator, int denominator) {
+    return NodeResources.createResource(
+        divideAndCeil(numerator.getMemory(), denominator));
+  }
+
+  @Override
+  public NodeResource normalize(NodeResource r, NodeResource minimumResource,
+                                NodeResource maximumResource, NodeResource stepFactor) {
+    int normalizedMemory = Math.min(
+        roundUp(
+            Math.max(r.getMemory(), minimumResource.getMemory()),
+            stepFactor.getMemory()),
+            maximumResource.getMemory());
+    return NodeResources.createResource(normalizedMemory);
+  }
+
+  @Override
+  public NodeResource normalize(NodeResource r, NodeResource minimumResource,
+                                NodeResource maximumResource) {
+    return normalize(r, minimumResource, maximumResource, minimumResource);
+  }
+
+  @Override
+  public NodeResource roundUp(NodeResource r, NodeResource stepFactor) {
+    return NodeResources.createResource(
+        roundUp(r.getMemory(), stepFactor.getMemory())
+    );
+  }
+
+  @Override
+  public NodeResource roundDown(NodeResource r, NodeResource stepFactor) {
+    return NodeResources.createResource(
+        roundDown(r.getMemory(), stepFactor.getMemory()));
+  }
+
+  @Override
+  public NodeResource multiplyAndNormalizeUp(NodeResource r, double by,
+      NodeResource stepFactor) {
+    return NodeResources.createResource(
+        roundUp((int) (r.getMemory() * by + 0.5), stepFactor.getMemory())
+    );
+  }
+
+  @Override
+  public NodeResource multiplyAndNormalizeDown(NodeResource r, double by,
+      NodeResource stepFactor) {
+    return NodeResources.createResource(
+        roundDown(
+            (int) (r.getMemory() * by),
+            stepFactor.getMemory()
+        )
+    );
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/resource/NodeResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/resource/NodeResource.java b/tajo-core/src/main/java/org/apache/tajo/resource/NodeResource.java
new file mode 100644
index 0000000..f51fc07
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/resource/NodeResource.java
@@ -0,0 +1,188 @@
+/**
+ * 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.resource;
+
+import com.google.common.base.Objects;
+import io.netty.util.internal.PlatformDependent;
+import org.apache.tajo.TajoProtos;
+import org.apache.tajo.common.ProtoObject;
+
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+
+/**
+ * <p><code>NodeResource</code> models a set of computer resources in the
+ * cluster.</p>
+ * <p/>
+ * <p>Currently it models  <em>memory</em> and <em>disk</em> and <em>CPU</em>.</p>
+ * <p/>
+ * <p>The unit for memory is megabytes. The unit for disks is the number of disk.
+ * CPU is modeled with virtual cores (vcores), a unit for expressing parallelism.
+ * A node's capacity should be configured with virtual cores equal to its number of physical cores.
+ * A task should be requested with the number of cores it can saturate.</p>
+ * <p/>
+ */
+
+public class NodeResource implements ProtoObject<TajoProtos.NodeResourceProto>, Comparable<NodeResource> {
+
+  private volatile int memory;
+  private volatile int disks;
+  private volatile int vCores;
+
+  private static AtomicIntegerFieldUpdater MEMORY_UPDATER;
+  private static AtomicIntegerFieldUpdater DISKS_UPDATER;
+  private static AtomicIntegerFieldUpdater VCORES_UPDATER;
+
+  static {
+    MEMORY_UPDATER = PlatformDependent.newAtomicIntegerFieldUpdater(NodeResource.class, "memory");
+    if (MEMORY_UPDATER == null) {
+      MEMORY_UPDATER = AtomicIntegerFieldUpdater.newUpdater(NodeResource.class, "memory");
+      DISKS_UPDATER = AtomicIntegerFieldUpdater.newUpdater(NodeResource.class, "disks");
+      VCORES_UPDATER = AtomicIntegerFieldUpdater.newUpdater(NodeResource.class, "vCores");
+    } else {
+      DISKS_UPDATER = PlatformDependent.newAtomicIntegerFieldUpdater(NodeResource.class, "disks");
+      VCORES_UPDATER = PlatformDependent.newAtomicIntegerFieldUpdater(NodeResource.class, "vCores");
+    }
+  }
+
+  public NodeResource(TajoProtos.NodeResourceProto proto) {
+    setMemory(proto.getMemory());
+    setDisks(proto.getDisks());
+    setVirtualCores(proto.getVirtualCores());
+  }
+
+  private NodeResource() {
+
+  }
+
+  public static NodeResource createResource(int memory,  int disks, int vCores) {
+    return new NodeResource().setMemory(memory).setDisks(disks).setVirtualCores(vCores);
+  }
+
+  /**
+   * Get <em>memory</em> of the resource.
+   *
+   * @return <em>memory</em> of the resource
+   */
+  public int getMemory() {
+    return memory;
+  }
+
+  /**
+   * Set <em>memory</em> of the resource.
+   *
+   * @param memory <em>memory</em> of the resource
+   */
+  @SuppressWarnings("unchecked")
+  public NodeResource setMemory(int memory) {
+    MEMORY_UPDATER.lazySet(this, memory);
+    return this;
+  }
+
+
+  /**
+   * Get <em>number of disks</em> of the resource.
+   *
+   * @return <em>number of disks</em> of the resource
+   */
+  public int getDisks() {
+    return disks;
+  }
+
+  /**
+   * Set <em>number of disks </em> of the resource.
+   *
+   * @param disks <em>number of disks</em> of the resource
+   */
+  @SuppressWarnings("unchecked")
+  public NodeResource setDisks(int disks) {
+    DISKS_UPDATER.lazySet(this, disks);
+    return this;
+  }
+
+  /**
+   * Get <em>number of virtual cpu cores</em> of the resource.
+   * Virtual cores are a unit for expressing CPU parallelism. A node's capacity
+   * should be configured with virtual cores equal to its number of physical cores.
+   *
+   * @return <em>num of virtual cpu cores</em> of the resource
+   */
+  public int getVirtualCores() {
+    return vCores;
+  }
+
+
+  /**
+   * Set <em>number of virtual cpu cores</em> of the resource.
+   *
+   * @param vCores <em>number of virtual cpu cores</em> of the resource
+   */
+  @SuppressWarnings("unchecked")
+  public NodeResource setVirtualCores(int vCores) {
+    VCORES_UPDATER.lazySet(this, vCores);
+    return this;
+  }
+
+  @Override
+  public TajoProtos.NodeResourceProto getProto() {
+    TajoProtos.NodeResourceProto.Builder builder = TajoProtos.NodeResourceProto.newBuilder();
+    builder.setMemory(memory)
+        .setDisks(disks)
+        .setVirtualCores(vCores);
+    return builder.build();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(getMemory(), getDisks(), getVirtualCores());
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj)
+      return true;
+    if (obj == null)
+      return false;
+    if (!(obj instanceof NodeResource))
+      return false;
+    NodeResource other = (NodeResource) obj;
+    if (getMemory() != other.getMemory() ||
+        getDisks() != other.getDisks() ||
+        getVirtualCores() != other.getVirtualCores()) {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int compareTo(NodeResource other) {
+    int diff = this.getMemory() - other.getMemory();
+    if (diff == 0) {
+      diff = this.getDisks() - other.getDisks();
+    }
+    if (diff == 0) {
+      diff = this.getVirtualCores() - other.getVirtualCores();
+    }
+    return diff;
+  }
+
+  @Override
+  public String toString() {
+    return "<memory:" + getMemory() + ", disks:" + getDisks() + ", vCores:" + getVirtualCores() + ">";
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/resource/NodeResources.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/resource/NodeResources.java b/tajo-core/src/main/java/org/apache/tajo/resource/NodeResources.java
new file mode 100644
index 0000000..01e9dcf
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/resource/NodeResources.java
@@ -0,0 +1,195 @@
+/**
+* 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.resource;
+
+
+public class NodeResources {
+
+  public static NodeResource createResource(int memory) {
+    return createResource(memory, 0);
+  }
+
+  public static NodeResource createResource(int memory, int disks) {
+    return NodeResource.createResource(memory, disks, (memory > 0) ? 1 : 0);
+  }
+
+  public static NodeResource createResource(int memory, int disks, int vCores) {
+    return NodeResource.createResource(memory, disks, vCores);
+  }
+
+  public static NodeResource clone(NodeResource res) {
+    return NodeResource.createResource(res.getMemory(), res.getDisks(), res.getVirtualCores());
+  }
+
+  public static NodeResource update(NodeResource lhs, NodeResource rhs) {
+    return lhs.setMemory(rhs.getMemory()).setDisks(rhs.getDisks()).setVirtualCores(rhs.getVirtualCores());
+  }
+
+  public static NodeResource addTo(NodeResource lhs, NodeResource rhs) {
+    lhs.setMemory(lhs.getMemory() + rhs.getMemory())
+        .setVirtualCores(lhs.getVirtualCores() + rhs.getVirtualCores())
+        .setDisks(lhs.getDisks() + rhs.getDisks());
+    return lhs;
+  }
+
+  public static NodeResource add(NodeResource lhs, NodeResource rhs) {
+    return addTo(clone(lhs), rhs);
+  }
+
+  public static NodeResource subtractFrom(NodeResource lhs, NodeResource rhs) {
+    lhs.setMemory(lhs.getMemory() - rhs.getMemory())
+        .setVirtualCores(lhs.getVirtualCores() - rhs.getVirtualCores())
+        .setDisks(lhs.getDisks() - rhs.getDisks());
+    return lhs;
+  }
+
+  public static NodeResource subtract(NodeResource lhs, NodeResource rhs) {
+    return subtractFrom(clone(lhs), rhs);
+  }
+
+  public static NodeResource multiplyTo(NodeResource lhs, double by) {
+    lhs.setMemory((int) (lhs.getMemory() * by))
+        .setVirtualCores((int) (lhs.getVirtualCores() * by))
+        .setDisks((int) (lhs.getDisks() * by));
+    return lhs;
+  }
+
+  public static NodeResource multiply(NodeResource lhs, double by) {
+    return multiplyTo(clone(lhs), by);
+  }
+  
+  public static NodeResource multiplyAndNormalizeUp(
+      ResourceCalculator calculator,NodeResource lhs, double by, NodeResource factor) {
+    return calculator.multiplyAndNormalizeUp(lhs, by, factor);
+  }
+
+  public static NodeResource multiplyAndNormalizeDown(
+      ResourceCalculator calculator,NodeResource lhs, double by, NodeResource factor) {
+    return calculator.multiplyAndNormalizeDown(lhs, by, factor);
+  }
+
+  public static NodeResource multiplyAndRoundDown(NodeResource lhs, double by) {
+    NodeResource out = clone(lhs);
+    out.setMemory((int)(lhs.getMemory() * by));
+    out.setDisks((int)(lhs.getDisks() * by));
+    out.setVirtualCores((int)(lhs.getVirtualCores() * by));
+    return out;
+  }
+
+  public static NodeResource normalize(
+      ResourceCalculator calculator, NodeResource lhs, NodeResource min,
+      NodeResource max, NodeResource increment) {
+    return calculator.normalize(lhs, min, max, increment);
+  }
+
+  public static NodeResource roundUp(
+      ResourceCalculator calculator, NodeResource lhs, NodeResource factor) {
+    return calculator.roundUp(lhs, factor);
+  }
+
+  public static NodeResource roundDown(
+      ResourceCalculator calculator, NodeResource lhs, NodeResource factor) {
+    return calculator.roundDown(lhs, factor);
+  }
+
+  public static boolean isInvalidDivisor(
+      ResourceCalculator resourceCalculator, NodeResource divisor) {
+    return resourceCalculator.isInvalidDivisor(divisor);
+  }
+
+  public static float ratio(
+      ResourceCalculator resourceCalculator, NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.ratio(lhs, rhs);
+  }
+
+  public static float divide(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource, NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.divide(clusterResource, lhs, rhs);
+  }
+
+  public static NodeResource divideAndCeil(
+      ResourceCalculator resourceCalculator, NodeResource lhs, int rhs) {
+    return resourceCalculator.divideAndCeil(lhs, rhs);
+  }
+
+  public static boolean equals(NodeResource lhs, NodeResource rhs) {
+    return lhs.equals(rhs);
+  }
+
+  public static boolean lessThan(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return (resourceCalculator.compare(clusterResource, lhs, rhs) < 0);
+  }
+
+  public static boolean lessThanOrEqual(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return (resourceCalculator.compare(clusterResource, lhs, rhs) <= 0);
+  }
+
+  public static boolean greaterThan(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.compare(clusterResource, lhs, rhs) > 0;
+  }
+
+  public static boolean greaterThanOrEqual(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.compare(clusterResource, lhs, rhs) >= 0;
+  }
+
+  public static NodeResource min(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.compare(clusterResource, lhs, rhs) <= 0 ? lhs : rhs;
+  }
+
+  public static NodeResource max(
+      ResourceCalculator resourceCalculator,
+      NodeResource clusterResource,
+      NodeResource lhs, NodeResource rhs) {
+    return resourceCalculator.compare(clusterResource, lhs, rhs) >= 0 ? lhs : rhs;
+  }
+
+  public static boolean fitsIn(NodeResource smaller, NodeResource bigger) {
+    return smaller.getMemory() <= bigger.getMemory() &&
+        smaller.getDisks() <= bigger.getDisks() &&
+        smaller.getVirtualCores() <= bigger.getVirtualCores();
+  }
+
+  public static NodeResource componentwiseMin(NodeResource lhs, NodeResource rhs) {
+    return createResource(Math.min(lhs.getMemory(), rhs.getMemory()),
+        Math.min(lhs.getDisks(), rhs.getDisks()),
+        Math.min(lhs.getVirtualCores(), rhs.getVirtualCores()));
+  }
+
+  public static NodeResource componentwiseMax(NodeResource lhs, NodeResource rhs) {
+    return createResource(Math.max(lhs.getMemory(), rhs.getMemory()),
+        Math.max(lhs.getDisks(), rhs.getDisks()),
+        Math.max(lhs.getVirtualCores(), rhs.getVirtualCores()));
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/resource/ResourceCalculator.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/resource/ResourceCalculator.java b/tajo-core/src/main/java/org/apache/tajo/resource/ResourceCalculator.java
new file mode 100644
index 0000000..b08228f
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/resource/ResourceCalculator.java
@@ -0,0 +1,169 @@
+/**
+* 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.resource;
+
+
+/**
+ * A set of {@link NodeResource} comparison and manipulation interfaces.
+ */
+
+public abstract class ResourceCalculator {
+
+  public abstract int 
+  compare(NodeResource clusterResource, NodeResource lhs, NodeResource rhs);
+  
+  public static int divideAndCeil(int a, int b) {
+    if (b == 0) {
+      return 0;
+    }
+    return (a + (b - 1)) / b;
+  }
+
+  public static int roundUp(int a, int b) {
+    return divideAndCeil(a, b) * b;
+  }
+
+  public static int roundDown(int a, int b) {
+    return (a / b) * b;
+  }
+
+  /**
+   * Compute the number of containers which can be allocated given
+   * <code>available</code> and <code>required</code> resources.
+   * 
+   * @param available available resources
+   * @param required required resources
+   * @return number of containers which can be allocated
+   */
+  public abstract int computeAvailableContainers(
+      NodeResource available, NodeResource required);
+  /**
+   * Multiply resource <code>r</code> by factor <code>by</code> 
+   * and normalize up using step-factor <code>stepFactor</code>.
+   * 
+   * @param r resource to be multiplied
+   * @param by multiplier
+   * @param stepFactor factor by which to normalize up 
+   * @return resulting normalized resource
+   */
+  public abstract NodeResource multiplyAndNormalizeUp(
+      NodeResource r, double by, NodeResource stepFactor);
+  
+  /**
+   * Multiply resource <code>r</code> by factor <code>by</code> 
+   * and normalize down using step-factor <code>stepFactor</code>.
+   * 
+   * @param r resource to be multiplied
+   * @param by multiplier
+   * @param stepFactor factor by which to normalize down 
+   * @return resulting normalized resource
+   */
+  public abstract NodeResource multiplyAndNormalizeDown(
+      NodeResource r, double by, NodeResource stepFactor);
+  
+  /**
+   * Normalize resource <code>r</code> given the base 
+   * <code>minimumResource</code> and verify against max allowed
+   * <code>maximumResource</code>
+   * 
+   * @param r resource
+   * @param minimumResource step-factor
+   * @param maximumResource the upper bound of the resource to be allocated
+   * @return normalized resource
+   */
+  public NodeResource normalize(NodeResource r, NodeResource minimumResource,
+      NodeResource maximumResource) {
+    return normalize(r, minimumResource, maximumResource, minimumResource);
+  }
+
+  /**
+   * Normalize resource <code>r</code> given the base 
+   * <code>minimumResource</code> and verify against max allowed
+   * <code>maximumResource</code> using a step factor for hte normalization.
+   *
+   * @param r resource
+   * @param minimumResource minimum value
+   * @param maximumResource the upper bound of the resource to be allocated
+   * @param stepFactor the increment for resources to be allocated
+   * @return normalized resource
+   */
+  public abstract NodeResource normalize(NodeResource r, NodeResource minimumResource,
+                                     NodeResource maximumResource,
+                                     NodeResource stepFactor);
+
+
+  /**
+   * Round-up resource <code>r</code> given factor <code>stepFactor</code>.
+   * 
+   * @param r resource
+   * @param stepFactor step-factor
+   * @return rounded resource
+   */
+  public abstract NodeResource roundUp(NodeResource r, NodeResource stepFactor);
+  
+  /**
+   * Round-down resource <code>r</code> given factor <code>stepFactor</code>.
+   * 
+   * @param r resource
+   * @param stepFactor step-factor
+   * @return rounded resource
+   */
+  public abstract NodeResource roundDown(NodeResource r, NodeResource stepFactor);
+  
+  /**
+   * Divide resource <code>numerator</code> by resource <code>denominator</code>
+   * using specified policy (domination, average, fairness etc.); hence overall
+   * <code>clusterResource</code> is provided for context.
+   *  
+   * @param clusterResource cluster resources
+   * @param numerator numerator
+   * @param denominator denominator
+   * @return <code>numerator</code>/<code>denominator</code> 
+   *         using specific policy
+   */
+  public abstract float divide(
+      NodeResource clusterResource, NodeResource numerator, NodeResource denominator);
+  
+  /**
+   * Determine if a resource is not suitable for use as a divisor
+   * (will result in divide by 0, etc)
+   *
+   * @param r resource
+   * @return true if divisor is invalid (should not be used), false else
+   */
+  public abstract boolean isInvalidDivisor(NodeResource r);
+
+  /**
+   * Ratio of resource <code>a</code> to resource <code>b</code>.
+   * 
+   * @param a resource 
+   * @param b resource
+   * @return ratio of resource <code>a</code> to resource <code>b</code>
+   */
+  public abstract float ratio(NodeResource a, NodeResource b);
+
+  /**
+   * Divide-and-ceil <code>numerator</code> by <code>denominator</code>.
+   * 
+   * @param numerator numerator resource
+   * @param denominator denominator
+   * @return resultant resource
+   */
+  public abstract NodeResource divideAndCeil(NodeResource numerator, int denominator);
+  
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/NodeResourceManager.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/NodeResourceManager.java b/tajo-core/src/main/java/org/apache/tajo/worker/NodeResourceManager.java
new file mode 100644
index 0000000..20eec6b
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/NodeResourceManager.java
@@ -0,0 +1,148 @@
+/**
+* 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.worker;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.AbstractService;
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.resource.NodeResource;
+import org.apache.tajo.resource.NodeResources;
+import org.apache.tajo.storage.DiskUtil;
+import org.apache.tajo.unit.StorageUnit;
+import org.apache.tajo.util.CommonTestingUtil;
+import org.apache.tajo.worker.event.NodeResourceAllocateEvent;
+import org.apache.tajo.worker.event.NodeResourceDeallocateEvent;
+import org.apache.tajo.worker.event.NodeResourceManagerEvent;
+import org.apache.tajo.worker.event.NodeStatusEvent;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.apache.tajo.ipc.TajoWorkerProtocol.*;
+
+public class NodeResourceManager extends AbstractService implements EventHandler<NodeResourceManagerEvent> {
+  private static final Log LOG = LogFactory.getLog(NodeResourceManager.class);
+
+  private final Dispatcher dispatcher;
+  private NodeResource totalResource;
+  private NodeResource availableResource;
+  private AtomicInteger allocatedSize;
+  private TajoConf tajoConf;
+
+  public NodeResourceManager(Dispatcher dispatcher){
+    super(NodeResourceManager.class.getName());
+    this.dispatcher = dispatcher;
+  }
+
+  @Override
+  protected void serviceInit(Configuration conf) throws Exception {
+    if (!(conf instanceof TajoConf)) {
+      throw new IllegalArgumentException("Configuration must be a TajoConf instance");
+    }
+    this.tajoConf = (TajoConf)conf;
+    this.totalResource = createWorkerResource(tajoConf);
+    this.availableResource = NodeResources.clone(totalResource);
+    this.dispatcher.register(NodeResourceManagerEvent.EventType.class, this);
+    this.allocatedSize = new AtomicInteger();
+    super.serviceInit(conf);
+    LOG.info("Initialized NodeResourceManager for " + totalResource);
+  }
+
+  @Override
+  public void handle(NodeResourceManagerEvent event) {
+
+    if (event instanceof NodeResourceAllocateEvent) {
+      NodeResourceAllocateEvent allocateEvent = (NodeResourceAllocateEvent) event;
+      BatchAllocationResponseProto.Builder response = BatchAllocationResponseProto.newBuilder();
+      for (TaskAllocationRequestProto request : allocateEvent.getRequest().getTaskRequestList()) {
+        NodeResource resource = new NodeResource(request.getResource());
+        if (allocate(resource)) {
+          allocatedSize.incrementAndGet();
+          //TODO send task event to taskExecutor
+        } else {
+          response.addCancellationTask(request);
+        }
+      }
+      allocateEvent.getCallback().run(response.build());
+
+    } else if (event instanceof NodeResourceDeallocateEvent) {
+      allocatedSize.decrementAndGet();
+      NodeResourceDeallocateEvent deallocateEvent = (NodeResourceDeallocateEvent) event;
+      release(deallocateEvent.getResource());
+
+      // send current resource to ResourceTracker
+      getDispatcher().getEventHandler().handle(
+          new NodeStatusEvent(NodeStatusEvent.EventType.REPORT_RESOURCE, getAvailableResource()));
+    }
+  }
+
+  protected Dispatcher getDispatcher() {
+    return dispatcher;
+  }
+
+  protected NodeResource getTotalResource() {
+    return totalResource;
+  }
+
+  protected NodeResource getAvailableResource() {
+    return availableResource;
+  }
+
+  public int getAllocatedSize() {
+    return allocatedSize.get();
+  }
+
+  private boolean allocate(NodeResource resource) {
+    //TODO consider the jvm free memory
+    if (NodeResources.fitsIn(resource, availableResource)) {
+      NodeResources.subtractFrom(availableResource, resource);
+      return true;
+    }
+    return false;
+  }
+
+  private void release(NodeResource resource) {
+    NodeResources.addTo(availableResource, resource);
+  }
+
+  private NodeResource createWorkerResource(TajoConf conf) {
+    int memoryMb;
+
+    if (conf.get(CommonTestingUtil.TAJO_TEST_KEY, "FALSE").equalsIgnoreCase("TRUE")) {
+      memoryMb = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_MEMORY_MB);
+    } else {
+      memoryMb = Math.min((int) (Runtime.getRuntime().maxMemory() / StorageUnit.MB),
+          conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_MEMORY_MB));
+    }
+
+    int vCores = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_CPU_CORES);
+    int disks = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_DISKS_NUM);
+
+    int dataNodeStorageSize = DiskUtil.getDataNodeStorageSize();
+    if (conf.getBoolVar(TajoConf.ConfVars.WORKER_RESOURCE_DFS_DIR_AWARE) && dataNodeStorageSize > 0) {
+      disks = dataNodeStorageSize;
+    }
+
+    int diskParallels = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_DISK_PARALLEL_NUM);
+    return NodeResource.createResource(memoryMb, disks * diskParallels, vCores);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/NodeStatusUpdater.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/NodeStatusUpdater.java b/tajo-core/src/main/java/org/apache/tajo/worker/NodeStatusUpdater.java
new file mode 100644
index 0000000..84ac419
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/NodeStatusUpdater.java
@@ -0,0 +1,274 @@
+/**
+ * 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.worker;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Queues;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.AbstractService;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.ipc.TajoResourceTrackerProtocol;
+import org.apache.tajo.master.cluster.WorkerConnectionInfo;
+import org.apache.tajo.resource.NodeResource;
+import org.apache.tajo.rpc.*;
+import org.apache.tajo.service.ServiceTracker;
+import org.apache.tajo.service.ServiceTrackerFactory;
+import org.apache.tajo.worker.event.NodeStatusEvent;
+
+import java.net.ConnectException;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+
+import static org.apache.tajo.ipc.TajoResourceTrackerProtocol.*;
+
+/**
+ * It periodically sends heartbeat to {@link org.apache.tajo.master.rm.TajoResourceTracker} via asynchronous rpc.
+ */
+public class NodeStatusUpdater extends AbstractService implements EventHandler<NodeStatusEvent> {
+
+  private final static Log LOG = LogFactory.getLog(NodeStatusUpdater.class);
+
+  private TajoConf tajoConf;
+  private StatusUpdaterThread updaterThread;
+  private volatile boolean isStopped;
+  private volatile long heartBeatInterval;
+  private BlockingQueue<NodeStatusEvent> heartBeatRequestQueue;
+  private final WorkerConnectionInfo connectionInfo;
+  private final NodeResourceManager nodeResourceManager;
+  private AsyncRpcClient rmClient;
+  private ServiceTracker serviceTracker;
+  private TajoResourceTrackerProtocolService.Interface resourceTracker;
+  private int queueingLimit;
+
+  public NodeStatusUpdater(WorkerConnectionInfo connectionInfo, NodeResourceManager resourceManager) {
+    super(NodeStatusUpdater.class.getSimpleName());
+    this.connectionInfo = connectionInfo;
+    this.nodeResourceManager = resourceManager;
+  }
+
+  @Override
+  public void serviceInit(Configuration conf) throws Exception {
+    if (!(conf instanceof TajoConf)) {
+      throw new IllegalArgumentException("Configuration must be a TajoConf instance");
+    }
+    this.tajoConf = (TajoConf) conf;
+    this.heartBeatRequestQueue = Queues.newLinkedBlockingQueue();
+    this.serviceTracker = ServiceTrackerFactory.get(tajoConf);
+    this.nodeResourceManager.getDispatcher().register(NodeStatusEvent.EventType.class, this);
+    this.heartBeatInterval = tajoConf.getIntVar(TajoConf.ConfVars.WORKER_HEARTBEAT_INTERVAL);
+    this.updaterThread = new StatusUpdaterThread();
+    super.serviceInit(conf);
+  }
+
+  @Override
+  public void serviceStart() throws Exception {
+    // if resource changed over than 50%, send reports
+    this.queueingLimit = nodeResourceManager.getTotalResource().getVirtualCores() / 2;
+
+    updaterThread.start();
+    super.serviceStart();
+    LOG.info("NodeStatusUpdater started.");
+  }
+
+  @Override
+  public void serviceStop() throws Exception {
+    this.isStopped = true;
+
+    synchronized (updaterThread) {
+      updaterThread.notifyAll();
+    }
+    super.serviceStop();
+    LOG.info("NodeStatusUpdater stopped.");
+  }
+
+  @Override
+  public void handle(NodeStatusEvent event) {
+    switch (event.getType()) {
+      case REPORT_RESOURCE:
+        heartBeatRequestQueue.add(event); //batch report to ResourceTracker
+        break;
+      case FLUSH_REPORTS:
+        heartBeatRequestQueue.add(event); //flush report to ResourceTracker
+        break;
+    }
+  }
+
+  public int getQueueSize() {
+    return heartBeatRequestQueue.size();
+  }
+
+  public int getQueueingLimit() {
+    return queueingLimit;
+  }
+
+  private NodeHeartbeatRequestProto createResourceReport(NodeResource resource) {
+    NodeHeartbeatRequestProto.Builder requestProto = NodeHeartbeatRequestProto.newBuilder();
+    requestProto.setAvailableResource(resource.getProto());
+    requestProto.setWorkerId(connectionInfo.getId());
+    return requestProto.build();
+  }
+
+  private NodeHeartbeatRequestProto createHeartBeatReport() {
+    NodeHeartbeatRequestProto.Builder requestProto = NodeHeartbeatRequestProto.newBuilder();
+    requestProto.setWorkerId(connectionInfo.getId());
+    return requestProto.build();
+  }
+
+  private NodeHeartbeatRequestProto createNodeStatusReport() {
+    NodeHeartbeatRequestProto.Builder requestProto = NodeHeartbeatRequestProto.newBuilder();
+    requestProto.setTotalResource(nodeResourceManager.getTotalResource().getProto());
+    requestProto.setAvailableResource(nodeResourceManager.getAvailableResource().getProto());
+    requestProto.setWorkerId(connectionInfo.getId());
+    requestProto.setConnectionInfo(connectionInfo.getProto());
+
+    //TODO set node status to requestProto.setStatus()
+    return requestProto.build();
+  }
+
+  protected TajoResourceTrackerProtocolService.Interface newStub()
+      throws NoSuchMethodException, ConnectException, ClassNotFoundException {
+    RpcClientManager.cleanup(rmClient);
+
+    RpcClientManager rpcManager = RpcClientManager.getInstance();
+    rmClient = rpcManager.newClient(serviceTracker.getResourceTrackerAddress(),
+        TajoResourceTrackerProtocol.class, true, rpcManager.getRetries(),
+        rpcManager.getTimeoutSeconds(), TimeUnit.SECONDS, false);
+    return rmClient.getStub();
+  }
+
+  protected NodeHeartbeatResponseProto sendHeartbeat(NodeHeartbeatRequestProto requestProto)
+      throws NoSuchMethodException, ClassNotFoundException, ConnectException, ExecutionException {
+    if (resourceTracker == null) {
+      resourceTracker = newStub();
+    }
+
+    NodeHeartbeatResponseProto response = null;
+    try {
+      CallFuture<NodeHeartbeatResponseProto> callBack = new CallFuture<NodeHeartbeatResponseProto>();
+
+      resourceTracker.nodeHeartbeat(callBack.getController(), requestProto, callBack);
+      response = callBack.get(RpcConstants.DEFAULT_FUTURE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+    } catch (InterruptedException e) {
+      LOG.warn(e.getMessage());
+    } catch (TimeoutException te) {
+      LOG.warn("Heartbeat response is being delayed.", te);
+    } catch (ExecutionException ee) {
+      LOG.warn("TajoMaster failure: " + ee.getMessage());
+      resourceTracker = null;
+      throw ee;
+    }
+    return response;
+  }
+
+  class StatusUpdaterThread extends Thread {
+
+    public StatusUpdaterThread() {
+      super("NodeStatusUpdater");
+    }
+
+    private int drain(Collection<NodeStatusEvent> buffer, int numElements,
+                          long timeout, TimeUnit unit) throws InterruptedException {
+
+      long deadline = System.nanoTime() + unit.toNanos(timeout);
+      int added = 0;
+      while (added < numElements) {
+        added += heartBeatRequestQueue.drainTo(buffer, numElements - added);
+        if (added < numElements) { // not enough elements immediately available; will have to wait
+          NodeStatusEvent e = heartBeatRequestQueue.poll(deadline - System.nanoTime(), TimeUnit.NANOSECONDS);
+          if (e == null) {
+            break; // we already waited enough, and there are no more elements in sight
+          }
+          buffer.add(e);
+          added++;
+
+          if (e.getType() == NodeStatusEvent.EventType.FLUSH_REPORTS) {
+            break;
+          }
+        }
+      }
+      return added;
+    }
+
+    /* Node sends a heartbeats with its resource and status periodically to master. */
+    @Override
+    public void run() {
+      NodeHeartbeatResponseProto lastResponse = null;
+      while (!isStopped && !Thread.interrupted()) {
+
+        try {
+          if (lastResponse != null) {
+            if (lastResponse.getCommand() == ResponseCommand.NORMAL) {
+              List<NodeStatusEvent> events = Lists.newArrayList();
+              try {
+                /* batch update to ResourceTracker */
+                drain(events, Math.max(queueingLimit, 1), heartBeatInterval, TimeUnit.MILLISECONDS);
+              } catch (InterruptedException e) {
+                break;
+              }
+
+              if (!events.isEmpty()) {
+                // send last available resource;
+                lastResponse = sendHeartbeat(createResourceReport(events.get(events.size() - 1).getResource()));
+              } else {
+                // send ping;
+                lastResponse = sendHeartbeat(createHeartBeatReport());
+              }
+
+            } else if (lastResponse.getCommand() == ResponseCommand.MEMBERSHIP) {
+              // Membership changed
+              lastResponse = sendHeartbeat(createNodeStatusReport());
+            } else if (lastResponse.getCommand() == ResponseCommand.ABORT_QUERY) {
+              //TODO abort failure queries
+            }
+          } else {
+            // Node registration on startup
+            lastResponse = sendHeartbeat(createNodeStatusReport());
+          }
+        } catch (NoSuchMethodException nsme) {
+          LOG.fatal(nsme.getMessage(), nsme);
+          Runtime.getRuntime().halt(1);
+        } catch (ClassNotFoundException cnfe) {
+          LOG.fatal(cnfe.getMessage(), cnfe);
+          Runtime.getRuntime().halt(1);
+        } catch (Exception e) {
+          LOG.error(e.getMessage(), e);
+          if (!isStopped) {
+            synchronized (updaterThread) {
+              try {
+                updaterThread.wait(heartBeatInterval);
+              } catch (InterruptedException ie) {
+                // Do Nothing
+              }
+            }
+          }
+        }
+      }
+
+      LOG.info("Heartbeat Thread stopped.");
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/WorkerHeartbeatService.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/WorkerHeartbeatService.java b/tajo-core/src/main/java/org/apache/tajo/worker/WorkerHeartbeatService.java
index bd70d59..050e2b5 100644
--- a/tajo-core/src/main/java/org/apache/tajo/worker/WorkerHeartbeatService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/WorkerHeartbeatService.java
@@ -47,6 +47,7 @@ import static org.apache.tajo.ipc.TajoResourceTrackerProtocol.NodeHeartbeat;
 /**
  * It periodically sends heartbeat to {@link org.apache.tajo.master.rm.TajoResourceTracker} via asynchronous rpc.
  */
+@Deprecated
 public class WorkerHeartbeatService extends AbstractService {
   /** class logger */
   private final static Log LOG = LogFactory.getLog(WorkerHeartbeatService.class);

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceAllocateEvent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceAllocateEvent.java b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceAllocateEvent.java
new file mode 100644
index 0000000..2f411e8
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceAllocateEvent.java
@@ -0,0 +1,46 @@
+/**
+ * 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.worker.event;
+
+
+import com.google.protobuf.RpcCallback;
+
+import static org.apache.tajo.ipc.TajoWorkerProtocol.BatchAllocationRequestProto;
+import static org.apache.tajo.ipc.TajoWorkerProtocol.BatchAllocationResponseProto;
+
+public class NodeResourceAllocateEvent extends NodeResourceManagerEvent {
+
+  private BatchAllocationRequestProto request;
+  private RpcCallback<BatchAllocationResponseProto> callback;
+
+  public NodeResourceAllocateEvent(BatchAllocationRequestProto request,
+                                   RpcCallback<BatchAllocationResponseProto> callback) {
+    super(EventType.ALLOCATE);
+    this.callback = callback;
+    this.request = request;
+  }
+
+  public BatchAllocationRequestProto getRequest() {
+    return request;
+  }
+
+  public RpcCallback<BatchAllocationResponseProto> getCallback() {
+    return callback;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceDeallocateEvent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceDeallocateEvent.java b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceDeallocateEvent.java
new file mode 100644
index 0000000..a298d77
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceDeallocateEvent.java
@@ -0,0 +1,40 @@
+/**
+ * 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.worker.event;
+
+import org.apache.tajo.TajoProtos;
+import org.apache.tajo.resource.NodeResource;
+
+public class NodeResourceDeallocateEvent extends NodeResourceManagerEvent {
+
+  private NodeResource resource;
+
+  public NodeResourceDeallocateEvent(TajoProtos.NodeResourceProto proto) {
+    this(new NodeResource(proto));
+  }
+
+  public NodeResourceDeallocateEvent(NodeResource resource) {
+    super(EventType.DEALLOCATE);
+    this.resource = resource;
+  }
+
+  public NodeResource getResource() {
+    return resource;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceManagerEvent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceManagerEvent.java b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceManagerEvent.java
new file mode 100644
index 0000000..bcb3448
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeResourceManagerEvent.java
@@ -0,0 +1,34 @@
+/**
+ * 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.worker.event;
+
+import org.apache.hadoop.yarn.event.AbstractEvent;
+import org.apache.tajo.ExecutionBlockId;
+import org.apache.tajo.resource.NodeResource;
+
+public class NodeResourceManagerEvent extends AbstractEvent<NodeResourceManagerEvent.EventType> {
+  public enum EventType {
+    ALLOCATE,
+    DEALLOCATE
+  }
+
+  public NodeResourceManagerEvent(EventType eventType) {
+    super(eventType);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeStatusEvent.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeStatusEvent.java b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeStatusEvent.java
new file mode 100644
index 0000000..58ab74a
--- /dev/null
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/event/NodeStatusEvent.java
@@ -0,0 +1,40 @@
+/**
+ * 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.worker.event;
+
+import org.apache.hadoop.yarn.event.AbstractEvent;
+import org.apache.tajo.resource.NodeResource;
+
+public class NodeStatusEvent extends AbstractEvent<NodeStatusEvent.EventType> {
+  private final NodeResource resource;
+
+  public enum EventType {
+    REPORT_RESOURCE,
+    FLUSH_REPORTS
+  }
+
+  public NodeStatusEvent(EventType eventType, NodeResource resource) {
+    super(eventType);
+    this.resource = resource;
+  }
+
+  public NodeResource getResource() {
+    return resource;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/proto/ResourceTrackerProtocol.proto
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/proto/ResourceTrackerProtocol.proto b/tajo-core/src/main/proto/ResourceTrackerProtocol.proto
index 40aeab7..dffd8c9 100644
--- a/tajo-core/src/main/proto/ResourceTrackerProtocol.proto
+++ b/tajo-core/src/main/proto/ResourceTrackerProtocol.proto
@@ -25,15 +25,42 @@ option java_generate_equals_and_hash = true;
 import "QueryCoordinatorProtocol.proto";
 import "ContainerProtocol.proto";
 import "tajo_protos.proto";
+import "TajoIdProtos.proto";
 
 package hadoop.yarn;
 
+// deprecated
 message NodeHeartbeat {
   required WorkerConnectionInfoProto connectionInfo = 1;
   optional ServerStatusProto serverStatus = 2;
   optional string statusMessage = 3;
 }
 
+message NodeHeartbeatRequestProto {
+  required int32 workerId = 1;
+  optional NodeResourceProto totalResource = 2;
+  optional NodeResourceProto availableResource = 3;
+  optional WorkerConnectionInfoProto connectionInfo = 4;
+  optional NodeStatusProto status = 5;
+}
+
+message NodeHeartbeatResponseProto {
+  required ResponseCommand command = 1 [default = NORMAL];
+  repeated QueryIdProto queryId = 2;
+}
+
+enum ResponseCommand {
+  NORMAL = 1; //ping
+  MEMBERSHIP = 2; // request membership to worker node
+  ABORT_QUERY = 3; //query master failure
+  SHUTDOWN = 4; // black list
+}
+
+//TODO add node health information
+message NodeStatusProto {
+}
+
 service TajoResourceTrackerProtocolService {
   rpc heartbeat(NodeHeartbeat) returns (TajoHeartbeatResponse);
+  rpc nodeHeartbeat(NodeHeartbeatRequestProto) returns (NodeHeartbeatResponseProto);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/main/proto/TajoWorkerProtocol.proto
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/proto/TajoWorkerProtocol.proto b/tajo-core/src/main/proto/TajoWorkerProtocol.proto
index bf9bbde..2324596 100644
--- a/tajo-core/src/main/proto/TajoWorkerProtocol.proto
+++ b/tajo-core/src/main/proto/TajoWorkerProtocol.proto
@@ -116,6 +116,7 @@ message ExecutionBlockReport {
     repeated IntermediateEntryProto intermediateEntries = 5;
 }
 
+// deprecated
 message TaskResponseProto {
     required string id = 1;
     required QueryState status = 2;
@@ -161,6 +162,7 @@ message QueryExecutionRequestProto {
     optional StringProto logicalPlanJson = 6;
 }
 
+// deprecated
 message GetTaskRequestProto {
     required int32 workerId = 1;
     required TajoContainerIdProto containerId = 2;
@@ -198,6 +200,20 @@ message ExecutionBlockListProto {
     repeated ExecutionBlockIdProto executionBlockId = 1;
 }
 
+message TaskAllocationRequestProto {
+    required TaskRequestProto taskRequest = 1;
+    required NodeResourceProto resource = 2;
+}
+
+message BatchAllocationRequestProto {
+    required ExecutionBlockIdProto executionBlockId = 1;
+    repeated TaskAllocationRequestProto taskRequest = 2;
+}
+
+message BatchAllocationResponseProto {
+    repeated TaskAllocationRequestProto cancellationTask = 2;
+}
+
 service TajoWorkerProtocolService {
   rpc ping (TaskAttemptIdProto) returns (BoolProto);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/test/java/org/apache/tajo/resource/TestResources.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/resource/TestResources.java b/tajo-core/src/test/java/org/apache/tajo/resource/TestResources.java
new file mode 100644
index 0000000..eb0d732
--- /dev/null
+++ b/tajo-core/src/test/java/org/apache/tajo/resource/TestResources.java
@@ -0,0 +1,48 @@
+/**
+ * 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.resource;
+
+import org.junit.Test;
+
+import static org.apache.tajo.resource.NodeResources.componentwiseMin;
+import static org.apache.tajo.resource.NodeResources.createResource;
+import static org.apache.tajo.resource.NodeResources.fitsIn;
+import static org.junit.Assert.*;
+
+public class TestResources {
+  @Test
+  public void testFitsIn() {
+    assertTrue(fitsIn(createResource(512, 1, 1), createResource(1024, 2, 1)));
+    assertTrue(fitsIn(createResource(1024, 2, 1), createResource(1024, 2, 1)));
+    assertFalse(fitsIn(createResource(1024, 2, 1), createResource(512, 1, 1)));
+    assertFalse(fitsIn(createResource(512, 2, 1), createResource(1024, 1, 1)));
+    assertFalse(fitsIn(createResource(1024, 1, 1), createResource(512, 2, 1)));
+    assertFalse(fitsIn(createResource(512, 1, 2), createResource(512, 1, 1)));
+  }
+
+  @Test
+  public void testComponentwiseMin() {
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(1, 1), createResource(2, 2)));
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(2, 2), createResource(1, 1)));
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(1, 2), createResource(2, 1)));
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/test/java/org/apache/tajo/worker/MockNodeStatusUpdater.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/worker/MockNodeStatusUpdater.java b/tajo-core/src/test/java/org/apache/tajo/worker/MockNodeStatusUpdater.java
new file mode 100644
index 0000000..2d7d0be
--- /dev/null
+++ b/tajo-core/src/test/java/org/apache/tajo/worker/MockNodeStatusUpdater.java
@@ -0,0 +1,105 @@
+/**
+ * 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.worker;
+
+import com.google.common.collect.Maps;
+import com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcController;
+import org.apache.tajo.ipc.QueryCoordinatorProtocol;
+import org.apache.tajo.master.cluster.WorkerConnectionInfo;
+import org.apache.tajo.resource.NodeResource;
+import org.apache.tajo.resource.NodeResources;
+
+import java.net.ConnectException;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+
+import static org.apache.tajo.ipc.TajoResourceTrackerProtocol.*;
+
+public class MockNodeStatusUpdater extends NodeStatusUpdater {
+
+  private CountDownLatch barrier;
+  private Map<Integer, NodeResource> membership = Maps.newHashMap();
+  private Map<Integer, NodeResource> resources = Maps.newHashMap();
+  private MockResourceTracker resourceTracker;
+
+  public MockNodeStatusUpdater(CountDownLatch barrier, WorkerConnectionInfo connectionInfo,
+                               NodeResourceManager resourceManager) {
+    super(connectionInfo, resourceManager);
+    this.barrier = barrier;
+    this.resourceTracker = new MockResourceTracker();
+  }
+
+  @Override
+  protected TajoResourceTrackerProtocolService.Interface newStub()
+      throws NoSuchMethodException, ConnectException, ClassNotFoundException {
+
+    return resourceTracker;
+  }
+
+  protected MockResourceTracker getResourceTracker() {
+    return resourceTracker;
+  }
+
+  class MockResourceTracker implements TajoResourceTrackerProtocolService.Interface {
+    private NodeHeartbeatRequestProto lastRequest;
+
+    protected Map<Integer, NodeResource> getTotalResource() {
+      return membership;
+    }
+
+    protected Map<Integer, NodeResource> getAvailableResource() {
+      return membership;
+    }
+
+    protected NodeHeartbeatRequestProto getLastRequest() {
+      return lastRequest;
+    }
+
+    @Override
+    public void heartbeat(RpcController controller, NodeHeartbeat request,
+                          RpcCallback<QueryCoordinatorProtocol.TajoHeartbeatResponse> done) {
+
+    }
+
+    @Override
+    public void nodeHeartbeat(RpcController controller, NodeHeartbeatRequestProto request,
+                              RpcCallback<NodeHeartbeatResponseProto> done) {
+
+      NodeHeartbeatResponseProto.Builder response = NodeHeartbeatResponseProto.newBuilder();
+      if (membership.containsKey(request.getWorkerId())) {
+        if (request.hasAvailableResource()) {
+          NodeResource resource = resources.get(request.getWorkerId());
+          NodeResources.update(resource, new NodeResource(request.getAvailableResource()));
+        }
+        done.run(response.setCommand(ResponseCommand.NORMAL).build());
+      } else {
+        if (request.hasConnectionInfo()) {
+          membership.put(request.getWorkerId(), new NodeResource(request.getTotalResource()));
+          resources.put(request.getWorkerId(), new NodeResource(request.getAvailableResource()));
+          done.run(response.setCommand(ResponseCommand.NORMAL).build());
+        } else {
+          done.run(response.setCommand(ResponseCommand.MEMBERSHIP).build());
+        }
+      }
+      lastRequest = request;
+      barrier.countDown();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeResourceManager.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeResourceManager.java b/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeResourceManager.java
new file mode 100644
index 0000000..7407acc
--- /dev/null
+++ b/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeResourceManager.java
@@ -0,0 +1,235 @@
+/**
+ * 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.worker;
+
+import com.google.common.collect.Lists;
+import org.apache.hadoop.yarn.event.AsyncDispatcher;
+import org.apache.tajo.*;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.ipc.TajoWorkerProtocol;
+import org.apache.tajo.master.cluster.WorkerConnectionInfo;
+import org.apache.tajo.plan.serder.PlanProto;
+import org.apache.tajo.resource.NodeResources;
+import org.apache.tajo.rpc.CallFuture;
+import org.apache.tajo.util.CommonTestingUtil;
+import org.apache.tajo.worker.event.NodeResourceAllocateEvent;
+import org.apache.tajo.worker.event.NodeResourceDeallocateEvent;
+import org.junit.*;
+
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.junit.Assert.*;
+
+import static org.apache.tajo.ipc.TajoWorkerProtocol.*;
+public class TestNodeResourceManager {
+
+  private NodeResourceManager resourceManager;
+  private MockNodeStatusUpdater statusUpdater;
+  private AsyncDispatcher dispatcher;
+  private int taskMemory;
+  private TajoConf conf;
+
+  @Before
+  public void setup() {
+    conf = new TajoConf();
+    conf.set(CommonTestingUtil.TAJO_TEST_KEY, CommonTestingUtil.TAJO_TEST_TRUE);
+
+    taskMemory = 512;
+    conf.setIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_CPU_CORES, 4);
+    conf.setIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_MEMORY_MB,
+        taskMemory * conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_CPU_CORES));
+    conf.setIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_DISKS_NUM, 4);
+    conf.setIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_DISK_PARALLEL_NUM, 1);
+
+    dispatcher = new AsyncDispatcher();
+    dispatcher.init(conf);
+    dispatcher.start();
+
+    resourceManager = new NodeResourceManager(dispatcher);
+    resourceManager.init(conf);
+    resourceManager.start();
+
+    WorkerConnectionInfo worker = new WorkerConnectionInfo("host", 28091, 28092, 21000, 28093, 28080);
+    statusUpdater = new MockNodeStatusUpdater(new CountDownLatch(0), worker, resourceManager);
+    statusUpdater.init(conf);
+    statusUpdater.start();
+  }
+
+  @After
+  public void tearDown() {
+    resourceManager.stop();
+    statusUpdater.stop();
+    dispatcher.stop();
+  }
+
+  @Test
+  public void testNodeResourceAllocateEvent() throws Exception {
+    int requestSize = 4;
+
+    CallFuture<BatchAllocationResponseProto> callFuture  = new CallFuture<BatchAllocationResponseProto>();
+    BatchAllocationRequestProto.Builder requestProto = BatchAllocationRequestProto.newBuilder();
+    ExecutionBlockId ebId = new ExecutionBlockId(LocalTajoTestingUtility.newQueryId(), 0);
+    requestProto.setExecutionBlockId(ebId.getProto());
+
+    assertEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+    requestProto.addAllTaskRequest(createTaskRequests(taskMemory, requestSize));
+
+    dispatcher.getEventHandler().handle(new NodeResourceAllocateEvent(requestProto.build(), callFuture));
+
+    BatchAllocationResponseProto responseProto = callFuture.get();
+    assertNotEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+    assertEquals(0, responseProto.getCancellationTaskCount());
+    assertEquals(requestSize, resourceManager.getAllocatedSize());
+  }
+
+
+  @Test
+  public void testNodeResourceCancellation() throws Exception {
+    int requestSize = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_CPU_CORES);
+    int overSize = 10;
+
+    CallFuture<BatchAllocationResponseProto> callFuture = new CallFuture<BatchAllocationResponseProto>();
+    BatchAllocationRequestProto.Builder requestProto = BatchAllocationRequestProto.newBuilder();
+    ExecutionBlockId ebId = new ExecutionBlockId(LocalTajoTestingUtility.newQueryId(), 0);
+    requestProto.setExecutionBlockId(ebId.getProto());
+
+    assertEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+    requestProto.addAllTaskRequest(createTaskRequests(taskMemory, requestSize + overSize));
+
+    dispatcher.getEventHandler().handle(new NodeResourceAllocateEvent(requestProto.build(), callFuture));
+    BatchAllocationResponseProto responseProto = callFuture.get();
+
+    assertEquals(overSize, responseProto.getCancellationTaskCount());
+    assertEquals(requestSize, resourceManager.getAllocatedSize());
+  }
+
+  @Test
+  public void testNodeResourceDeallocateEvent() throws Exception {
+    int requestSize = 4;
+
+    CallFuture<BatchAllocationResponseProto> callFuture  = new CallFuture<BatchAllocationResponseProto>();
+    BatchAllocationRequestProto.Builder requestProto = BatchAllocationRequestProto.newBuilder();
+    ExecutionBlockId ebId = new ExecutionBlockId(LocalTajoTestingUtility.newQueryId(), 0);
+    requestProto.setExecutionBlockId(ebId.getProto());
+
+    assertEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+    requestProto.addAllTaskRequest(createTaskRequests(taskMemory, requestSize));
+
+    dispatcher.getEventHandler().handle(new NodeResourceAllocateEvent(requestProto.build(), callFuture));
+
+    BatchAllocationResponseProto responseProto = callFuture.get();
+    assertNotEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+    assertEquals(0, responseProto.getCancellationTaskCount());
+    assertEquals(requestSize, resourceManager.getAllocatedSize());
+
+    //deallocate
+    for(TaskAllocationRequestProto allocationRequestProto : requestProto.getTaskRequestList()) {
+      // direct invoke handler for testing
+      resourceManager.handle(new NodeResourceDeallocateEvent(allocationRequestProto.getResource()));
+    }
+    assertEquals(0, resourceManager.getAllocatedSize());
+    assertEquals(resourceManager.getTotalResource(), resourceManager.getAvailableResource());
+  }
+
+  @Test(timeout = 30000)
+  public void testParallelRequest() throws Exception {
+    final int parallelCount = conf.getIntVar(TajoConf.ConfVars.WORKER_RESOURCE_AVAILABLE_CPU_CORES) * 2;
+    final int taskSize = 100000;
+    final AtomicInteger totalComplete = new AtomicInteger();
+    final AtomicInteger totalCanceled = new AtomicInteger();
+
+    final ExecutionBlockId ebId = new ExecutionBlockId(LocalTajoTestingUtility.newQueryId(), 0);
+    final Queue<TaskAllocationRequestProto> totalTasks = createTaskRequests(taskMemory, taskSize);
+
+    ExecutorService executor = Executors.newFixedThreadPool(parallelCount);
+    List<Future> futureList = Lists.newArrayList();
+
+    long startTime = System.currentTimeMillis();
+    for (int i = 0; i < parallelCount; i++) {
+      futureList.add(executor.submit(new Runnable() {
+            @Override
+            public void run() {
+              int complete = 0;
+              while (true) {
+                TaskAllocationRequestProto task = totalTasks.poll();
+                if (task == null) break;
+
+
+                BatchAllocationRequestProto.Builder requestProto = BatchAllocationRequestProto.newBuilder();
+                requestProto.addTaskRequest(task);
+                requestProto.setExecutionBlockId(ebId.getProto());
+
+                CallFuture<BatchAllocationResponseProto> callFuture = new CallFuture<BatchAllocationResponseProto>();
+                dispatcher.getEventHandler().handle(new NodeResourceAllocateEvent(requestProto.build(), callFuture));
+                try {
+                  BatchAllocationResponseProto proto = callFuture.get();
+                  if (proto.getCancellationTaskCount() > 0) {
+                    totalTasks.addAll(proto.getCancellationTaskList());
+                    totalCanceled.addAndGet(proto.getCancellationTaskCount());
+                  } else {
+                    complete++;
+                    dispatcher.getEventHandler().handle(new NodeResourceDeallocateEvent(task.getResource()));
+                  }
+                } catch (Exception e) {
+                  fail(e.getMessage());
+                }
+              }
+              System.out.println(Thread.currentThread().getName() + " complete requests: " + complete);
+              totalComplete.addAndGet(complete);
+            }
+          })
+      );
+    }
+
+    for (Future future : futureList) {
+      future.get();
+    }
+
+    System.out.println(parallelCount + " Thread, completed requests: " + totalComplete.get() + ", canceled requests:"
+        + totalCanceled.get() + ", " + +(System.currentTimeMillis() - startTime) + " ms elapsed");
+    executor.shutdown();
+    assertEquals(taskSize, totalComplete.get());
+  }
+
+  protected static Queue<TaskAllocationRequestProto> createTaskRequests(int memory, int size) {
+    Queue<TaskAllocationRequestProto> requestProtoList = new LinkedBlockingQueue<TaskAllocationRequestProto>();
+    for (int i = 0; i < size; i++) {
+
+      ExecutionBlockId nullStage = QueryIdFactory.newExecutionBlockId(QueryIdFactory.NULL_QUERY_ID, 0);
+      TaskAttemptId taskAttemptId = QueryIdFactory.newTaskAttemptId(QueryIdFactory.newTaskId(nullStage, i), 0);
+
+      TajoWorkerProtocol.TaskRequestProto.Builder builder =
+          TajoWorkerProtocol.TaskRequestProto.newBuilder();
+      builder.setId(taskAttemptId.getProto());
+      builder.setShouldDie(true);
+      builder.setOutputTable("");
+      builder.setPlan(PlanProto.LogicalNodeTree.newBuilder());
+      builder.setClusteredOutput(false);
+
+
+      requestProtoList.add(TaskAllocationRequestProto.newBuilder()
+          .setResource(NodeResources.createResource(memory).getProto())
+          .setTaskRequest(builder.build()).build());
+    }
+    return requestProtoList;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeStatusUpdater.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeStatusUpdater.java b/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeStatusUpdater.java
new file mode 100644
index 0000000..fb3c77e
--- /dev/null
+++ b/tajo-core/src/test/java/org/apache/tajo/worker/TestNodeStatusUpdater.java
@@ -0,0 +1,115 @@
+/**
+ * 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.worker;
+
+import org.apache.hadoop.yarn.event.AsyncDispatcher;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.ipc.TajoResourceTrackerProtocol;
+import org.apache.tajo.master.cluster.WorkerConnectionInfo;
+import org.apache.tajo.util.CommonTestingUtil;
+import org.apache.tajo.worker.event.NodeStatusEvent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.CountDownLatch;
+import static org.junit.Assert.*;
+
+public class TestNodeStatusUpdater {
+
+  private NodeResourceManager resourceManager;
+  private MockNodeStatusUpdater statusUpdater;
+  private AsyncDispatcher dispatcher;
+  private TajoConf conf;
+
+  @Before
+  public void setup() {
+    conf = new TajoConf();
+    conf.set(CommonTestingUtil.TAJO_TEST_KEY, CommonTestingUtil.TAJO_TEST_TRUE);
+
+    conf.setIntVar(TajoConf.ConfVars.WORKER_HEARTBEAT_INTERVAL, 1000);
+    dispatcher = new AsyncDispatcher();
+    dispatcher.init(conf);
+    dispatcher.start();
+
+    resourceManager = new NodeResourceManager(dispatcher);
+    resourceManager.init(conf);
+    resourceManager.start();
+  }
+
+  @After
+  public void tearDown() {
+    resourceManager.stop();
+    if (statusUpdater != null) statusUpdater.stop();
+    dispatcher.stop();
+  }
+
+  @Test(timeout = 20000)
+  public void testNodeMembership() throws Exception {
+    CountDownLatch barrier = new CountDownLatch(1);
+    WorkerConnectionInfo worker = new WorkerConnectionInfo("host", 28091, 28092, 21000, 28093, 28080);
+    statusUpdater = new MockNodeStatusUpdater(barrier, worker, resourceManager);
+    statusUpdater.init(conf);
+    statusUpdater.start();
+
+    MockNodeStatusUpdater.MockResourceTracker resourceTracker = statusUpdater.getResourceTracker();
+    barrier.await();
+
+    assertTrue(resourceTracker.getTotalResource().containsKey(worker.getId()));
+    assertEquals(resourceManager.getTotalResource(),
+        resourceTracker.getTotalResource().get(worker.getId()));
+
+    assertEquals(resourceManager.getAvailableResource(),
+        resourceTracker.getAvailableResource().get(worker.getId()));
+  }
+
+  @Test(timeout = 20000)
+  public void testPing() throws Exception {
+    CountDownLatch barrier = new CountDownLatch(2);
+    WorkerConnectionInfo worker = new WorkerConnectionInfo("host", 28091, 28092, 21000, 28093, 28080);
+    statusUpdater = new MockNodeStatusUpdater(barrier, worker, resourceManager);
+    statusUpdater.init(conf);
+    statusUpdater.start();
+
+    MockNodeStatusUpdater.MockResourceTracker resourceTracker = statusUpdater.getResourceTracker();
+    barrier.await();
+
+    TajoResourceTrackerProtocol.NodeHeartbeatRequestProto lastRequest = resourceTracker.getLastRequest();
+    assertTrue(lastRequest.hasWorkerId());
+    assertFalse(lastRequest.hasAvailableResource());
+    assertFalse(lastRequest.hasTotalResource());
+    assertFalse(lastRequest.hasConnectionInfo());
+  }
+
+  @Test(timeout = 20000)
+  public void testResourceReport() throws Exception {
+    CountDownLatch barrier = new CountDownLatch(2);
+    WorkerConnectionInfo worker = new WorkerConnectionInfo("host", 28091, 28092, 21000, 28093, 28080);
+    statusUpdater = new MockNodeStatusUpdater(barrier, worker, resourceManager);
+    statusUpdater.init(conf);
+    statusUpdater.start();
+
+    for (int i = 0; i < statusUpdater.getQueueingLimit(); i++) {
+      dispatcher.getEventHandler().handle(new NodeStatusEvent(NodeStatusEvent.EventType.REPORT_RESOURCE,
+          resourceManager.getAvailableResource()));
+    }
+    barrier.await();
+    assertEquals(0, statusUpdater.getQueueSize());
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/25bd5cb4/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/DiskUtil.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/DiskUtil.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/DiskUtil.java
index 0bcd5ec..19e08e8 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/DiskUtil.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/DiskUtil.java
@@ -189,10 +189,10 @@ public class DiskUtil {
 	}
 
   public static int getDataNodeStorageSize(){
-    return getStorageDirs().size();
+    return getDataNodeStorageDirs().size();
   }
 
-  public static List<URI> getStorageDirs(){
+  public static List<URI> getDataNodeStorageDirs(){
     Configuration conf = new HdfsConfiguration();
     Collection<String> dirNames = conf.getTrimmedStringCollection(DFS_DATANODE_DATA_DIR_KEY);
     return Util.stringCollectionAsURIs(dirNames);


[15/24] tajo git commit: TAJO-1553: Improve broadcast join planning. (jihoon)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan
index 1bf0332..724e240 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan
@@ -31,8 +31,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan
index 1bf0332..724e240 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan
@@ -31,8 +31,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan
index 1bf0332..724e240 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan
@@ -31,8 +31,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan
index 1bf0332..724e240 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan
@@ -31,8 +31,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
 JOIN(5)(CROSS)
   => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan
index 5b81a05..35e397b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc)
    JOIN(6)(CROSS)
      => target list: ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
      => in schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan
index 5b81a05..35e397b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc)
    JOIN(6)(CROSS)
      => target list: ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
      => in schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan
index c083fa1..af6c200 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
      => in schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan
index c083fa1..af6c200 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
      => in schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan
index 98f058c..b76c6e2 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan
@@ -39,9 +39,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.customer
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan
index 98f058c..b76c6e2 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan
@@ -39,9 +39,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.customer
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan
index 455b6d2..b4d8565 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan
index 455b6d2..b4d8565 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan
index 8ad610e..d1c32a0 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.customer.c_name (TEXT), default.region.r_regionkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.customer.c_name (TEXT) (asc),default.region.r_regionkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.customer.c_name (TEXT) (asc),default.region.r_regionkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan
index 8ad610e..d1c32a0 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.customer.c_name (TEXT), default.region.r_regionkey (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.customer.c_name (TEXT) (asc),default.region.r_regionkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.customer.c_name (TEXT) (asc),default.region.r_regionkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
      => in schema: {(11) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan
index 5cf2a69..4997c1d 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
      => in schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan
index 5cf2a69..4997c1d 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan
@@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.customer.c_custkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.customer
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(8)
+SORT(10)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
    JOIN(6)(CROSS)
      => target list: ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)
@@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(2)
   => Sort Keys: len (INT4) (asc),default.region.r_regionkey (INT4) (asc),default.region.r_name (TEXT) (asc),default.customer.c_custkey (INT4) (asc)
-   SCAN(9) on eb_0000000000000_0000_000003
+   SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
      => in schema: {(13) ?multiply (INT4), default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4), len (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan
index d83cdb8..a684a0c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan
index d83cdb8..a684a0c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan
index f39025c..e3cbb61 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan
@@ -38,7 +38,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.b
 
 PROJECTION(3)
   => Targets: a_name (TEXT), b_name (TEXT)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan
index f39025c..e3cbb61 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan
@@ -38,7 +38,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.b
 
 PROJECTION(3)
   => Targets: a_name (TEXT), b_name (TEXT)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Hash.plan
index 2478dda..69ede30 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Hash.plan
@@ -33,7 +33,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.t4
- 1: type=Broadcast, tables=default.t3
 
 JOIN(5)(INNER)
   => Join Cond: default.t3.id (INT8) = ?int8_1 (INT8)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Sort.plan
index 2478dda..69ede30 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testDifferentTypesJoinCondition.Sort.plan
@@ -33,7 +33,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.t4
- 1: type=Broadcast, tables=default.t3
 
 JOIN(5)(INNER)
   => Join Cond: default.t3.id (INT8) = ?int8_1 (INT8)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Hash.plan
index c083fa1..af6c200 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
      => in schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Sort.plan
index c083fa1..af6c200 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinAndCaseWhen.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
      => in schema: {(3) cond (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Hash.plan
index d83cdb8..a684a0c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Sort.plan
index d83cdb8..a684a0c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithEmptyTable.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.empty_orders
- 1: type=Broadcast, tables=default.customer
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.customer.c_custkey (INT4) = default.empty_orders.o_orderkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.customer.c_custkey (INT4) (asc),default.empty_orders.o_orderkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
      => in schema: {(2) default.customer.c_custkey (INT4), default.empty_orders.o_orderkey (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Hash.plan
index accf06e..469668c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Hash.plan
@@ -34,8 +34,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.a
+ 0: type=Broadcast, tables=default.a
 
 SELECTION(3)
   => Search Cond: default.a.r_name (TEXT) <= default.b.r_name (TEXT)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Sort.plan
index accf06e..469668c 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.Sort.plan
@@ -34,8 +34,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 =======================================================
 
 [Enforcers]
- 0: type=Broadcast, tables=default.b
- 1: type=Broadcast, tables=default.a
+ 0: type=Broadcast, tables=default.a
 
 SELECTION(3)
   => Search Cond: default.a.r_name (TEXT) <= default.b.r_name (TEXT)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Hash.plan
index 0ce7b52..244bfa9 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Hash.plan
@@ -33,7 +33,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.b
 
 JOIN(5)(INNER)
   => Join Cond: default.b.n_nationkey (INT4) = default.a.c_nationkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Sort.plan
index 0ce7b52..244bfa9 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinAsterisk.Sort.plan
@@ -33,7 +33,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
 
 [Enforcers]
  0: type=Broadcast, tables=default.a
- 1: type=Broadcast, tables=default.b
 
 JOIN(5)(INNER)
   => Join Cond: default.b.n_nationkey (INT4) = default.a.c_nationkey (INT4)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Hash.plan
index a5ba593..d5e2b9b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Hash.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus (INT4)}
      => in schema: {(3) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Sort.plan
index a5ba593..d5e2b9b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvals1.Sort.plan
@@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 
 [Enforcers]
  0: type=Broadcast, tables=default.region
- 1: type=Broadcast, tables=default.nation
 
-SORT(9)
+SORT(11)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
 
 SORT(3)
   => Sort Keys: default.region.r_regionkey (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-   SCAN(10) on eb_0000000000000_0000_000003
+   SCAN(12) on eb_0000000000000_0000_000003
      => out schema: {(3) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus (INT4)}
      => in schema: {(3) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Hash.plan
index 32fd54c..a8f9f8b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Hash.plan
@@ -44,10 +44,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_regionkey (INT4), v1 (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(9)
+SORT(11)
   => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -80,7 +79,7 @@ PROJECTION(4)
   => in  schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
    SORT(3)
      => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
         => in schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Sort.plan
index 32fd54c..a8f9f8b 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs1.Sort.plan
@@ -44,10 +44,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_regionkey (INT4), v1 (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-SORT(9)
+SORT(11)
   => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    JOIN(7)(INNER)
      => Join Cond: default.region.r_regionkey (INT4) = default.nation.n_regionkey (INT4)
@@ -80,7 +79,7 @@ PROJECTION(4)
   => in  schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
    SORT(3)
      => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-      SCAN(10) on eb_0000000000000_0000_000003
+      SCAN(12) on eb_0000000000000_0000_000003
         => out schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
         => in schema: {(5) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), v1 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Hash.plan
index 5961cfe..d6252ea 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Hash.plan
@@ -51,10 +51,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=?plus (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), result (INT4), v1 (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-GROUP_BY(10)(?plus,n_regionkey,r_regionkey,result,v1)
+GROUP_BY(12)(?plus,n_regionkey,r_regionkey,result,v1)
   => exprs: (sum(?plus (INT4)))
   => target list: v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)
   => out schema:{(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
@@ -84,14 +83,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.nation.n_regionkey (INT4), v1 (INT4), num=32)
 
-SORT(12)
+SORT(14)
   => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    GROUP_BY(3)(v1,n_regionkey,r_regionkey,?plus,result)
      => exprs: (sum(?sum_3 (INT8)))
      => target list: v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4) as plus1, result (INT4), total (INT8)
      => out schema:{(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
      => in schema:{(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
-      SCAN(11) on eb_0000000000000_0000_000003
+      SCAN(13) on eb_0000000000000_0000_000003
         => out schema: {(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
         => in schema: {(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
 
@@ -111,7 +110,7 @@ PROJECTION(5)
   => in  schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
    SORT(4)
      => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-      SCAN(13) on eb_0000000000000_0000_000004
+      SCAN(15) on eb_0000000000000_0000_000004
         => out schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
         => in schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Sort.plan
index 5961cfe..d6252ea 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Sort.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinCoReferredEvalsWithSameExprs2.Sort.plan
@@ -51,10 +51,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF]
 [q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=?plus (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), result (INT4), v1 (INT4), num=32)
 
 [Enforcers]
- 0: type=Broadcast, tables=default.nation
- 1: type=Broadcast, tables=default.region
+ 0: type=Broadcast, tables=default.region
 
-GROUP_BY(10)(?plus,n_regionkey,r_regionkey,result,v1)
+GROUP_BY(12)(?plus,n_regionkey,r_regionkey,result,v1)
   => exprs: (sum(?plus (INT4)))
   => target list: v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)
   => out schema:{(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
@@ -84,14 +83,14 @@ Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE]
 [Outgoing]
 [q_0000000000000_0000] 4 => 5 (type=RANGE_SHUFFLE, key=default.nation.n_regionkey (INT4), v1 (INT4), num=32)
 
-SORT(12)
+SORT(14)
   => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
    GROUP_BY(3)(v1,n_regionkey,r_regionkey,?plus,result)
      => exprs: (sum(?sum_3 (INT8)))
      => target list: v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4) as plus1, result (INT4), total (INT8)
      => out schema:{(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
      => in schema:{(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
-      SCAN(11) on eb_0000000000000_0000_000003
+      SCAN(13) on eb_0000000000000_0000_000003
         => out schema: {(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
         => in schema: {(6) v1 (INT4), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), ?plus (INT4), result (INT4), ?sum_3 (INT8)}
 
@@ -111,7 +110,7 @@ PROJECTION(5)
   => in  schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
    SORT(4)
      => Sort Keys: v1 (INT4) (asc),default.nation.n_regionkey (INT4) (asc)
-      SCAN(13) on eb_0000000000000_0000_000004
+      SCAN(15) on eb_0000000000000_0000_000004
         => out schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
         => in schema: {(6) default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), plus1 (INT4), result (INT4), total (INT8), v1 (INT4)}
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash.plan
index 3a80bb4..f3b0e9d 100644
--- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash.plan
+++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testJoinOnMultipleDatabases.Hash.plan
@@ -45,124 +45,91 @@ SORT(6)
 explain
 -------------------------------
 -------------------------------------------------------------------------------
-Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009)
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011)
 -------------------------------------------------------------------------------
-|-eb_0000000000000_0000_000009
-   |-eb_0000000000000_0000_000008
-      |-eb_0000000000000_0000_000007
-         |-eb_0000000000000_0000_000006
-         |-eb_0000000000000_0000_000003
+|-eb_0000000000000_0000_000011
+   |-eb_0000000000000_0000_000010
+      |-eb_0000000000000_0000_000009
 -------------------------------------------------------------------------------
 Order of Execution
 -------------------------------------------------------------------------------
-1: eb_0000000000000_0000_000003
-2: eb_0000000000000_0000_000006
-3: eb_0000000000000_0000_000007
-4: eb_0000000000000_0000_000008
-5: eb_0000000000000_0000_000009
+1: eb_0000000000000_0000_000009
+2: eb_0000000000000_0000_000010
+3: eb_0000000000000_0000_000011
 -------------------------------------------------------------------------------
 
 =======================================================
-Block Id: eb_0000000000000_0000_000003 [LEAF]
+Block Id: eb_0000000000000_0000_000009 [LEAF]
 =======================================================
 
 [Outgoing]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
 
 [Enforcers]
  0: type=Broadcast, tables=joins.supplier_
- 1: type=Broadcast, tables=default.nation
- 2: type=Broadcast, tables=default.region
+ 1: type=Broadcast, tables=default.region
+ 2: type=Broadcast, tables=joins.part_
+ 3: type=Broadcast, tables=default.partsupp
 
-JOIN(14)(INNER)
-  => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
-  => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-  => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-  => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-   SCAN(4) on default.region
-     => target list: default.region.r_regionkey (INT4)
-     => out schema: {(1) default.region.r_regionkey (INT4)}
-     => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
-   JOIN(13)(INNER)
-     => Join Cond: joins.supplier_.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
-     => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-     => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-     => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-      SCAN(3) on default.nation
-        => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-        => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-        => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-      SCAN(1) on joins.supplier_
-        => target list: joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
-        => out schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-        => in schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000006 [LEAF]
-=======================================================
-
-[Outgoing]
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
-
-[Enforcers]
- 0: type=Broadcast, tables=joins.part_
- 1: type=Broadcast, tables=default.partsupp
-
-JOIN(15)(INNER)
-  => Join Cond: joins.part_.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
-  => target list: default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
-  => out schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-  => in schema: {(4) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-   SCAN(2) on default.partsupp
-     => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
-     => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
-     => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
-   SCAN(0) on joins.part_
-     => target list: joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
-     => out schema: {(2) joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-     => in schema: {(9) joins.part_.p_brand (TEXT), joins.part_.p_comment (TEXT), joins.part_.p_container (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_name (TEXT), joins.part_.p_partkey (INT4), joins.part_.p_retailprice (FLOAT8), joins.part_.p_size (INT4), joins.part_.p_type (TEXT)}
-
-=======================================================
-Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
-=======================================================
-
-[Incoming]
-[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=joins.supplier_.s_suppkey (INT4), num=32)
-[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.partsupp.ps_suppkey (INT4), num=32)
-
-[Outgoing]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
-
-SORT(20)
+SORT(26)
   => Sort Keys: joins.supplier_.s_acctbal (FLOAT8) (asc),joins.supplier_.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),joins.part_.p_partkey (INT4) (asc)
    JOIN(16)(INNER)
      => Join Cond: joins.supplier_.s_suppkey (INT4) = default.partsupp.ps_suppkey (INT4)
      => target list: default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)
      => out schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
      => in schema: {(10) default.nation.n_name (TEXT), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-      SCAN(19) on eb_0000000000000_0000_000006
+      JOIN(15)(INNER)
+        => Join Cond: joins.part_.p_partkey (INT4) = default.partsupp.ps_partkey (INT4)
+        => target list: default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
         => out schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-        => in schema: {(3) default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
-      SCAN(18) on eb_0000000000000_0000_000003
+        => in schema: {(4) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
+         SCAN(2) on default.partsupp
+           => target list: default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)
+           => out schema: {(2) default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4)}
+           => in schema: {(5) default.partsupp.ps_availqty (INT4), default.partsupp.ps_comment (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_suppkey (INT4), default.partsupp.ps_supplycost (FLOAT8)}
+         SCAN(0) on joins.part_
+           => target list: joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)
+           => out schema: {(2) joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4)}
+           => in schema: {(9) joins.part_.p_brand (TEXT), joins.part_.p_comment (TEXT), joins.part_.p_container (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_name (TEXT), joins.part_.p_partkey (INT4), joins.part_.p_retailprice (FLOAT8), joins.part_.p_size (INT4), joins.part_.p_type (TEXT)}
+      JOIN(14)(INNER)
+        => Join Cond: default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4)
+        => target list: default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
         => out schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
-        => in schema: {(7) default.nation.n_name (TEXT), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+        => in schema: {(9) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+         SCAN(4) on default.region
+           => target list: default.region.r_regionkey (INT4)
+           => out schema: {(1) default.region.r_regionkey (INT4)}
+           => in schema: {(3) default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)}
+         JOIN(13)(INNER)
+           => Join Cond: joins.supplier_.s_nationkey (INT4) = default.nation.n_nationkey (INT4)
+           => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+           => out schema: {(8) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+           => in schema: {(10) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+            SCAN(3) on default.nation
+              => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+              => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+              => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+            SCAN(1) on joins.supplier_
+              => target list: joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)
+              => out schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
+              => in schema: {(7) joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_nationkey (INT4), joins.supplier_.s_phone (TEXT), joins.supplier_.s_suppkey (INT4)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000008 [ROOT]
+Block Id: eb_0000000000000_0000_000010 [ROOT]
 =======================================================
 
 [Incoming]
-[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
+[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_name (TEXT), num=32)
 
 [Enforcers]
- 0: sorted input=eb_0000000000000_0000_000007
+ 0: sorted input=eb_0000000000000_0000_000009
 
 SORT(6)
   => Sort Keys: joins.supplier_.s_acctbal (FLOAT8) (asc),joins.supplier_.s_name (TEXT) (asc),default.nation.n_name (TEXT) (asc),joins.part_.p_partkey (INT4) (asc)
-   SCAN(21) on eb_0000000000000_0000_000007
+   SCAN(27) on eb_0000000000000_0000_000009
      => out schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
      => in schema: {(8) default.nation.n_name (TEXT), joins.part_.p_mfgr (TEXT), joins.part_.p_partkey (INT4), joins.supplier_.s_acctbal (FLOAT8), joins.supplier_.s_address (TEXT), joins.supplier_.s_comment (TEXT), joins.supplier_.s_name (TEXT), joins.supplier_.s_phone (TEXT)}
 
 =======================================================
-Block Id: eb_0000000000000_0000_000009 [TERMINAL]
+Block Id: eb_0000000000000_0000_000011 [TERMINAL]
 =======================================================