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/27 13:16:58 UTC

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

Repository: tajo
Updated Branches:
  refs/heads/master 4f3a46c36 -> 8fd9ae72c


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


[02/13] 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
+-------------------------------


[12/13] 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)


[06/13] 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]
+=======================================================


[13/13] 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/master
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);


[04/13] 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]
+=======================================================


[08/13] 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]


[07/13] 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]
 =======================================================


[05/13] 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)}
 


[10/13] 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]
 =======================================================


[09/13] 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)}
 


[11/13] 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]
 =======================================================


[03/13] 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]