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/08/25 11:21:03 UTC

[18/18] tajo git commit: TAJO-1766: Improve the performance of cross join.

TAJO-1766: Improve the performance of cross join.

Closes #706


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

Branch: refs/heads/master
Commit: 1a7c353c203b10b28f028a3fad44eacb2010dae1
Parents: cb6fe80
Author: Jihoon Son <ji...@apache.org>
Authored: Tue Aug 25 18:20:12 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Tue Aug 25 18:20:12 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 .../org/apache/tajo/algebra/Aggregation.java    |   2 +-
 .../org/apache/tajo/catalog/SchemaUtil.java     |   8 +-
 .../java/org/apache/tajo/QueryTestCaseBase.java |   6 +-
 .../main/java/org/apache/tajo/SessionVars.java  |   7 +-
 .../java/org/apache/tajo/conf/TajoConf.java     |   5 +-
 .../apache/tajo/exception/ErrorMessages.java    |   5 +
 .../apache/tajo/exception/ExceptionUtil.java    |   3 +
 .../exception/InvalidInputsForCrossJoin.java    |  37 +++
 .../TooLargeInputForCrossJoinException.java     |  38 +++
 tajo-common/src/main/proto/errors.proto         |  22 +-
 .../org/apache/tajo/cli/tsql/TestTajoCli.java   |   5 +-
 .../planner/physical/TestBNLJoinExec.java       | 224 -----------------
 .../engine/planner/physical/TestNLJoinExec.java | 208 ----------------
 .../apache/tajo/engine/query/TestCrossJoin.java | 163 ++++++++++++
 .../tajo/engine/query/TestInnerJoinQuery.java   |  67 -----
 .../apache/tajo/engine/query/TestJoinQuery.java |  12 +-
 .../TestCrossJoin/testCrossJoinAndCaseWhen.sql  |  18 ++
 .../testCrossJoinWithAsterisk1.sql              |   1 +
 .../testCrossJoinWithAsterisk2.sql              |   1 +
 .../testCrossJoinWithAsterisk3.sql              |   1 +
 .../testCrossJoinWithAsterisk4.sql              |   1 +
 .../testCrossJoinAndCaseWhen.sql                |  18 --
 .../testCrossJoinWithAsterisk1.sql              |   1 -
 .../testCrossJoinWithAsterisk2.sql              |   1 -
 .../testCrossJoinWithAsterisk3.sql              |   1 -
 .../testCrossJoinWithAsterisk4.sql              |   1 -
 .../TestCrossJoin/testCrossJoin.1.Hash.plan     |  76 ++++++
 .../testCrossJoin.1.Hash_NoBroadcast.plan       | 103 ++++++++
 .../TestCrossJoin/testCrossJoin.1.Sort.plan     |  76 ++++++
 .../testCrossJoin.1.Sort_NoBroadcast.plan       | 103 ++++++++
 .../TestCrossJoin/testCrossJoin.1.result        | 127 ++++++++++
 .../TestCrossJoin/testCrossJoin.2.Hash.plan     |  51 ++++
 .../testCrossJoin.2.Hash_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.2.Sort.plan     |  51 ++++
 .../testCrossJoin.2.Sort_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.2.result        |  27 ++
 .../TestCrossJoin/testCrossJoin.3.Hash.plan     |  51 ++++
 .../testCrossJoin.3.Hash_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.3.Sort.plan     |  51 ++++
 .../testCrossJoin.3.Sort_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.3.result        |  27 ++
 .../TestCrossJoin/testCrossJoin.4.Hash.plan     |  51 ++++
 .../testCrossJoin.4.Hash_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.4.Sort.plan     |  51 ++++
 .../testCrossJoin.4.Sort_NoBroadcast.plan       |  78 ++++++
 .../TestCrossJoin/testCrossJoin.4.result        |  27 ++
 .../TestCrossJoin/testCrossJoin.5.Hash.plan     |  76 ++++++
 .../testCrossJoin.5.Hash_NoBroadcast.plan       | 103 ++++++++
 .../TestCrossJoin/testCrossJoin.5.Sort.plan     |  76 ++++++
 .../testCrossJoin.5.Sort_NoBroadcast.plan       | 103 ++++++++
 .../TestCrossJoin/testCrossJoin.5.result        |  27 ++
 .../testCrossJoinAndCaseWhen.Hash.plan          |  78 ++++++
 ...stCrossJoinAndCaseWhen.Hash_NoBroadcast.plan | 105 ++++++++
 .../testCrossJoinAndCaseWhen.Sort.plan          |  78 ++++++
 ...stCrossJoinAndCaseWhen.Sort_NoBroadcast.plan | 105 ++++++++
 .../testCrossJoinAndCaseWhen.result             |  27 ++
 .../testCrossJoinOfOneSmallTable.1.Hash.plan    |  51 ++++
 ...sJoinOfOneSmallTable.1.Hash_NoBroadcast.plan |  78 ++++++
 .../testCrossJoinOfOneSmallTable.1.Sort.plan    |  51 ++++
 ...sJoinOfOneSmallTable.1.Sort_NoBroadcast.plan |  78 ++++++
 .../testCrossJoinOfOneSmallTable.1.result       | 127 ++++++++++
 ...tCrossJoinOfOneSmallTableAndJoin.1.Hash.plan |  89 +++++++
 ...OneSmallTableAndJoin.1.Hash_NoBroadcast.plan | 174 +++++++++++++
 ...tCrossJoinOfOneSmallTableAndJoin.1.Sort.plan |  89 +++++++
 ...OneSmallTableAndJoin.1.Sort_NoBroadcast.plan | 174 +++++++++++++
 ...testCrossJoinOfOneSmallTableAndJoin.1.result |   2 +
 .../testCrossJoinOftwoSmallTables.1.Hash.plan   |  51 ++++
 ...JoinOftwoSmallTables.1.Hash_NoBroadcast.plan |  78 ++++++
 .../testCrossJoinOftwoSmallTables.1.Sort.plan   |  51 ++++
 ...JoinOftwoSmallTables.1.Sort_NoBroadcast.plan |  78 ++++++
 .../testCrossJoinOftwoSmallTables.1.result      |  27 ++
 .../testCrossJoinWithAsterisk1.Hash.plan        |  76 ++++++
 ...CrossJoinWithAsterisk1.Hash_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk1.Sort.plan        |  76 ++++++
 ...CrossJoinWithAsterisk1.Sort_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk1.result           |  27 ++
 .../testCrossJoinWithAsterisk2.Hash.plan        |  76 ++++++
 ...CrossJoinWithAsterisk2.Hash_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk2.Sort.plan        |  76 ++++++
 ...CrossJoinWithAsterisk2.Sort_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk2.result           |  27 ++
 .../testCrossJoinWithAsterisk3.Hash.plan        |  76 ++++++
 ...CrossJoinWithAsterisk3.Hash_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk3.Sort.plan        |  76 ++++++
 ...CrossJoinWithAsterisk3.Sort_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk3.result           |  27 ++
 .../testCrossJoinWithAsterisk4.Hash.plan        |  76 ++++++
 ...CrossJoinWithAsterisk4.Hash_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk4.Sort.plan        |  76 ++++++
 ...CrossJoinWithAsterisk4.Sort_NoBroadcast.plan | 103 ++++++++
 .../testCrossJoinWithAsterisk4.result           |  27 ++
 .../testCrossJoinWithEmptyTable1.Hash.plan      |  78 ++++++
 ...ossJoinWithEmptyTable1.Hash_NoBroadcast.plan | 105 ++++++++
 .../testCrossJoinWithEmptyTable1.Sort.plan      |  78 ++++++
 ...ossJoinWithEmptyTable1.Sort_NoBroadcast.plan | 105 ++++++++
 .../testCrossJoinWithEmptyTable1.result         |   2 +
 ...sJoinWithThetaJoinConditionInWhere.Hash.plan |  63 +++++
 ...taJoinConditionInWhere.Hash_NoBroadcast.plan |  90 +++++++
 ...sJoinWithThetaJoinConditionInWhere.Sort.plan |  63 +++++
 ...taJoinConditionInWhere.Sort_NoBroadcast.plan |  90 +++++++
 ...rossJoinWithThetaJoinConditionInWhere.result |  12 +
 .../testCrossJoin.1.Hash.plan                   |  76 ------
 .../testCrossJoin.1.Hash_NoBroadcast.plan       | 103 --------
 .../testCrossJoin.1.Sort.plan                   |  76 ------
 .../testCrossJoin.1.Sort_NoBroadcast.plan       | 103 --------
 .../TestInnerJoinQuery/testCrossJoin.1.result   | 127 ----------
 .../testCrossJoin.2.Hash.plan                   |  51 ----
 .../testCrossJoin.2.Hash_NoBroadcast.plan       |  78 ------
 .../testCrossJoin.2.Sort.plan                   |  51 ----
 .../testCrossJoin.2.Sort_NoBroadcast.plan       |  78 ------
 .../TestInnerJoinQuery/testCrossJoin.2.result   |  27 --
 .../testCrossJoin.3.Hash.plan                   |  51 ----
 .../testCrossJoin.3.Hash_NoBroadcast.plan       |  78 ------
 .../testCrossJoin.3.Sort.plan                   |  51 ----
 .../testCrossJoin.3.Sort_NoBroadcast.plan       |  78 ------
 .../TestInnerJoinQuery/testCrossJoin.3.result   |  27 --
 .../testCrossJoin.4.Hash.plan                   |  51 ----
 .../testCrossJoin.4.Hash_NoBroadcast.plan       |  78 ------
 .../testCrossJoin.4.Sort.plan                   |  51 ----
 .../testCrossJoin.4.Sort_NoBroadcast.plan       |  78 ------
 .../TestInnerJoinQuery/testCrossJoin.4.result   |  27 --
 .../testCrossJoin.5.Hash.plan                   |  76 ------
 .../testCrossJoin.5.Hash_NoBroadcast.plan       | 103 --------
 .../testCrossJoin.5.Sort.plan                   |  76 ------
 .../testCrossJoin.5.Sort_NoBroadcast.plan       | 103 --------
 .../TestInnerJoinQuery/testCrossJoin.5.result   |  27 --
 .../testCrossJoinAndCaseWhen.Hash.plan          |  78 ------
 ...stCrossJoinAndCaseWhen.Hash_NoBroadcast.plan | 105 --------
 .../testCrossJoinAndCaseWhen.Sort.plan          |  78 ------
 ...stCrossJoinAndCaseWhen.Sort_NoBroadcast.plan | 105 --------
 .../testCrossJoinAndCaseWhen.result             |  27 --
 .../testCrossJoinWithAsterisk1.Hash.plan        |  76 ------
 ...CrossJoinWithAsterisk1.Hash_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk1.Sort.plan        |  76 ------
 ...CrossJoinWithAsterisk1.Sort_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk1.result           |  27 --
 .../testCrossJoinWithAsterisk2.Hash.plan        |  76 ------
 ...CrossJoinWithAsterisk2.Hash_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk2.Sort.plan        |  76 ------
 ...CrossJoinWithAsterisk2.Sort_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk2.result           |  27 --
 .../testCrossJoinWithAsterisk3.Hash.plan        |  76 ------
 ...CrossJoinWithAsterisk3.Hash_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk3.Sort.plan        |  76 ------
 ...CrossJoinWithAsterisk3.Sort_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk3.result           |  27 --
 .../testCrossJoinWithAsterisk4.Hash.plan        |  76 ------
 ...CrossJoinWithAsterisk4.Hash_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk4.Sort.plan        |  76 ------
 ...CrossJoinWithAsterisk4.Sort_NoBroadcast.plan | 103 --------
 .../testCrossJoinWithAsterisk4.result           |  27 --
 .../testCrossJoinWithEmptyTable1.Hash.plan      |  78 ------
 ...ossJoinWithEmptyTable1.Hash_NoBroadcast.plan | 105 --------
 .../testCrossJoinWithEmptyTable1.Sort.plan      |  78 ------
 ...ossJoinWithEmptyTable1.Sort_NoBroadcast.plan | 105 --------
 .../testCrossJoinWithEmptyTable1.result         |   2 -
 ...sJoinWithThetaJoinConditionInWhere.Hash.plan |  63 -----
 ...taJoinConditionInWhere.Hash_NoBroadcast.plan |  90 -------
 ...sJoinWithThetaJoinConditionInWhere.Sort.plan |  63 -----
 ...taJoinConditionInWhere.Sort_NoBroadcast.plan |  90 -------
 ...rossJoinWithThetaJoinConditionInWhere.result |  12 -
 .../testJoinWithMultipleJoinQual1.Hash.plan     |   4 +-
 ...nWithMultipleJoinQual1.Hash_NoBroadcast.plan |   4 +-
 .../testJoinWithMultipleJoinQual1.Sort.plan     |   4 +-
 ...nWithMultipleJoinQual1.Sort_NoBroadcast.plan |   4 +-
 .../testJoinWithOrPredicates.Hash.plan          |   4 +-
 ...stJoinWithOrPredicates.Hash_NoBroadcast.plan |   4 +-
 .../testJoinWithOrPredicates.Sort.plan          |   4 +-
 ...stJoinWithOrPredicates.Sort_NoBroadcast.plan |   4 +-
 .../testNaturalJoin.Hash.plan                   |   4 +-
 .../testNaturalJoin.Hash_NoBroadcast.plan       |   4 +-
 .../testNaturalJoin.Sort.plan                   |   4 +-
 .../testNaturalJoin.Sort_NoBroadcast.plan       |   4 +-
 ...testJoinFilterOfRowPreservedTable1.Hash.plan |   4 +-
 ...erOfRowPreservedTable1.Hash_NoBroadcast.plan |   4 +-
 ...testJoinFilterOfRowPreservedTable1.Sort.plan |   4 +-
 ...erOfRowPreservedTable1.Sort_NoBroadcast.plan |   4 +-
 .../testLeftOuterJoin2.Hash.plan                |  56 ++---
 .../testLeftOuterJoin2.Hash_NoBroadcast.plan    | 118 ++++-----
 .../testLeftOuterJoin2.Sort.plan                |  56 ++---
 .../testLeftOuterJoin2.Sort_NoBroadcast.plan    | 118 ++++-----
 .../testLeftOuterJoin3.Hash.plan                |  73 ++----
 .../testLeftOuterJoin3.Sort.plan                |  73 ++----
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan |   4 +-
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan |   4 +-
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |  67 ++---
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |  67 ++---
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan |   4 +-
 ...edicationCaseByCase3.1.Hash_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan |   4 +-
 ...edicationCaseByCase3.1.Sort_NoBroadcast.plan |   4 +-
 .../testLeftOuterJoinWithNull2.Hash.plan        |   4 +-
 ...LeftOuterJoinWithNull2.Hash_NoBroadcast.plan |   4 +-
 .../testLeftOuterJoinWithNull2.Sort.plan        |   4 +-
 ...LeftOuterJoinWithNull2.Sort_NoBroadcast.plan |   4 +-
 .../testOuterJoinAndCaseWhen1.Hash.plan         |  73 ++----
 .../testOuterJoinAndCaseWhen1.Sort.plan         |  73 ++----
 ...tOuterJoinPredicationCaseByCase1.1.Hash.plan |  71 ++----
 ...edicationCaseByCase1.1.Hash_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase1.1.Sort.plan |  71 ++----
 ...edicationCaseByCase1.1.Sort_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase2.1.Hash.plan |   4 +-
 ...edicationCaseByCase2.1.Hash_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase2.1.Sort.plan |   4 +-
 ...edicationCaseByCase2.1.Sort_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase3.1.Hash.plan |  69 ++----
 ...edicationCaseByCase3.1.Hash_NoBroadcast.plan |   4 +-
 ...tOuterJoinPredicationCaseByCase3.1.Sort.plan |  69 ++----
 ...edicationCaseByCase3.1.Sort_NoBroadcast.plan |   4 +-
 .../TestTajoCli/testHelpSessionVars.result      |   5 +-
 .../engine/planner/PhysicalPlannerImpl.java     |  22 +-
 .../tajo/engine/planner/enforce/Enforcer.java   |   4 -
 .../engine/planner/global/ExecutionBlock.java   |   4 +-
 .../rewriter/rules/BroadcastJoinRule.java       | 248 +++++++++++++++----
 .../rewriter/rules/GlobalPlanRewriteUtil.java   |   2 +-
 .../engine/planner/physical/BNLJoinExec.java    | 183 --------------
 .../planner/physical/BSTIndexScanExec.java      |  26 +-
 .../physical/BasicPhysicalExecutorVisitor.java  |  29 +--
 .../planner/physical/CommonHashJoinExec.java    |  91 +++++--
 .../planner/physical/HashFullOuterJoinExec.java |   2 +-
 .../engine/planner/physical/HashJoinExec.java   |   7 +-
 .../planner/physical/IndexExecutorUtil.java     |  33 +++
 .../engine/planner/physical/NLJoinExec.java     |  75 ------
 .../physical/PartitionMergeScanExec.java        |   5 +
 .../physical/PhysicalExecutorVisitor.java       |   9 +-
 .../tajo/engine/planner/physical/ScanExec.java  |   3 +
 .../engine/planner/physical/SeqScanExec.java    |   5 +
 .../engine/planner/physical/StoreIndexExec.java |  10 +-
 .../apache/tajo/engine/utils/CacheHolder.java   |  26 +-
 .../org/apache/tajo/master/GlobalEngine.java    |  15 +-
 .../tajo/master/QueryCoordinatorService.java    |   6 +-
 .../org/apache/tajo/master/QueryInProgress.java |   7 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |  33 ++-
 .../apache/tajo/querymaster/QueryMaster.java    |   6 +
 .../tajo/querymaster/QueryMasterTask.java       |  36 +--
 .../tajo/worker/ExecutionBlockContext.java      |   2 +-
 .../apache/tajo/worker/TaskAttemptContext.java  |  11 -
 tajo-core/src/main/proto/ResourceProtos.proto   |   4 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |   1 +
 .../GreedyHeuristicJoinOrderAlgorithm.java      |  20 +-
 .../plan/rewrite/rules/FilterPushDownRule.java  |   3 +-
 .../org/apache/tajo/plan/util/IndexUtil.java    |  72 ------
 .../org/apache/tajo/plan/util/PlannerUtil.java  |   6 +
 .../plan/verifier/PostLogicalPlanVerifier.java  | 148 +++++++++++
 tajo-plan/src/main/proto/Plan.proto             |   2 -
 248 files changed, 6929 insertions(+), 6174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index b3ed451..c6a85ad 100644
--- a/CHANGES
+++ b/CHANGES
@@ -34,6 +34,8 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1766: Improve the performance of cross join. (jihoon)
+
     TAJO-1792: tajo-cluster-tests is not available when it is used as an 
     external maven module. (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
index 8bcd7e2..c44e1bb 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
@@ -145,7 +145,7 @@ public class Aggregation extends UnaryOperator {
     }
   }
 
-  public static enum GroupType {
+  public enum GroupType {
     OrdinaryGroup(""),
     Cube("Cube"),
     Rollup("Rollup"),

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
index 09a2e45..4a8e419 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
@@ -20,6 +20,8 @@ package org.apache.tajo.catalog;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.exception.UnsupportedDataTypeException;
 import org.apache.tajo.util.TUtil;
 
 import java.util.HashMap;
@@ -226,7 +228,7 @@ public class SchemaUtil {
       case BOOLEAN:
         return 1;
       case CHAR:
-        return 1;
+        return col.getDataType().getLength();
       case BIT:
         return 1;
       case INT2:
@@ -242,7 +244,7 @@ public class SchemaUtil {
       case INET4:
         return 4;
       case INET6:
-        return 32;
+        return 16;
       case TEXT:
         return 256;
       case BLOB:
@@ -254,7 +256,7 @@ public class SchemaUtil {
       case TIMESTAMP:
         return 8;
       default:
-        return 0;
+        throw new TajoRuntimeException(new UnsupportedDataTypeException(col.getDataType().toString()));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
index 8200cec..0f277f0 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
@@ -578,8 +578,8 @@ public class QueryTestCaseBase {
 
         // plan test
         if (prefix.length() > 0) {
-          String planResultName = methodName + (fromFile ? "" : "" + (i + 1)) +
-              ((option.parameterized() && testParameter != null) ? "" + testParameter : "") + ".plan";
+          String planResultName = methodName + (fromFile ? "" : "." + (i + 1)) +
+              ((option.parameterized() && testParameter != null) ? "." + testParameter : "") + ".plan";
           Path resultPath = StorageUtil.concatPath(currentResultPath, planResultName);
           if (currentResultFS.exists(resultPath)) {
             assertEquals("Plan Verification for: " + (i + 1) + " th test",
@@ -596,7 +596,7 @@ public class QueryTestCaseBase {
         ResultSet result = client.executeQueryAndGetResult(spec.value());
 
         // result test
-        String fileName = methodName + (fromFile ? "" : "" + (i + 1)) + ".result";
+        String fileName = methodName + (fromFile ? "" : "." + (i + 1)) + ".result";
         Path resultPath = StorageUtil.concatPath(currentResultPath, fileName);
         if (currentResultFS.exists(resultPath)) {
           assertEquals("Result Verification for: " + (i + 1) + " th test",

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
index 6c7d075..7d47c23 100644
--- a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
+++ b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
@@ -89,8 +89,11 @@ public enum SessionVars implements ConfigKey {
   // Query and Optimization ---------------------------------------------------
 
   // for distributed query strategies
-  BROADCAST_TABLE_SIZE_LIMIT(ConfVars.$DIST_QUERY_BROADCAST_JOIN_THRESHOLD, "limited size (bytes) of broadcast table",
-      DEFAULT, Long.class, Validators.min("0")),
+  BROADCAST_NON_CROSS_JOIN_THRESHOLD(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD,
+      "restriction for the total bytes of broadcasted table for non-cross join", DEFAULT, Long.class,
+      Validators.min("0")),
+  BROADCAST_CROSS_JOIN_THRESHOLD(ConfVars.$DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD,
+      "restriction for the total bytes of broadcasted table for cross join", DEFAULT, Long.class, Validators.min("0")),
 
   JOIN_TASK_INPUT_SIZE(ConfVars.$DIST_QUERY_JOIN_TASK_VOLUME, "join task input size (mb) ", DEFAULT,
       Integer.class, Validators.min("1")),

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index 1f7f2fa..75826e6 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -310,7 +310,10 @@ public class TajoConf extends Configuration {
     // Query and Optimization ---------------------------------------------------
 
     // for distributed query strategies
-    $DIST_QUERY_BROADCAST_JOIN_THRESHOLD("tajo.dist-query.join.broadcast.threshold-bytes", (long)5 * 1048576),
+    $DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD("tajo.dist-query.broadcast.non-cross-join.threshold-bytes",
+        (long)5 * 1048576), // 5 MB
+    $DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD("tajo.dist-query.broadcast.cross-join.threshold-bytes",
+        (long)1 * 1048576), // 1 MB
 
     $DIST_QUERY_JOIN_TASK_VOLUME("tajo.dist-query.join.task-volume-mb", 128),
     $DIST_QUERY_SORT_TASK_VOLUME("tajo.dist-query.sort.task-volume-mb", 128),

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
index e617efa..edae2d7 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
@@ -108,6 +108,11 @@ public class ErrorMessages {
     ADD_MESSAGE(AMBIGUOUS_PARTITION_DIRECTORY, "There is a directory which is assumed to be a partitioned directory" +
       " : '%s'", 1);
 
+    ADD_MESSAGE(TOO_LARGE_INPUT_FOR_CROSS_JOIN, "Cross join of large tables is not allowed: (%s). " +
+        "To execute cross join, please increase BROADCAST_CROSS_JOIN_THRESHOLD " +
+        "which is currently set to %s.", 2);
+    ADD_MESSAGE(INVALID_INPUTS_FOR_CROSS_JOIN, "At least one of both inputs for the cross join must be a simple " +
+        "relation.");
 
     ADD_MESSAGE(CLIENT_CONNECTION_EXCEPTION, "Client connection to '%s' has error: %s", 2);
     ADD_MESSAGE(CLIENT_UNABLE_TO_ESTABLISH_CONNECTION, "Client is unable to establish connection to '%s'", 1);

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
index 2fd49ac..6e36f94 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
@@ -80,6 +80,9 @@ public class ExceptionUtil {
     ADD_EXCEPTION(INVALID_DATATYPE, InvalidDataTypeException.class);
     ADD_EXCEPTION(INVALID_TABLE_PROPERTY, InvalidTablePropertyException.class);
     ADD_EXCEPTION(MISSING_TABLE_PROPERTY, MissingTablePropertyException.class);
+
+    ADD_EXCEPTION(TOO_LARGE_INPUT_FOR_CROSS_JOIN, TooLargeInputForCrossJoinException.class);
+    ADD_EXCEPTION(INVALID_INPUTS_FOR_CROSS_JOIN, InvalidInputsForCrossJoin.class);
   }
 
   private static void ADD_EXCEPTION(Errors.ResultCode code, Class<? extends DefaultTajoException> cls) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java b/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java
new file mode 100644
index 0000000..3fafd39
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java
@@ -0,0 +1,37 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.exception;
+
+import org.apache.tajo.error.Errors.ResultCode;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState;
+
+/**
+ *
+ * This exception occurs when both inputs of a cross join are not the simple relation.
+ */
+public class InvalidInputsForCrossJoin extends TajoException {
+
+  public InvalidInputsForCrossJoin(ReturnState e) {
+    super(e);
+  }
+
+  public InvalidInputsForCrossJoin() {
+    super(ResultCode.INVALID_INPUTS_FOR_CROSS_JOIN);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java
new file mode 100644
index 0000000..32cd44e
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java
@@ -0,0 +1,38 @@
+/**
+ * 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.exception;
+
+import org.apache.tajo.error.Errors.ResultCode;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState;
+import org.apache.tajo.util.StringUtils;
+
+/**
+ *
+ * This exception occurs when the cross join cannot be executed with the broadcast join.
+ */
+public class TooLargeInputForCrossJoinException extends TajoException {
+
+  public TooLargeInputForCrossJoinException(ReturnState e) {
+    super(e);
+  }
+
+  public TooLargeInputForCrossJoinException(String[] relations, long currentBroadcastThreshold) {
+    super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations), "" + currentBroadcastThreshold);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-common/src/main/proto/errors.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto
index 4057456..b947a95 100644
--- a/tajo-common/src/main/proto/errors.proto
+++ b/tajo-common/src/main/proto/errors.proto
@@ -173,25 +173,27 @@ enum ResultCode {
   CLIENT_PROTOCOL_PROTOCOL_VIOLATION    = 1103; // SQLState: ?
 
   // 53 - Invalid Operand or Inconsistent Specification
-  INSUFFICIENT_RESOURCE         = 53000;
-  DISK_FULL                     = 53100;
-  OUT_OF_MEMORY                 = 53200;
+  INSUFFICIENT_RESOURCE           = 53000;
+  DISK_FULL                       = 53100;
+  OUT_OF_MEMORY                   = 53200;
 
   // 54 - SQL or Product Limit Exceeded
-  PROGRAM_LIMIT_EXCEEDED        = 54000;
-  STATEMENT_TOO_COMPLEX         = 54001;
-  STRING_CONSTANT_TOOL_LONG     = 54002;
+  PROGRAM_LIMIT_EXCEEDED          = 54000;
+  STATEMENT_TOO_COMPLEX           = 54001;
+  STRING_CONSTANT_TOOL_LONG       = 54002;
+  TOO_LARGE_INPUT_FOR_CROSS_JOIN  = 54003;
+  INVALID_INPUTS_FOR_CROSS_JOIN   = 54004;
 
-  TOO_MANY_TABLES               = 54004;
-  TOO_MANY_COLUMNS              = 54011;
-  TOO_MANY_ARGUMENTS            = 54023;
+  TOO_MANY_TABLES                 = 54006;
+  TOO_MANY_COLUMNS                = 54011;
+  TOO_MANY_ARGUMENTS              = 54023;
 
   // 55 - Object Not in Prerequisite State
   // 56 - Miscellaneous SQL or Product Error
   // 57 - Resource Not Available or Operator Intervention
 
   // 58 - System Error
-  IO_ERROR                      = 58030;
+  IO_ERROR                        = 58030;
 
 
   // underlying system errors based on errno.h.

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
index e744631..5005670 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
@@ -35,7 +35,10 @@ import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.storage.TablespaceManager;
 import org.apache.tajo.util.FileUtil;
-import org.junit.*;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.TestName;
 
 import java.io.*;

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java
deleted file mode 100644
index 71bad20..0000000
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java
+++ /dev/null
@@ -1,224 +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.physical;
-
-import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.algebra.Expr;
-import org.apache.tajo.catalog.*;
-import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.engine.parser.SQLAnalyzer;
-import org.apache.tajo.engine.planner.PhysicalPlanner;
-import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
-import org.apache.tajo.engine.planner.enforce.Enforcer;
-import org.apache.tajo.engine.query.QueryContext;
-import org.apache.tajo.exception.TajoException;
-import org.apache.tajo.plan.LogicalPlanner;
-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.util.PlannerUtil;
-import org.apache.tajo.storage.*;
-import org.apache.tajo.storage.fragment.FileFragment;
-import org.apache.tajo.util.CommonTestingUtil;
-import org.apache.tajo.util.TUtil;
-import org.apache.tajo.worker.TaskAttemptContext;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-
-import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
-import static org.apache.tajo.plan.serder.PlanProto.JoinEnforce.JoinAlgorithm;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class TestBNLJoinExec {
-  private TajoConf conf;
-  private final String TEST_PATH = TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/TestBNLJoinExec";
-  private TajoTestingCluster util;
-  private CatalogService catalog;
-  private SQLAnalyzer analyzer;
-  private LogicalPlanner planner;
-  private Path testDir;
-
-  private static int OUTER_TUPLE_NUM = 1000;
-  private static int INNER_TUPLE_NUM = 1000;
-
-  private TableDesc employee;
-  private TableDesc people;
-
-  @Before
-  public void setUp() throws Exception {
-    util = new TajoTestingCluster();
-    catalog = util.startCatalogCluster().getCatalog();
-    testDir = CommonTestingUtil.getTestDir(TEST_PATH);
-    catalog.createTablespace(DEFAULT_TABLESPACE_NAME, testDir.toUri().toString());
-    catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
-    conf = util.getConfiguration();
-
-    Schema schema = new Schema();
-    schema.addColumn("managerid", Type.INT4);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("memid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
-
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
-    Path employeePath = new Path(testDir, "employee.csv");
-    Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
-        .getAppender(employeeMeta, schema, employeePath);
-    appender.init();
-    VTuple tuple = new VTuple(schema.size());
-    for (int i = 0; i < OUTER_TUPLE_NUM; i++) {
-      tuple.put(new Datum[] { DatumFactory.createInt4(i),
-          DatumFactory.createInt4(i), DatumFactory.createInt4(10 + i),
-          DatumFactory.createText("dept_" + i) });
-      appender.addTuple(tuple);
-    }
-    appender.flush();
-    appender.close();
-    employee = CatalogUtil.newTableDesc("default.employee", schema, employeeMeta, employeePath);
-    catalog.createTable(employee);
-
-    Schema peopleSchema = new Schema();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
-    Path peoplePath = new Path(testDir, "people.csv");
-    appender = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(peopleMeta, peopleSchema, peoplePath);
-    appender.init();
-    tuple = new VTuple(peopleSchema.size());
-    for (int i = 1; i < INNER_TUPLE_NUM; i += 2) {
-      tuple.put(new Datum[] { DatumFactory.createInt4(i),
-          DatumFactory.createInt4(10 + i),
-          DatumFactory.createText("name_" + i),
-          DatumFactory.createInt4(30 + i) });
-      appender.addTuple(tuple);
-    }
-    appender.flush();
-    appender.close();
-
-    people = CatalogUtil.newTableDesc("default.people", peopleSchema, peopleMeta, peoplePath);
-    catalog.createTable(people);
-    analyzer = new SQLAnalyzer();
-    planner = new LogicalPlanner(catalog, TablespaceManager.getInstance());
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    util.shutdownCatalogCluster();
-  }
-
-  // employee (managerId, empId, memId, deptName)
-  // people (empId, fk_memId, name, age)
-  String[] QUERIES = {
-      "select managerId, e.empId, deptName, e.memId from employee as e, people p",
-      "select managerId, e.empId, deptName, e.memId from employee as e " +
-          "inner join people as p on e.empId = p.empId and e.memId = p.fk_memId" };
-
-  @Test
-  public final void testBNLCrossJoin() throws IOException, TajoException {
-    Expr expr = analyzer.parse(QUERIES[0]);
-    LogicalNode plan = planner.createPlan(LocalTajoTestingUtility.createDummyContext(conf),
-        expr).getRootBlock().getRoot();
-    JoinNode joinNode = PlannerUtil.findTopNode(plan, NodeType.JOIN);
-    Enforcer enforcer = new Enforcer();
-    enforcer.enforceJoinAlgorithm(joinNode.getPID(), JoinAlgorithm.BLOCK_NESTED_LOOP_JOIN);
-
-    FileFragment[] empFrags = FileTablespace.splitNG(conf, "default.e", employee.getMeta(),
-        new Path(employee.getUri()),
-        Integer.MAX_VALUE);
-    FileFragment[] peopleFrags = FileTablespace.splitNG(conf, "default.p", people.getMeta(),
-        new Path(people.getUri()),
-        Integer.MAX_VALUE);
-    FileFragment[] merged = TUtil.concat(empFrags, peopleFrags);
-    Path workDir = CommonTestingUtil.getTestDir(TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/testBNLCrossJoin");
-    TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
-        LocalTajoTestingUtility.newTaskAttemptId(), merged, workDir);
-    ctx.setEnforcer(enforcer);
-
-    PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
-    PhysicalExec exec = phyPlanner.createPlan(ctx, plan);
-
-    ProjectionExec proj = (ProjectionExec) exec;
-    assertTrue(proj.getChild() instanceof BNLJoinExec);
-
-    int i = 0;
-    exec.init();
-    while (exec.next() != null) {
-      i++;
-    }
-    exec.close();
-    assertEquals(OUTER_TUPLE_NUM * INNER_TUPLE_NUM / 2, i); // expected 10 * 5
-  }
-
-  @Test
-  public final void testBNLInnerJoin() throws IOException, TajoException {
-    Expr context = analyzer.parse(QUERIES[1]);
-    LogicalNode plan = planner.createPlan(LocalTajoTestingUtility.createDummyContext(conf),
-        context).getRootBlock().getRoot();
-
-    FileFragment[] empFrags = FileTablespace.splitNG(conf, "default.e", employee.getMeta(),
-        new Path(employee.getUri()), Integer.MAX_VALUE);
-    FileFragment[] peopleFrags = FileTablespace.splitNG(conf, "default.p", people.getMeta(),
-        new Path(people.getUri()), Integer.MAX_VALUE);
-    FileFragment[] merged = TUtil.concat(empFrags, peopleFrags);
-
-
-    JoinNode joinNode = PlannerUtil.findTopNode(plan, NodeType.JOIN);
-    Enforcer enforcer = new Enforcer();
-    enforcer.enforceJoinAlgorithm(joinNode.getPID(), JoinAlgorithm.BLOCK_NESTED_LOOP_JOIN);
-
-    Path workDir = CommonTestingUtil.getTestDir(TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/testBNLInnerJoin");
-    TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
-        LocalTajoTestingUtility.newTaskAttemptId(),
-        merged, workDir);
-    ctx.setEnforcer(enforcer);
-
-
-    PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
-    PhysicalExec exec = phyPlanner.createPlan(ctx, plan);
-
-    ProjectionExec proj = (ProjectionExec) exec;
-    assertTrue(proj.getChild() instanceof BNLJoinExec);
-
-    Tuple tuple;
-    int i = 1;
-    int count = 0;
-    exec.init();
-    while ((tuple = exec.next()) != null) {
-      count++;
-      assertTrue(i == tuple.getInt4(0));
-      assertTrue(i == tuple.getInt4(1));
-      assertTrue(("dept_" + i).equals(tuple.getText(2)));
-      assertTrue(10 + i == tuple.getInt4(3));
-      i += 2;
-    }
-    exec.close();
-    assertEquals(INNER_TUPLE_NUM / 2, count);
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java
deleted file mode 100644
index d7968fe..0000000
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java
+++ /dev/null
@@ -1,208 +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.physical;
-
-import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.algebra.Expr;
-import org.apache.tajo.catalog.*;
-import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.engine.parser.SQLAnalyzer;
-import org.apache.tajo.engine.planner.PhysicalPlanner;
-import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
-import org.apache.tajo.engine.planner.enforce.Enforcer;
-import org.apache.tajo.engine.planner.global.MasterPlan;
-import org.apache.tajo.engine.query.QueryContext;
-import org.apache.tajo.exception.TajoException;
-import org.apache.tajo.plan.LogicalPlanner;
-import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.storage.*;
-import org.apache.tajo.storage.fragment.FileFragment;
-import org.apache.tajo.util.CommonTestingUtil;
-import org.apache.tajo.util.TUtil;
-import org.apache.tajo.worker.TaskAttemptContext;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-
-import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class TestNLJoinExec {
-  private TajoConf conf;
-  private final String TEST_PATH = TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/TestNLJoinExec";
-  private TajoTestingCluster util;
-  private CatalogService catalog;
-  private SQLAnalyzer analyzer;
-  private LogicalPlanner planner;
-  private Path testDir;
-
-  private TableDesc employee;
-  private TableDesc people;
-
-  private MasterPlan masterPlan;
-
-  @Before
-  public void setUp() throws Exception {
-    util = new TajoTestingCluster();
-    catalog = util.startCatalogCluster().getCatalog();
-    testDir = CommonTestingUtil.getTestDir(TEST_PATH);
-    catalog.createTablespace(DEFAULT_TABLESPACE_NAME, testDir.toUri().toString());
-    catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
-    conf = util.getConfiguration();
-
-    Schema schema = new Schema();
-    schema.addColumn("managerid", Type.INT4);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("memid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
-
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
-    Path employeePath = new Path(testDir, "employee.csv");
-    Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
-        .getAppender(employeeMeta, schema, employeePath);
-    appender.init();
-    VTuple tuple = new VTuple(schema.size());
-    for (int i = 0; i < 50; i++) {
-      tuple.put(new Datum[] {
-          DatumFactory.createInt4(i),
-          DatumFactory.createInt4(i),
-          DatumFactory.createInt4(10 + i),
-          DatumFactory.createText("dept_" + i)});
-      appender.addTuple(tuple);
-    }
-    appender.flush();
-    appender.close();
-    employee = CatalogUtil.newTableDesc("default.employee", schema, employeeMeta, employeePath);
-    catalog.createTable(employee);
-    
-    Schema peopleSchema = new Schema();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
-    Path peoplePath = new Path(testDir, "people.csv");
-    appender = ((FileTablespace) TablespaceManager.getLocalFs())
-        .getAppender(peopleMeta, peopleSchema, peoplePath);
-    appender.init();
-    tuple = new VTuple(peopleSchema.size());
-    for (int i = 1; i < 50; i += 2) {
-      tuple.put(new Datum[] {
-          DatumFactory.createInt4(i),
-          DatumFactory.createInt4(10 + i),
-          DatumFactory.createText("name_" + i),
-          DatumFactory.createInt4(30 + i)});
-      appender.addTuple(tuple);
-    }
-    appender.flush();
-    appender.close();
-    
-    people = CatalogUtil.newTableDesc("default.people", peopleSchema, peopleMeta, peoplePath);
-    catalog.createTable(people);
-    analyzer = new SQLAnalyzer();
-    planner = new LogicalPlanner(catalog, TablespaceManager.getInstance());
-
-    masterPlan = new MasterPlan(LocalTajoTestingUtility.newQueryId(), null, null);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    util.shutdownCatalogCluster();
-  }
-  
-  String[] QUERIES = {
-    "select managerId, e.empId, deptName, e.memId from employee as e, people p",
-    "select managerId, e.empId, deptName, e.memId from employee as e inner join people as p on " +
-        "e.empId = p.empId and e.memId = p.fk_memId"
-  };
-  
-  @Test
-  public final void testNLCrossJoin() throws IOException, TajoException {
-    FileFragment[] empFrags = FileTablespace.splitNG(conf, "default.e", employee.getMeta(),
-        new Path(employee.getUri()), Integer.MAX_VALUE);
-    FileFragment[] peopleFrags = FileTablespace.splitNG(conf, "default.p", people.getMeta(),
-        new Path(people.getUri()), Integer.MAX_VALUE);
-    
-    FileFragment[] merged = TUtil.concat(empFrags, peopleFrags);
-
-    Path workDir = CommonTestingUtil.getTestDir(TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/testNLCrossJoin");
-    TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
-        LocalTajoTestingUtility.newTaskAttemptId(), merged, workDir);
-    ctx.setEnforcer(new Enforcer());
-    Expr expr = analyzer.parse(QUERIES[0]);
-    LogicalNode plan = planner.createPlan(LocalTajoTestingUtility.createDummyContext(conf),
-        expr).getRootBlock().getRoot();
-
-    PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
-    PhysicalExec exec = phyPlanner.createPlan(ctx, plan);
-
-    int i = 0;
-    exec.init();
-    while (exec.next() != null) {
-      i++;
-    }
-    exec.close();
-    assertEquals(50*50/2, i); // expected 10 * 5
-  }
-
-  @Test
-  public final void testNLInnerJoin() throws IOException, TajoException {
-    FileFragment[] empFrags = FileTablespace.splitNG(conf, "default.e", employee.getMeta(),
-        new Path(employee.getUri()), Integer.MAX_VALUE);
-    FileFragment[] peopleFrags = FileTablespace.splitNG(conf, "default.p", people.getMeta(),
-        new Path(people.getUri()), Integer.MAX_VALUE);
-    
-    FileFragment[] merged = TUtil.concat(empFrags, peopleFrags);
-
-    Path workDir = CommonTestingUtil.getTestDir(TajoTestingCluster.DEFAULT_TEST_DIRECTORY + "/testNLInnerJoin");
-    TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
-        LocalTajoTestingUtility.newTaskAttemptId(masterPlan), merged, workDir);
-    ctx.setEnforcer(new Enforcer());
-    Expr expr =  analyzer.parse(QUERIES[1]);
-    LogicalNode plan = planner.createPlan(LocalTajoTestingUtility.createDummyContext(conf),
-        expr).getRootBlock().getRoot();
-
-    PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
-    PhysicalExec exec = phyPlanner.createPlan(ctx, plan);
-    
-    Tuple tuple;
-    int i = 1;
-    int count = 0;
-    exec.init();
-    while ((tuple = exec.next()) != null) {
-      count++;
-      assertTrue(i == tuple.getInt4(0));
-      assertTrue(i == tuple.getInt4(1));
-      assertTrue(("dept_" + i).equals(tuple.getText(2)));
-      assertTrue(10 + i == tuple.getInt4(3));
-      i += 2;
-    }
-    exec.close();
-    assertEquals(50 / 2, count);
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java
new file mode 100644
index 0000000..7990ee7
--- /dev/null
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java
@@ -0,0 +1,163 @@
+/**
+ * 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.query;
+
+import org.apache.tajo.IntegrationTest;
+import org.apache.tajo.NamedTest;
+import org.apache.tajo.exception.InvalidInputsForCrossJoin;
+import org.apache.tajo.exception.TooLargeInputForCrossJoinException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.SQLException;
+
+@Category(IntegrationTest.class)
+@RunWith(Parameterized.class)
+@NamedTest("TestJoinQuery")
+public class TestCrossJoin extends TestJoinQuery {
+
+  public TestCrossJoin(String joinOption) throws Exception {
+    super(joinOption);
+  }
+
+  @BeforeClass
+  public static void setup() throws Exception {
+    TestJoinQuery.setup();
+  }
+
+  @AfterClass
+  public static void classTearDown() throws SQLException {
+    TestJoinQuery.classTearDown();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
+  @SimpleTest(queries = {
+      @QuerySpec("select n_name, r_name, n_regionkey, r_regionkey from nation, region order by n_name, r_name"),
+      // testCrossJoinWithAsterisk
+      @QuerySpec("select region.*, customer.* from region, customer"),
+      @QuerySpec("select region.*, customer.* from customer, region"),
+      @QuerySpec("select * from customer, region"),
+      @QuerySpec("select length(r_comment) as len, *, c_custkey*10 from customer, region order by len,r_regionkey,r_name")
+  })
+  public final void testCrossJoin() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public final void testCrossJoinWithEmptyTable1() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public void testCrossJoinAndCaseWhen() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public void testCrossJoinWithAsterisk1() throws Exception {
+    // select region.*, customer.* from region, customer;
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public void testCrossJoinWithAsterisk2() throws Exception {
+    // select region.*, customer.* from customer, region;
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public void testCrossJoinWithAsterisk3() throws Exception {
+    // select * from customer, region
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest()
+  public void testCrossJoinWithAsterisk4() throws Exception {
+    // select length(r_regionkey), *, c_custkey*10 from customer, region
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
+  @SimpleTest()
+  public final void testCrossJoinWithThetaJoinConditionInWhere() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test (expected = TooLargeInputForCrossJoinException.class)
+  public final void testCrossJoinOfOneLargeTableAndJoin() throws Exception {
+    executeString("select * from nation cross join region left outer join lineitem on r_regionkey = l_orderkey inner join supplier on l_suppkey = s_suppkey");
+  }
+
+  @Test (expected = TooLargeInputForCrossJoinException.class)
+  public final void testCrossJoinOfTwoLargeTables() throws Exception {
+    executeString("select * from nation n1 cross join nation n2");
+  }
+
+  @Test (expected = InvalidInputsForCrossJoin.class)
+  public final void testCrossJoinOfSubqueries() throws Exception {
+    executeString("select * from (select * from nation, region where n_regionkey = r_regionkey) t1 " +
+        "cross join (select * from orders, lineitem where l_orderkey = o_orderkey) t2");
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest (queries = {
+      @QuerySpec("select * from nation cross join region")
+  })
+  public final void testCrossJoinOfOneSmallTable() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest (queries = {
+      @QuerySpec("select * from orders cross join region left outer join lineitem on r_regionkey = l_orderkey " +
+          "inner join supplier on l_suppkey = s_suppkey")
+  })
+  public final void testCrossJoinOfOneSmallTableAndJoin() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
+  @SimpleTest (queries = {
+      @QuerySpec("select * from lineitem cross join region")
+  })
+  public final void testCrossJoinOftwoSmallTables() throws Exception {
+    runSimpleTests();
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInnerJoinQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInnerJoinQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInnerJoinQuery.java
index 88b3548..6ec828c 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInnerJoinQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInnerJoinQuery.java
@@ -50,27 +50,6 @@ public class TestInnerJoinQuery extends TestJoinQuery {
   }
 
   @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
-  @SimpleTest(queries = {
-      @QuerySpec("select n_name, r_name, n_regionkey, r_regionkey from nation, region order by n_name, r_name"),
-      // testCrossJoinWithAsterisk
-      @QuerySpec("select region.*, customer.* from region, customer"),
-      @QuerySpec("select region.*, customer.* from customer, region"),
-      @QuerySpec("select * from customer, region"),
-      @QuerySpec("select length(r_comment) as len, *, c_custkey*10 from customer, region order by len,r_regionkey,r_name")
-  })
-  public final void testCrossJoin() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true)
-  @SimpleTest()
-  public final void testCrossJoinWithThetaJoinConditionInWhere() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest()
   public final void testInnerJoinWithThetaJoinConditionInWhere() throws Exception {
@@ -171,13 +150,6 @@ public class TestInnerJoinQuery extends TestJoinQuery {
 
   @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
-  public final void testCrossJoinWithEmptyTable1() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest(prepare = {
       "CREATE DATABASE JOINS",
       "CREATE TABLE JOINS.part_ as SELECT * FROM part",
@@ -290,45 +262,6 @@ public class TestInnerJoinQuery extends TestJoinQuery {
   @Test
   @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
   @SimpleTest()
-  public void testCrossJoinAndCaseWhen() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
-  public void testCrossJoinWithAsterisk1() throws Exception {
-    // select region.*, customer.* from region, customer;
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
-  public void testCrossJoinWithAsterisk2() throws Exception {
-    // select region.*, customer.* from customer, region;
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
-  public void testCrossJoinWithAsterisk3() throws Exception {
-    // select * from customer, region
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
-  public void testCrossJoinWithAsterisk4() throws Exception {
-    // select length(r_regionkey), *, c_custkey*10 from customer, region
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true, withExplainGlobal = true, parameterized = true)
-  @SimpleTest()
   public final void testBroadcastTwoPartJoin() throws Exception {
     runSimpleTests();
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
index e5b9b98..706f201 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
@@ -59,7 +59,10 @@ public class TestJoinQuery extends QueryTestCaseBase {
     super(TajoConstants.DEFAULT_DATABASE_NAME, joinOption);
 
     testingCluster.setAllTajoDaemonConfValue(ConfVars.$TEST_BROADCAST_JOIN_ENABLED.varname, "true");
-    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_JOIN_THRESHOLD.varname, "" + (5 * 1024));
+    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.varname,
+        "" + (5 * 1024));
+    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD.varname,
+        "" + (2 * 1024));
 
     testingCluster.setAllTajoDaemonConfValue(
         ConfVars.$EXECUTOR_HASH_JOIN_SIZE_THRESHOLD.varname,
@@ -72,7 +75,6 @@ public class TestJoinQuery extends QueryTestCaseBase {
 
     if (joinOption.indexOf("NoBroadcast") >= 0) {
       testingCluster.setAllTajoDaemonConfValue(ConfVars.$TEST_BROADCAST_JOIN_ENABLED.varname, "false");
-      testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_JOIN_THRESHOLD.varname, "-1");
     }
 
     if (joinOption.indexOf("Hash") >= 0) {
@@ -112,8 +114,10 @@ public class TestJoinQuery extends QueryTestCaseBase {
   public static void classTearDown() throws SQLException {
     testingCluster.setAllTajoDaemonConfValue(ConfVars.$TEST_BROADCAST_JOIN_ENABLED.varname,
         ConfVars.$TEST_BROADCAST_JOIN_ENABLED.defaultVal);
-    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_JOIN_THRESHOLD.varname,
-        ConfVars.$DIST_QUERY_BROADCAST_JOIN_THRESHOLD.defaultVal);
+    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.varname,
+        ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.defaultVal);
+    testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD.varname,
+        ConfVars.$DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD.defaultVal);
 
     testingCluster.setAllTajoDaemonConfValue(
         ConfVars.$EXECUTOR_HASH_JOIN_SIZE_THRESHOLD.varname,

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql
new file mode 100644
index 0000000..d058aba
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql
@@ -0,0 +1,18 @@
+select
+  r_regionkey,
+  n_regionkey,
+  case
+    when r_regionkey = 1 then 'one'
+    when r_regionkey = 2 then 'two'
+    when r_regionkey = 3 then 'three'
+    when r_regionkey = 4 then 'four'
+    else 'zero'
+  end as cond
+from
+  region,
+  nation
+where
+  r_regionkey = n_regionkey
+order by
+  r_regionkey,
+  n_regionkey
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql
new file mode 100644
index 0000000..111a371
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql
@@ -0,0 +1 @@
+select region.*, customer.* from region, customer order by r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql
new file mode 100644
index 0000000..ca1672e
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql
@@ -0,0 +1 @@
+select region.*, customer.* from customer, region order by r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql
new file mode 100644
index 0000000..fd44916
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql
@@ -0,0 +1 @@
+select * from customer, region order by c_custkey,c_name,r_regionkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql
new file mode 100644
index 0000000..fc5b1c3
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql
@@ -0,0 +1 @@
+select length(r_comment) as len, *, c_custkey*10 from customer, region order by len,r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql b/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql
deleted file mode 100644
index d058aba..0000000
--- a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql
+++ /dev/null
@@ -1,18 +0,0 @@
-select
-  r_regionkey,
-  n_regionkey,
-  case
-    when r_regionkey = 1 then 'one'
-    when r_regionkey = 2 then 'two'
-    when r_regionkey = 3 then 'three'
-    when r_regionkey = 4 then 'four'
-    else 'zero'
-  end as cond
-from
-  region,
-  nation
-where
-  r_regionkey = n_regionkey
-order by
-  r_regionkey,
-  n_regionkey
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql b/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql
deleted file mode 100644
index 111a371..0000000
--- a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql
+++ /dev/null
@@ -1 +0,0 @@
-select region.*, customer.* from region, customer order by r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql b/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql
deleted file mode 100644
index ca1672e..0000000
--- a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql
+++ /dev/null
@@ -1 +0,0 @@
-select region.*, customer.* from customer, region order by r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql b/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql
deleted file mode 100644
index fd44916..0000000
--- a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql
+++ /dev/null
@@ -1 +0,0 @@
-select * from customer, region order by c_custkey,c_name,r_regionkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql b/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql
deleted file mode 100644
index fc5b1c3..0000000
--- a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql
+++ /dev/null
@@ -1 +0,0 @@
-select length(r_comment) as len, *, c_custkey*10 from customer, region order by len,r_regionkey,r_name,c_custkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan
new file mode 100644
index 0000000..0fb22b3
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan
@@ -0,0 +1,76 @@
+explain
+-------------------------------
+SORT(2)
+  => 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)
+     => 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)}
+      SCAN(1) 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)}
+      SCAN(0) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+        => out schema: {(2) default.nation.n_name (TEXT), 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)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+-------------------------------------------------------------------------------
+|-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
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[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.region
+
+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)
+     => 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)}
+      SCAN(1) 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)}
+      SCAN(0) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+        => out schema: {(2) default.nation.n_name (TEXT), 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]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000003
+
+SORT(2)
+  => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
+   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)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan
new file mode 100644
index 0000000..4278681
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan
@@ -0,0 +1,103 @@
+explain
+-------------------------------
+SORT(2)
+  => 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)
+     => 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)}
+      SCAN(1) 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)}
+      SCAN(0) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+        => out schema: {(2) default.nation.n_name (TEXT), 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)}
+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)
+
+SCAN(0) on default.nation
+  => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+  => out schema: {(2) default.nation.n_name (TEXT), 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)
+
+SCAN(1) 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_000003 [INTERMEDIATE]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE)
+[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE)
+
+[Outgoing]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
+
+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)
+     => 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)}
+      SCAN(9) on eb_0000000000000_0000_000002
+        => 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(8) on eb_0000000000000_0000_000001
+        => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)}
+        => in schema: {(2) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000004 [ROOT]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000003
+
+SORT(2)
+  => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
+   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)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+=======================================================

http://git-wip-us.apache.org/repos/asf/tajo/blob/1a7c353c/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan
new file mode 100644
index 0000000..0fb22b3
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan
@@ -0,0 +1,76 @@
+explain
+-------------------------------
+SORT(2)
+  => 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)
+     => 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)}
+      SCAN(1) 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)}
+      SCAN(0) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+        => out schema: {(2) default.nation.n_name (TEXT), 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)}
+explain
+-------------------------------
+-------------------------------------------------------------------------------
+Execution Block Graph (TERMINAL - eb_0000000000000_0000_000005)
+-------------------------------------------------------------------------------
+|-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
+-------------------------------------------------------------------------------
+
+=======================================================
+Block Id: eb_0000000000000_0000_000003 [LEAF]
+=======================================================
+
+[Outgoing]
+[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.region
+
+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)
+     => 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)}
+      SCAN(1) 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)}
+      SCAN(0) on default.nation
+        => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4)
+        => out schema: {(2) default.nation.n_name (TEXT), 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]
+=======================================================
+
+[Incoming]
+[q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32)
+
+[Enforcers]
+ 0: sorted input=eb_0000000000000_0000_000003
+
+SORT(2)
+  => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc)
+   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)}
+
+=======================================================
+Block Id: eb_0000000000000_0000_000005 [TERMINAL]
+=======================================================